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