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