1 /* kdb_print.c 7.2 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 49 if (cntflg==0) 50 cntval = -1; 51 switch (modif) { 52 53 case 'd': 54 if (adrflg) { 55 if (adrval < 2 || adrval > 16) 56 error(BADRAD); 57 radix = adrval; 58 } 59 printf("radix=%d base ten", radix); 60 break; 61 62 case 'w': case 'W': 63 printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 64 break; 65 66 case 's': case 'S': 67 printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 68 break; 69 70 case 'v': case 'V': 71 printf("variables\n"); 72 for (i=0;i<=35;i++) 73 if (var[i]) { 74 printc((i<=9 ? '0' : 'a'-10) + i); 75 printf(" = %R\n",var[i]); 76 } 77 break; 78 79 case 0: case '?': 80 case 'r': case 'R': 81 printregs(modif); 82 return; 83 84 case 'c': case 'C': 85 if (adrflg) { 86 frame=adrval; 87 callpc=get(frame-8,DSP); 88 } else { 89 frame = pcb.pcb_fp; 90 callpc = pcb.pcb_pc; 91 } 92 lastframe=0; 93 ntramp = 0; 94 while (cntval-- && frame!=0) { 95 char *name; 96 97 chkerr(); 98 /* check for pc in pcb (signal trampoline code) */ 99 if (MAXSTOR < callpc && 100 callpc < MAXSTOR+ctob(UPAGES)) { 101 name = "sigtramp"; 102 ntramp++; 103 } else { 104 ntramp = 0; 105 findsym(callpc,ISYM); 106 if (cursym) 107 name = cursym->n_un.n_name; 108 else 109 name = "?"; 110 } 111 printf("%s(", name); 112 narg = ((get(frame-4, DSP)&0xffff)-4)/4; 113 argp = frame; 114 if (ntramp != 1) 115 for (;;) { 116 if (narg==0) 117 break; 118 printf("%R", get(argp += 4, DSP)); 119 if (--narg!=0) 120 printc(','); 121 } 122 printf(") at "); 123 psymoff(callpc, ISYM, "\n"); 124 125 if (modif=='C') { 126 while (localsym(frame,argp)) { 127 word=get(localval,DSP); 128 printf("%8t%s:%10t", 129 cursym->n_un.n_name); 130 if (errflg) { 131 printf("?\n"); 132 errflg=0; 133 } else 134 printf("%R\n",word); 135 } 136 } 137 if (ntramp != 1) { 138 callpc = get(frame-8, DSP); 139 lastframe = frame; 140 frame = get(frame, DSP)&ALIGN; 141 } else 142 callpc = get(lastframe+44, DSP); 143 if (frame == 0 || (!adrflg && !INSTACK(frame))) 144 break; 145 } 146 break; 147 148 /*print externals*/ 149 case 'e': case 'E': 150 for (sp = symtab; sp < esymtab; sp++) 151 if (sp->n_type==(N_DATA|N_EXT) || 152 sp->n_type==(N_BSS|N_EXT)) 153 printf("%s:%12t%R\n", sp->n_un.n_name, 154 get(sp->n_value,DSP)); 155 break; 156 157 /*print breakpoints*/ 158 case 'b': case 'B': 159 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 160 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 161 if (bkptr->flag) { 162 printf("%-8.8d",bkptr->count); 163 psymoff(bkptr->loc,ISYM,"%24t"); 164 comptr=bkptr->comm; 165 while (*comptr) 166 printc(*comptr++); 167 } 168 break; 169 170 case 'l': { 171 register struct proc *p; 172 extern struct proc *allproc; 173 174 for (p = allproc; p; p = p->p_nxt) { 175 printf("%X pid %5d %c", p, p->p_pid, 176 p->p_stat == SSLEEP ? 'S' : 177 p->p_stat == SRUN ? 'R': 178 p->p_stat == SIDL ? 'I': 179 p->p_stat == SSTOP ? 'T' : '?'); 180 if (p->p_wchan) { 181 printf(" wait "); 182 psymoff(p->p_wchan, ISYM, ""); 183 } 184 printc(EOR); 185 } 186 break; 187 } 188 189 default: 190 error(BADMOD); 191 } 192 } 193 194 static 195 printregs(c) 196 { 197 register REGPTR p; 198 ADDR v; 199 200 for (p=reglist; p->rname; p++) { 201 if (c!='R' && p->rkern!=&pcb.pcb_psl) 202 continue; 203 c = 'R'; 204 v = *p->rkern; 205 printf("%s%6t%R %16t", p->rname, v); 206 valpr(v,(p->rkern==&pcb.pcb_pc?ISYM:DSYM)); 207 printc(EOR); 208 } 209 printpc(); 210 } 211 212 getreg(regnam) 213 { 214 register REGPTR p; 215 register char *regptr; 216 char *olp; 217 218 olp=lp; 219 for (p=reglist; p->rname; p++) { 220 regptr=p->rname; 221 if (regnam == *regptr++) { 222 while (*regptr) 223 if (readchar() != *regptr++) { 224 --regptr; 225 break; 226 } 227 if (*regptr) 228 lp=olp; 229 else 230 return((int)p->rkern); 231 } 232 } 233 lp=olp; 234 return (-1); 235 } 236 237 printpc() 238 { 239 240 psymoff(pcb.pcb_pc, ISYM, ":%16t"); 241 printins(ISP, chkget(pcb.pcb_pc, ISP)); 242 printc(EOR); 243 } 244