1 /* kdb_print.c 7.3 86/11/20 */ 2 3 #include "../kdb/defs.h" 4 5 char *BADRAD; 6 7 ADDR lastframe; 8 ADDR callpc; 9 10 char *BADMOD; 11 char *lp; 12 long maxpos; 13 int radix; 14 char lastc; 15 16 /* breakpoints */ 17 BKPTR bkpthead; 18 19 REGLIST reglist[] = { 20 "p2lr", &pcb.pcb_p2lr, "p2br", (int *)&pcb.pcb_p2br, 21 "p1lr", &pcb.pcb_p1lr, "p1br", (int *)&pcb.pcb_p1br, 22 "p0lr", &pcb.pcb_p0lr, "p0br", (int *)&pcb.pcb_p0br, 23 "ksp", &pcb.pcb_ksp, "hfs", &pcb.pcb_hfs, 24 "psl", &pcb.pcb_psl, "pc", &pcb.pcb_pc, 25 "ach", &pcb.pcb_ach, "acl", &pcb.pcb_acl, 26 "usp", &pcb.pcb_usp, "fp", &pcb.pcb_fp, 27 "r12", &pcb.pcb_r12, "r11", &pcb.pcb_r11, 28 "r10", &pcb.pcb_r10, "r9", &pcb.pcb_r9, 29 "r8", &pcb.pcb_r8, "r7", &pcb.pcb_r7, 30 "r6", &pcb.pcb_r6, "r5", &pcb.pcb_r5, 31 "r4", &pcb.pcb_r4, "r3", &pcb.pcb_r3, 32 "r2", &pcb.pcb_r2, "r1", &pcb.pcb_r1, 33 "r0", &pcb.pcb_r0, 34 0 35 }; 36 37 /* general printing routines ($) */ 38 39 printtrace(modif) 40 { 41 register narg, i; 42 register BKPTR bkptr; 43 register ADDR word; 44 register char *comptr; 45 register ADDR argp, frame; 46 register struct nlist *sp; 47 int stack, ntramp; 48 register struct proc *p; 49 extern struct proc *allproc; 50 51 if (cntflg==0) 52 cntval = -1; 53 switch (modif) { 54 55 case 'd': 56 if (adrflg) { 57 if (adrval < 2 || adrval > 16) 58 error(BADRAD); 59 radix = adrval; 60 } 61 printf("radix=%d base ten", radix); 62 break; 63 64 case 'w': case 'W': 65 printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 66 break; 67 68 case 's': case 'S': 69 printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 70 break; 71 72 case 'v': case 'V': 73 printf("variables\n"); 74 for (i=0;i<=35;i++) 75 if (var[i]) { 76 printc((i<=9 ? '0' : 'a'-10) + i); 77 printf(" = %R\n",var[i]); 78 } 79 break; 80 81 case 0: case '?': 82 if (p = (struct proc *)var[varchk('p')]) 83 printf("pid = %d\n", p->p_pid); 84 else 85 printf("in idle loop\n"); 86 printtrap(var[varchk('t')], var[varchk('c')]); 87 /* fall thru... */ 88 case 'r': case 'R': 89 printregs(modif); 90 return; 91 92 case 'c': case 'C': 93 if (adrflg) { 94 frame=adrval; 95 callpc=get(frame-8,DSP); 96 } else { 97 frame = pcb.pcb_fp; 98 callpc = pcb.pcb_pc; 99 } 100 lastframe=0; 101 ntramp = 0; 102 while (cntval-- && frame!=0) { 103 char *name; 104 105 chkerr(); 106 /* check for pc in pcb (signal trampoline code) */ 107 if (MAXSTOR < callpc && 108 callpc < MAXSTOR+ctob(UPAGES)) { 109 name = "sigtramp"; 110 ntramp++; 111 } else { 112 ntramp = 0; 113 findsym(callpc,ISYM); 114 if (cursym) 115 name = cursym->n_un.n_name; 116 else 117 name = "?"; 118 } 119 printf("%s(", name); 120 narg = ((get(frame-4, DSP)&0xffff)-4)/4; 121 argp = frame; 122 if (ntramp != 1) 123 for (;;) { 124 if (narg==0) 125 break; 126 printf("%R", get(argp += 4, DSP)); 127 if (--narg!=0) 128 printc(','); 129 } 130 printf(") at "); 131 psymoff(callpc, ISYM, "\n"); 132 133 if (modif=='C') { 134 while (localsym(frame,argp)) { 135 word=get(localval,DSP); 136 printf("%8t%s:%10t", 137 cursym->n_un.n_name); 138 if (errflg) { 139 printf("?\n"); 140 errflg=0; 141 } else 142 printf("%R\n",word); 143 } 144 } 145 if (ntramp != 1) { 146 callpc = get(frame-8, DSP); 147 lastframe = frame; 148 frame = get(frame, DSP)&ALIGN; 149 } else 150 callpc = get(lastframe+44, DSP); 151 if (frame == 0 || (!adrflg && !INSTACK(frame))) 152 break; 153 } 154 break; 155 156 /*print externals*/ 157 case 'e': case 'E': 158 for (sp = symtab; sp < esymtab; sp++) 159 if (sp->n_type==(N_DATA|N_EXT) || 160 sp->n_type==(N_BSS|N_EXT)) 161 printf("%s:%12t%R\n", sp->n_un.n_name, 162 get(sp->n_value,DSP)); 163 break; 164 165 /*print breakpoints*/ 166 case 'b': case 'B': 167 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 168 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 169 if (bkptr->flag) { 170 printf("%-8.8d",bkptr->count); 171 psymoff(bkptr->loc,ISYM,"%24t"); 172 comptr=bkptr->comm; 173 while (*comptr) 174 printc(*comptr++); 175 } 176 break; 177 178 case 'l': 179 for (p = allproc; p; p = p->p_nxt) { 180 printf("%X pid %5d %c", p, p->p_pid, 181 p->p_stat == SSLEEP ? 'S' : 182 p->p_stat == SRUN ? 'R': 183 p->p_stat == SIDL ? 'I': 184 p->p_stat == SSTOP ? 'T' : '?'); 185 if (p->p_wchan) { 186 printf(" wait "); 187 psymoff(p->p_wchan, ISYM, ""); 188 } 189 printc(EOR); 190 } 191 break; 192 193 default: 194 error(BADMOD); 195 } 196 } 197 198 static 199 printregs(c) 200 { 201 register REGPTR p; 202 ADDR v; 203 204 for (p=reglist; p->rname; p++) { 205 if (c!='R' && p->rkern!=&pcb.pcb_psl) 206 continue; 207 c = 'R'; 208 v = *p->rkern; 209 printf("%s%6t%R %16t", p->rname, v); 210 valpr(v,(p->rkern==&pcb.pcb_pc?ISYM:DSYM)); 211 printc(EOR); 212 } 213 printpc(); 214 } 215 216 getreg(regnam) 217 { 218 register REGPTR p; 219 register char *regptr; 220 char *olp; 221 222 olp=lp; 223 for (p=reglist; p->rname; p++) { 224 regptr=p->rname; 225 if (regnam == *regptr++) { 226 while (*regptr) 227 if (readchar() != *regptr++) { 228 --regptr; 229 break; 230 } 231 if (*regptr) 232 lp=olp; 233 else 234 return((int)p->rkern); 235 } 236 } 237 lp=olp; 238 return (-1); 239 } 240 241 printpc() 242 { 243 244 psymoff(pcb.pcb_pc, ISYM, ":%16t"); 245 printins(ISP, chkget(pcb.pcb_pc, ISP)); 246 printc(EOR); 247 } 248