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