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.11 (Berkeley) 10/24/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 "../ufs/inode.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': 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 'i': { 177 register struct vnode *vp; 178 register struct inode *ip; 179 180 printf("Locked inodes\n"); 181 for (vp = vnode; vp < vnodeNVNODE; vp++) { 182 if (vp->v_tag != VT_UFS) 183 continue; 184 ip = VTOI(vp); 185 if ((ip->i_flag & ILOCKED) == 0) 186 continue; 187 printf("inode %d dev 0x%x type %d\n", ip->i_number, 188 ip->i_dev, ITOV(ip)->v_type); 189 } 190 break; 191 } 192 193 case 'k': 194 panic("kdb requested panic"); 195 /* NOTREACHED */ 196 197 case 'l': { 198 struct pte savemmap; 199 extern char vmmap[]; 200 201 savemmap = mmap[0]; 202 for (p = allproc; p; p = p->p_nxt) { 203 printf("%X pid %5d%c%5d %c ", p, p->p_pid, 204 p == (struct proc *)var[varchk('p')]? '*' : ' ', 205 p->p_ppid, 206 p->p_stat == SSLEEP ? 'S' : 207 p->p_stat == SRUN ? 'R': 208 p->p_stat == SIDL ? 'I': 209 p->p_stat == SSTOP ? 'T' : '?'); 210 if (p->p_wchan) 211 psymoff((long)p->p_wchan, ISYM, ""); 212 if ((p->p_flag & SLOAD) && p->p_addr) { 213 int i; 214 *(int *)mmap = *(int *)p->p_addr; 215 mtpr(TBIS, vmmap); 216 #define U ((struct user *)vmmap) 217 #ifdef not_until_uarea_completely_mapped 218 if (U->u_ttyp) 219 printf(" ctty %x ", U->u_ttyp); 220 #endif 221 printf(" %.8s ", U->u_comm); 222 #undef U 223 } 224 225 printc(EOR); 226 } 227 mmap[0] = savemmap; 228 mtpr(TBIS, vmmap); 229 break; 230 } 231 232 case 't': /* XXX - debug */ 233 if (adrflg) { 234 printf("dev state rawq canq outq lwat hwat\n"); 235 236 #define T ((struct tty *)adrval) 237 printf("%x %x %d %d %d %d %d\n", T->t_dev, 238 T->t_state, T->t_rawq.c_cc, 239 T->t_canq.c_cc, T->t_outq.c_cc, 240 T->t_lowat, T->t_hiwat); 241 printf(" &rawq &canq &outq &outq.c_cf &rawq.c_cf\n"); 242 printf(" %x %x %x %x %x \n", &T->t_rawq, 243 &T->t_canq, &T->t_outq, &T->t_outq.c_cf, 244 &T->t_rawq.c_cf); 245 #undef T 246 } 247 248 default: 249 error(BADMOD); 250 } 251 } 252 253 static 254 printregs(c) 255 { 256 register REGPTR p; 257 ADDR v; 258 259 for (p = reglist; p->rname; p++) { 260 if (c != 'R' && ishiddenreg(p)) 261 continue; 262 v = *p->rkern; 263 printf("%s%6t%R %16t", p->rname, v); 264 valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 265 printc(EOR); 266 } 267 printpc(); 268 } 269 270 getreg(regnam) 271 { 272 register REGPTR p; 273 register char *regptr; 274 char *olp; 275 276 olp = lp; 277 for (p = reglist; p->rname; p++) { 278 regptr = p->rname; 279 if (regnam == *regptr++) { 280 while (*regptr) 281 if (readchar() != *regptr++) { 282 --regptr; 283 break; 284 } 285 if (*regptr) 286 lp = olp; 287 else 288 return ((int)p->rkern); 289 } 290 } 291 lp = olp; 292 return (-1); 293 } 294 295 printpc() 296 { 297 298 psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); 299 printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); 300 printc(EOR); 301 } 302