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.5 (Berkeley) 12/15/86 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 argp = frame; 111 if (ntramp != 1) 112 while (narg) { 113 printf("%R", 114 get((off_t)(argp = nextarg(argp)), 115 DSP)); 116 if (--narg != 0) 117 printc(','); 118 } 119 printf(") at "); 120 psymoff((long)callpc, ISYM, "\n"); 121 122 if (modif=='C') { 123 while (localsym((long)frame)) { 124 word = get((off_t)localval, DSP); 125 printf("%8t%s:%10t", 126 cursym->n_un.n_name); 127 if (errflg) { 128 printf("?\n"); 129 errflg = 0; 130 } else 131 printf("%R\n", word); 132 } 133 } 134 if (ntramp != 1) { 135 callpc = getprevpc(frame); 136 lastframe = frame; 137 frame = getprevframe(frame); 138 } else 139 callpc = getsignalpc(lastframe); 140 if (!adrflg && !INSTACK(frame)) 141 break; 142 } 143 break; 144 145 /*print externals*/ 146 case 'e': case 'E': 147 for (sp = symtab; sp < esymtab; sp++) 148 if (sp->n_type==(N_DATA|N_EXT) || 149 sp->n_type==(N_BSS|N_EXT)) 150 printf("%s:%12t%R\n", sp->n_un.n_name, 151 get((off_t)sp->n_value, DSP)); 152 break; 153 154 /*print breakpoints*/ 155 case 'b': case 'B': 156 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 157 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 158 if (bkptr->flag) { 159 printf("%-8.8d",bkptr->count); 160 psymoff((long)bkptr->loc,ISYM,"%24t"); 161 comptr=bkptr->comm; 162 while (*comptr) 163 printc(*comptr++); 164 } 165 break; 166 167 case 'l': 168 for (p = allproc; p; p = p->p_nxt) { 169 printf("%X pid %5d %c", p, p->p_pid, 170 p->p_stat == SSLEEP ? 'S' : 171 p->p_stat == SRUN ? 'R': 172 p->p_stat == SIDL ? 'I': 173 p->p_stat == SSTOP ? 'T' : '?'); 174 if (p->p_wchan) { 175 printf(" wait "); 176 psymoff((long)p->p_wchan, ISYM, ""); 177 } 178 printc(EOR); 179 } 180 break; 181 182 default: 183 error(BADMOD); 184 } 185 } 186 187 static 188 printregs(c) 189 { 190 register REGPTR p; 191 ADDR v; 192 193 for (p = reglist; p->rname; p++) { 194 if (c != 'R' && ishiddenreg(p)) 195 continue; 196 v = *p->rkern; 197 printf("%s%6t%R %16t", p->rname, v); 198 valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 199 printc(EOR); 200 } 201 printpc(); 202 } 203 204 getreg(regnam) 205 { 206 register REGPTR p; 207 register char *regptr; 208 char *olp; 209 210 olp = lp; 211 for (p = reglist; p->rname; p++) { 212 regptr = p->rname; 213 if (regnam == *regptr++) { 214 while (*regptr) 215 if (readchar() != *regptr++) { 216 --regptr; 217 break; 218 } 219 if (*regptr) 220 lp = olp; 221 else 222 return ((int)p->rkern); 223 } 224 } 225 lp = olp; 226 return (-1); 227 } 228 229 printpc() 230 { 231 232 psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); 233 printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); 234 printc(EOR); 235 } 236