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