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.15 (Berkeley) 01/15/90 7 */ 8 9 #include "machine/mtpr.h" 10 #undef ISP 11 #include "../kdb/defs.h" 12 #undef CTRL 13 #include "ioctl.h" 14 #include "tty.h" 15 #include "vnode.h" 16 #include "mount.h" 17 18 char *BADRAD; 19 20 ADDR lastframe; 21 ADDR callpc; 22 23 char *BADMOD; 24 char *lp; 25 long maxpos; 26 int radix; 27 char lastc; 28 29 /* breakpoints */ 30 BKPTR bkpthead; 31 32 extern REGLIST reglist[]; 33 34 /* general printing routines ($) */ 35 36 printtrace(modif) 37 { 38 register narg, i; 39 register BKPTR bkptr; 40 register ADDR word; 41 register char *comptr; 42 register ADDR argp, frame; 43 register struct nlist *sp; 44 int ntramp; 45 register struct proc *p; 46 extern struct proc *allproc; 47 48 if (cntflg==0) 49 cntval = -1; 50 switch (modif) { 51 52 case 'd': 53 if (adrflg) { 54 if (adrval < 2 || adrval > 16) 55 error(BADRAD); 56 radix = adrval; 57 } 58 printf("radix=%d base ten", radix); 59 break; 60 61 case 'w': case 'W': 62 printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 63 break; 64 65 case 's': case 'S': 66 printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 67 break; 68 69 case 'V': 70 printf("variables\n"); 71 for (i=0;i<=35;i++) 72 if (var[i]) { 73 printc((i<=9 ? '0' : 'a'-10) + i); 74 printf(" = %R\n",var[i]); 75 } 76 break; 77 78 case 0: case '?': 79 if (p = (struct proc *)var[varchk('p')]) 80 printf("pid = %d\n", p->p_pid); 81 else 82 printf("in idle loop\n"); 83 printtrap(var[varchk('t')], var[varchk('c')]); 84 /* fall thru... */ 85 case 'r': case 'R': 86 printregs(modif); 87 return; 88 89 case 'c': case 'C': 90 if (adrflg) { 91 frame = adrval; 92 callpc = getprevpc(frame); 93 } else { 94 frame = pcb.pcb_fp; 95 callpc = pcb.pcb_pc; 96 } 97 lastframe = NOFRAME; 98 ntramp = 0; 99 while (cntval-- && frame != NOFRAME) { 100 char *name; 101 102 chkerr(); 103 /* check for pc in pcb (signal trampoline code) */ 104 if (issignalpc(callpc)) { 105 name = "sigtramp"; 106 ntramp++; 107 } else { 108 ntramp = 0; 109 (void) findsym((long)callpc, ISYM); 110 if (cursym) 111 name = cursym->n_un.n_name; 112 else 113 name = "?"; 114 } 115 printf("%s(", name); 116 narg = getnargs(frame); 117 if (narg > 10) 118 narg = 10; 119 argp = frame; 120 if (ntramp != 1) 121 while (narg) { 122 printf("%R", 123 get((off_t)(argp = nextarg(argp)), 124 DSP)); 125 if (--narg != 0) 126 printc(','); 127 } 128 printf(") at "); 129 psymoff((long)callpc, ISYM, "\n"); 130 131 if (modif=='C') { 132 while (localsym((long)frame)) { 133 word = get((off_t)localval, DSP); 134 printf("%8t%s:%10t", 135 cursym->n_un.n_name); 136 if (errflg) { 137 printf("?\n"); 138 errflg = 0; 139 } else 140 printf("%R\n", word); 141 } 142 } 143 if (ntramp != 1) { 144 callpc = getprevpc(frame); 145 lastframe = frame; 146 frame = getprevframe(frame); 147 } else 148 callpc = getsignalpc(lastframe); 149 if (!adrflg && !INSTACK(frame)) 150 break; 151 } 152 break; 153 154 /*print externals*/ 155 case 'e': case 'E': 156 for (sp = symtab; sp < esymtab; sp++) 157 if (sp->n_type==(N_DATA|N_EXT) || 158 sp->n_type==(N_BSS|N_EXT)) 159 printf("%s:%12t%R\n", sp->n_un.n_name, 160 get((off_t)sp->n_value, DSP)); 161 break; 162 163 /*print breakpoints*/ 164 case 'b': case 'B': 165 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 166 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 167 if (bkptr->flag) { 168 printf("%-8.8d",bkptr->count); 169 psymoff((long)bkptr->loc,ISYM,"%24t"); 170 comptr=bkptr->comm; 171 while (*comptr) 172 printc(*comptr++); 173 } 174 break; 175 176 case 'k': 177 panic("kdb requested panic"); 178 /* NOTREACHED */ 179 180 case 'l': { 181 struct pte savemmap; 182 extern char vmmap[]; 183 184 savemmap = mmap[0]; 185 for (p = allproc; p; p = p->p_nxt) { 186 printf("%X pid %5d%c%5d %c ", p, p->p_pid, 187 p == (struct proc *)var[varchk('p')]? '*' : ' ', 188 p->p_ppid, 189 p->p_stat == SSLEEP ? 'S' : 190 p->p_stat == SRUN ? 'R': 191 p->p_stat == SIDL ? 'I': 192 p->p_stat == SSTOP ? 'T' : '?'); 193 if (p->p_wchan) 194 psymoff((long)p->p_wchan, ISYM, ""); 195 if ((p->p_flag & SLOAD) && p->p_addr) { 196 int i; 197 *(int *)mmap = *(int *)p->p_addr; 198 mtpr(TBIS, vmmap); 199 #define U ((struct user *)vmmap) 200 #ifdef not_until_uarea_completely_mapped 201 if (U->u_ttyp) 202 printf(" ctty %x ", U->u_ttyp); 203 #endif 204 printf(" %.8s ", U->u_comm); 205 #undef U 206 } 207 208 printc(EOR); 209 } 210 mmap[0] = savemmap; 211 mtpr(TBIS, vmmap); 212 break; 213 } 214 215 case 't': /* XXX - debug */ 216 if (adrflg) { 217 printf("dev state rawq canq outq lwat hwat\n"); 218 219 #define T ((struct tty *)adrval) 220 printf("%x %x %d %d %d %d %d\n", T->t_dev, 221 T->t_state, T->t_rawq.c_cc, 222 T->t_canq.c_cc, T->t_outq.c_cc, 223 T->t_lowat, T->t_hiwat); 224 printf(" &rawq &canq &outq &outq.c_cf &rawq.c_cf\n"); 225 printf(" %x %x %x %x %x \n", &T->t_rawq, 226 &T->t_canq, &T->t_outq, &T->t_outq.c_cf, 227 &T->t_rawq.c_cf); 228 #undef T 229 } 230 231 case 'v': { 232 register struct mount *mp; 233 register struct vnode *vp; 234 235 printf("Locked vnodes\n"); 236 mp = rootfs; 237 do { 238 for (vp = mp->m_mounth; vp; vp = vp->v_mountf) 239 if (VOP_ISLOCKED(vp)) 240 vprint((char *)0, vp); 241 mp = mp->m_next; 242 } while (mp != rootfs); 243 break; 244 } 245 246 default: 247 error(BADMOD); 248 } 249 } 250 251 static 252 printregs(c) 253 { 254 register REGPTR p; 255 ADDR v; 256 257 for (p = reglist; p->rname; p++) { 258 if (c != 'R' && ishiddenreg(p)) 259 continue; 260 v = *p->rkern; 261 printf("%s%6t%R %16t", p->rname, v); 262 valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 263 printc(EOR); 264 } 265 printpc(); 266 } 267 268 getreg(regnam) 269 { 270 register REGPTR p; 271 register char *regptr; 272 char *olp; 273 274 olp = lp; 275 for (p = reglist; p->rname; p++) { 276 regptr = p->rname; 277 if (regnam == *regptr++) { 278 while (*regptr) 279 if (readchar() != *regptr++) { 280 --regptr; 281 break; 282 } 283 if (*regptr) 284 lp = olp; 285 else 286 return ((int)p->rkern); 287 } 288 } 289 lp = olp; 290 return (-1); 291 } 292 293 printpc() 294 { 295 296 psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); 297 printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); 298 printc(EOR); 299 } 300