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