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