1*30136Ssam /* kdb_print.c 7.4 86/11/23 */ 230111Ssam 330111Ssam #include "../kdb/defs.h" 430111Ssam 530122Ssam char *BADRAD; 630122Ssam 730111Ssam ADDR lastframe; 830111Ssam ADDR callpc; 930111Ssam 1030111Ssam char *BADMOD; 1130111Ssam char *lp; 1230111Ssam long maxpos; 1330111Ssam int radix; 1430111Ssam char lastc; 1530111Ssam 1630111Ssam /* breakpoints */ 1730111Ssam BKPTR bkpthead; 1830111Ssam 19*30136Ssam extern REGLIST reglist[]; 2030111Ssam 2130111Ssam /* general printing routines ($) */ 2230111Ssam 2330111Ssam printtrace(modif) 2430111Ssam { 2530111Ssam register narg, i; 2630111Ssam register BKPTR bkptr; 2730111Ssam register ADDR word; 2830111Ssam register char *comptr; 2930111Ssam register ADDR argp, frame; 3030111Ssam register struct nlist *sp; 3130111Ssam int stack, ntramp; 3230127Ssam register struct proc *p; 3330127Ssam extern struct proc *allproc; 3430111Ssam 3530111Ssam if (cntflg==0) 3630111Ssam cntval = -1; 3730111Ssam switch (modif) { 3830111Ssam 3930111Ssam case 'd': 4030111Ssam if (adrflg) { 4130122Ssam if (adrval < 2 || adrval > 16) 4230122Ssam error(BADRAD); 4330122Ssam radix = adrval; 4430111Ssam } 4530122Ssam printf("radix=%d base ten", radix); 4630111Ssam break; 4730111Ssam 4830111Ssam case 'w': case 'W': 4930122Ssam printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 5030111Ssam break; 5130111Ssam 5230111Ssam case 's': case 'S': 5330122Ssam printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 5430111Ssam break; 5530111Ssam 5630111Ssam case 'v': case 'V': 5730111Ssam printf("variables\n"); 5830111Ssam for (i=0;i<=35;i++) 5930111Ssam if (var[i]) { 6030111Ssam printc((i<=9 ? '0' : 'a'-10) + i); 6130111Ssam printf(" = %R\n",var[i]); 6230111Ssam } 6330111Ssam break; 6430111Ssam 6530111Ssam case 0: case '?': 6630127Ssam if (p = (struct proc *)var[varchk('p')]) 6730127Ssam printf("pid = %d\n", p->p_pid); 6830127Ssam else 6930127Ssam printf("in idle loop\n"); 7030127Ssam printtrap(var[varchk('t')], var[varchk('c')]); 7130127Ssam /* fall thru... */ 7230111Ssam case 'r': case 'R': 7330111Ssam printregs(modif); 7430111Ssam return; 7530111Ssam 7630111Ssam case 'c': case 'C': 7730111Ssam if (adrflg) { 78*30136Ssam frame = adrval; 79*30136Ssam callpc = getprevpc(frame); 8030111Ssam } else { 8130111Ssam frame = pcb.pcb_fp; 8230111Ssam callpc = pcb.pcb_pc; 8330111Ssam } 84*30136Ssam lastframe = NOFRAME; 8530111Ssam ntramp = 0; 86*30136Ssam while (cntval-- && frame != NOFRAME) { 8730111Ssam char *name; 8830111Ssam 8930111Ssam chkerr(); 9030111Ssam /* check for pc in pcb (signal trampoline code) */ 91*30136Ssam if (issignalpc(callpc)) { 9230111Ssam name = "sigtramp"; 9330111Ssam ntramp++; 9430111Ssam } else { 9530111Ssam ntramp = 0; 96*30136Ssam findsym(callpc, ISYM); 9730111Ssam if (cursym) 9830111Ssam name = cursym->n_un.n_name; 9930111Ssam else 10030111Ssam name = "?"; 10130111Ssam } 10230111Ssam printf("%s(", name); 103*30136Ssam narg = getnargs(frame); 10430111Ssam argp = frame; 10530111Ssam if (ntramp != 1) 106*30136Ssam while (narg) { 107*30136Ssam printf("%R", 108*30136Ssam get(argp = nextarg(argp), DSP)); 109*30136Ssam if (--narg != 0) 11030111Ssam printc(','); 11130111Ssam } 11230111Ssam printf(") at "); 11330111Ssam psymoff(callpc, ISYM, "\n"); 11430111Ssam 11530111Ssam if (modif=='C') { 116*30136Ssam while (localsym(frame, argp)) { 117*30136Ssam word = get(localval, DSP); 11830111Ssam printf("%8t%s:%10t", 11930111Ssam cursym->n_un.n_name); 12030111Ssam if (errflg) { 12130111Ssam printf("?\n"); 122*30136Ssam errflg = 0; 12330111Ssam } else 124*30136Ssam printf("%R\n", word); 12530111Ssam } 12630111Ssam } 12730111Ssam if (ntramp != 1) { 128*30136Ssam callpc = getprevpc(frame); 12930111Ssam lastframe = frame; 130*30136Ssam frame = getprevframe(frame); 13130111Ssam } else 132*30136Ssam callpc = getsignalpc(lastframe); 133*30136Ssam if (!adrflg && !INSTACK(frame)) 13430111Ssam break; 13530111Ssam } 13630111Ssam break; 13730111Ssam 13830111Ssam /*print externals*/ 13930111Ssam case 'e': case 'E': 14030111Ssam for (sp = symtab; sp < esymtab; sp++) 14130111Ssam if (sp->n_type==(N_DATA|N_EXT) || 14230111Ssam sp->n_type==(N_BSS|N_EXT)) 14330111Ssam printf("%s:%12t%R\n", sp->n_un.n_name, 14430111Ssam get(sp->n_value,DSP)); 14530111Ssam break; 14630111Ssam 14730111Ssam /*print breakpoints*/ 14830111Ssam case 'b': case 'B': 14930111Ssam printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 15030111Ssam for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 15130111Ssam if (bkptr->flag) { 15230111Ssam printf("%-8.8d",bkptr->count); 15330111Ssam psymoff(bkptr->loc,ISYM,"%24t"); 15430111Ssam comptr=bkptr->comm; 15530111Ssam while (*comptr) 15630111Ssam printc(*comptr++); 15730111Ssam } 15830111Ssam break; 15930111Ssam 16030127Ssam case 'l': 16130111Ssam for (p = allproc; p; p = p->p_nxt) { 16230111Ssam printf("%X pid %5d %c", p, p->p_pid, 16330111Ssam p->p_stat == SSLEEP ? 'S' : 16430111Ssam p->p_stat == SRUN ? 'R': 16530111Ssam p->p_stat == SIDL ? 'I': 16630111Ssam p->p_stat == SSTOP ? 'T' : '?'); 16730111Ssam if (p->p_wchan) { 16830111Ssam printf(" wait "); 16930111Ssam psymoff(p->p_wchan, ISYM, ""); 17030111Ssam } 17130111Ssam printc(EOR); 17230111Ssam } 17330111Ssam break; 17430111Ssam 17530111Ssam default: 17630111Ssam error(BADMOD); 17730111Ssam } 17830111Ssam } 17930111Ssam 18030111Ssam static 18130111Ssam printregs(c) 18230111Ssam { 18330111Ssam register REGPTR p; 18430111Ssam ADDR v; 18530111Ssam 186*30136Ssam for (p = reglist; p->rname; p++) { 187*30136Ssam if (c != 'R' && ishiddenreg(p)) 18830111Ssam continue; 18930111Ssam v = *p->rkern; 19030111Ssam printf("%s%6t%R %16t", p->rname, v); 191*30136Ssam valpr(v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 19230111Ssam printc(EOR); 19330111Ssam } 19430111Ssam printpc(); 19530111Ssam } 19630111Ssam 19730111Ssam getreg(regnam) 19830111Ssam { 19930111Ssam register REGPTR p; 20030111Ssam register char *regptr; 20130111Ssam char *olp; 20230111Ssam 203*30136Ssam olp = lp; 204*30136Ssam for (p = reglist; p->rname; p++) { 205*30136Ssam regptr = p->rname; 20630111Ssam if (regnam == *regptr++) { 20730111Ssam while (*regptr) 20830111Ssam if (readchar() != *regptr++) { 20930111Ssam --regptr; 21030111Ssam break; 21130111Ssam } 21230111Ssam if (*regptr) 213*30136Ssam lp = olp; 21430111Ssam else 215*30136Ssam return ((int)p->rkern); 21630111Ssam } 21730111Ssam } 218*30136Ssam lp = olp; 21930111Ssam return (-1); 22030111Ssam } 22130111Ssam 22230111Ssam printpc() 22330111Ssam { 22430111Ssam 22530111Ssam psymoff(pcb.pcb_pc, ISYM, ":%16t"); 22630111Ssam printins(ISP, chkget(pcb.pcb_pc, ISP)); 22730111Ssam printc(EOR); 22830111Ssam } 229