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