1 /* 2 * Copyright (c) 1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)kdb_print.c 7.6 (Berkeley) 04/25/89 7 */ 8 9 #include "../kdb/defs.h" 10 11 char *BADRAD; 12 13 ADDR lastframe; 14 ADDR callpc; 15 16 char *BADMOD; 17 char *lp; 18 long maxpos; 19 int radix; 20 char lastc; 21 22 /* breakpoints */ 23 BKPTR bkpthead; 24 25 extern REGLIST reglist[]; 26 27 /* general printing routines ($) */ 28 29 printtrace(modif) 30 { 31 register narg, i; 32 register BKPTR bkptr; 33 register ADDR word; 34 register char *comptr; 35 register ADDR argp, frame; 36 register struct nlist *sp; 37 int ntramp; 38 register struct proc *p; 39 extern struct proc *allproc; 40 41 if (cntflg==0) 42 cntval = -1; 43 switch (modif) { 44 45 case 'd': 46 if (adrflg) { 47 if (adrval < 2 || adrval > 16) 48 error(BADRAD); 49 radix = adrval; 50 } 51 printf("radix=%d base ten", radix); 52 break; 53 54 case 'w': case 'W': 55 printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 56 break; 57 58 case 's': case 'S': 59 printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 60 break; 61 62 case 'v': case 'V': 63 printf("variables\n"); 64 for (i=0;i<=35;i++) 65 if (var[i]) { 66 printc((i<=9 ? '0' : 'a'-10) + i); 67 printf(" = %R\n",var[i]); 68 } 69 break; 70 71 case 0: case '?': 72 if (p = (struct proc *)var[varchk('p')]) 73 printf("pid = %d\n", p->p_pid); 74 else 75 printf("in idle loop\n"); 76 printtrap(var[varchk('t')], var[varchk('c')]); 77 /* fall thru... */ 78 case 'r': case 'R': 79 printregs(modif); 80 return; 81 82 case 'c': case 'C': 83 if (adrflg) { 84 frame = adrval; 85 callpc = getprevpc(frame); 86 } else { 87 frame = pcb.pcb_fp; 88 callpc = pcb.pcb_pc; 89 } 90 lastframe = NOFRAME; 91 ntramp = 0; 92 while (cntval-- && frame != NOFRAME) { 93 char *name; 94 95 chkerr(); 96 /* check for pc in pcb (signal trampoline code) */ 97 if (issignalpc(callpc)) { 98 name = "sigtramp"; 99 ntramp++; 100 } else { 101 ntramp = 0; 102 (void) findsym((long)callpc, ISYM); 103 if (cursym) 104 name = cursym->n_un.n_name; 105 else 106 name = "?"; 107 } 108 printf("%s(", name); 109 narg = getnargs(frame); 110 if (narg > 10) 111 narg = 10; 112 argp = frame; 113 if (ntramp != 1) 114 while (narg) { 115 printf("%R", 116 get((off_t)(argp = nextarg(argp)), 117 DSP)); 118 if (--narg != 0) 119 printc(','); 120 } 121 printf(") at "); 122 psymoff((long)callpc, ISYM, "\n"); 123 124 if (modif=='C') { 125 while (localsym((long)frame)) { 126 word = get((off_t)localval, DSP); 127 printf("%8t%s:%10t", 128 cursym->n_un.n_name); 129 if (errflg) { 130 printf("?\n"); 131 errflg = 0; 132 } else 133 printf("%R\n", word); 134 } 135 } 136 if (ntramp != 1) { 137 callpc = getprevpc(frame); 138 lastframe = frame; 139 frame = getprevframe(frame); 140 } else 141 callpc = getsignalpc(lastframe); 142 if (!adrflg && !INSTACK(frame)) 143 break; 144 } 145 break; 146 147 /*print externals*/ 148 case 'e': case 'E': 149 for (sp = symtab; sp < esymtab; sp++) 150 if (sp->n_type==(N_DATA|N_EXT) || 151 sp->n_type==(N_BSS|N_EXT)) 152 printf("%s:%12t%R\n", sp->n_un.n_name, 153 get((off_t)sp->n_value, DSP)); 154 break; 155 156 /*print breakpoints*/ 157 case 'b': case 'B': 158 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 159 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 160 if (bkptr->flag) { 161 printf("%-8.8d",bkptr->count); 162 psymoff((long)bkptr->loc,ISYM,"%24t"); 163 comptr=bkptr->comm; 164 while (*comptr) 165 printc(*comptr++); 166 } 167 break; 168 169 case 'l': 170 for (p = allproc; p; p = p->p_nxt) { 171 printf("%X pid %5d %c", p, p->p_pid, 172 p->p_stat == SSLEEP ? 'S' : 173 p->p_stat == SRUN ? 'R': 174 p->p_stat == SIDL ? 'I': 175 p->p_stat == SSTOP ? 'T' : '?'); 176 if (p->p_wchan) { 177 printf(" wait "); 178 psymoff((long)p->p_wchan, ISYM, ""); 179 } 180 printc(EOR); 181 } 182 break; 183 184 default: 185 error(BADMOD); 186 } 187 } 188 189 static 190 printregs(c) 191 { 192 register REGPTR p; 193 ADDR v; 194 195 for (p = reglist; p->rname; p++) { 196 if (c != 'R' && ishiddenreg(p)) 197 continue; 198 v = *p->rkern; 199 printf("%s%6t%R %16t", p->rname, v); 200 valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 201 printc(EOR); 202 } 203 printpc(); 204 } 205 206 getreg(regnam) 207 { 208 register REGPTR p; 209 register char *regptr; 210 char *olp; 211 212 olp = lp; 213 for (p = reglist; p->rname; p++) { 214 regptr = p->rname; 215 if (regnam == *regptr++) { 216 while (*regptr) 217 if (readchar() != *regptr++) { 218 --regptr; 219 break; 220 } 221 if (*regptr) 222 lp = olp; 223 else 224 return ((int)p->rkern); 225 } 226 } 227 lp = olp; 228 return (-1); 229 } 230 231 printpc() 232 { 233 234 psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); 235 printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); 236 printc(EOR); 237 } 238