1*30296Ssam /* 2*30296Ssam * Copyright (c) 1986 Regents of the University of California. 3*30296Ssam * All rights reserved. The Berkeley software License Agreement 4*30296Ssam * specifies the terms and conditions for redistribution. 5*30296Ssam * 6*30296Ssam * @(#)kdb_print.c 7.5 (Berkeley) 12/15/86 7*30296Ssam */ 830111Ssam 930111Ssam #include "../kdb/defs.h" 1030111Ssam 1130122Ssam char *BADRAD; 1230122Ssam 1330111Ssam ADDR lastframe; 1430111Ssam ADDR callpc; 1530111Ssam 1630111Ssam char *BADMOD; 1730111Ssam char *lp; 1830111Ssam long maxpos; 1930111Ssam int radix; 2030111Ssam char lastc; 2130111Ssam 2230111Ssam /* breakpoints */ 2330111Ssam BKPTR bkpthead; 2430111Ssam 2530136Ssam extern REGLIST reglist[]; 2630111Ssam 2730111Ssam /* general printing routines ($) */ 2830111Ssam 2930111Ssam printtrace(modif) 3030111Ssam { 3130111Ssam register narg, i; 3230111Ssam register BKPTR bkptr; 3330111Ssam register ADDR word; 3430111Ssam register char *comptr; 3530111Ssam register ADDR argp, frame; 3630111Ssam register struct nlist *sp; 37*30296Ssam int ntramp; 3830127Ssam register struct proc *p; 3930127Ssam extern struct proc *allproc; 4030111Ssam 4130111Ssam if (cntflg==0) 4230111Ssam cntval = -1; 4330111Ssam switch (modif) { 4430111Ssam 4530111Ssam case 'd': 4630111Ssam if (adrflg) { 4730122Ssam if (adrval < 2 || adrval > 16) 4830122Ssam error(BADRAD); 4930122Ssam radix = adrval; 5030111Ssam } 5130122Ssam printf("radix=%d base ten", radix); 5230111Ssam break; 5330111Ssam 5430111Ssam case 'w': case 'W': 5530122Ssam printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); 5630111Ssam break; 5730111Ssam 5830111Ssam case 's': case 'S': 5930122Ssam printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); 6030111Ssam break; 6130111Ssam 6230111Ssam case 'v': case 'V': 6330111Ssam printf("variables\n"); 6430111Ssam for (i=0;i<=35;i++) 6530111Ssam if (var[i]) { 6630111Ssam printc((i<=9 ? '0' : 'a'-10) + i); 6730111Ssam printf(" = %R\n",var[i]); 6830111Ssam } 6930111Ssam break; 7030111Ssam 7130111Ssam case 0: case '?': 7230127Ssam if (p = (struct proc *)var[varchk('p')]) 7330127Ssam printf("pid = %d\n", p->p_pid); 7430127Ssam else 7530127Ssam printf("in idle loop\n"); 7630127Ssam printtrap(var[varchk('t')], var[varchk('c')]); 7730127Ssam /* fall thru... */ 7830111Ssam case 'r': case 'R': 7930111Ssam printregs(modif); 8030111Ssam return; 8130111Ssam 8230111Ssam case 'c': case 'C': 8330111Ssam if (adrflg) { 8430136Ssam frame = adrval; 8530136Ssam callpc = getprevpc(frame); 8630111Ssam } else { 8730111Ssam frame = pcb.pcb_fp; 8830111Ssam callpc = pcb.pcb_pc; 8930111Ssam } 9030136Ssam lastframe = NOFRAME; 9130111Ssam ntramp = 0; 9230136Ssam while (cntval-- && frame != NOFRAME) { 9330111Ssam char *name; 9430111Ssam 9530111Ssam chkerr(); 9630111Ssam /* check for pc in pcb (signal trampoline code) */ 9730136Ssam if (issignalpc(callpc)) { 9830111Ssam name = "sigtramp"; 9930111Ssam ntramp++; 10030111Ssam } else { 10130111Ssam ntramp = 0; 102*30296Ssam (void) findsym((long)callpc, ISYM); 10330111Ssam if (cursym) 10430111Ssam name = cursym->n_un.n_name; 10530111Ssam else 10630111Ssam name = "?"; 10730111Ssam } 10830111Ssam printf("%s(", name); 10930136Ssam narg = getnargs(frame); 11030111Ssam argp = frame; 11130111Ssam if (ntramp != 1) 11230136Ssam while (narg) { 11330136Ssam printf("%R", 114*30296Ssam get((off_t)(argp = nextarg(argp)), 115*30296Ssam DSP)); 11630136Ssam if (--narg != 0) 11730111Ssam printc(','); 11830111Ssam } 11930111Ssam printf(") at "); 120*30296Ssam psymoff((long)callpc, ISYM, "\n"); 12130111Ssam 12230111Ssam if (modif=='C') { 123*30296Ssam while (localsym((long)frame)) { 124*30296Ssam word = get((off_t)localval, DSP); 12530111Ssam printf("%8t%s:%10t", 12630111Ssam cursym->n_un.n_name); 12730111Ssam if (errflg) { 12830111Ssam printf("?\n"); 12930136Ssam errflg = 0; 13030111Ssam } else 13130136Ssam printf("%R\n", word); 13230111Ssam } 13330111Ssam } 13430111Ssam if (ntramp != 1) { 13530136Ssam callpc = getprevpc(frame); 13630111Ssam lastframe = frame; 13730136Ssam frame = getprevframe(frame); 13830111Ssam } else 13930136Ssam callpc = getsignalpc(lastframe); 14030136Ssam if (!adrflg && !INSTACK(frame)) 14130111Ssam break; 14230111Ssam } 14330111Ssam break; 14430111Ssam 14530111Ssam /*print externals*/ 14630111Ssam case 'e': case 'E': 14730111Ssam for (sp = symtab; sp < esymtab; sp++) 14830111Ssam if (sp->n_type==(N_DATA|N_EXT) || 14930111Ssam sp->n_type==(N_BSS|N_EXT)) 15030111Ssam printf("%s:%12t%R\n", sp->n_un.n_name, 151*30296Ssam get((off_t)sp->n_value, DSP)); 15230111Ssam break; 15330111Ssam 15430111Ssam /*print breakpoints*/ 15530111Ssam case 'b': case 'B': 15630111Ssam printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 15730111Ssam for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 15830111Ssam if (bkptr->flag) { 15930111Ssam printf("%-8.8d",bkptr->count); 160*30296Ssam psymoff((long)bkptr->loc,ISYM,"%24t"); 16130111Ssam comptr=bkptr->comm; 16230111Ssam while (*comptr) 16330111Ssam printc(*comptr++); 16430111Ssam } 16530111Ssam break; 16630111Ssam 16730127Ssam case 'l': 16830111Ssam for (p = allproc; p; p = p->p_nxt) { 16930111Ssam printf("%X pid %5d %c", p, p->p_pid, 17030111Ssam p->p_stat == SSLEEP ? 'S' : 17130111Ssam p->p_stat == SRUN ? 'R': 17230111Ssam p->p_stat == SIDL ? 'I': 17330111Ssam p->p_stat == SSTOP ? 'T' : '?'); 17430111Ssam if (p->p_wchan) { 17530111Ssam printf(" wait "); 176*30296Ssam psymoff((long)p->p_wchan, ISYM, ""); 17730111Ssam } 17830111Ssam printc(EOR); 17930111Ssam } 18030111Ssam break; 18130111Ssam 18230111Ssam default: 18330111Ssam error(BADMOD); 18430111Ssam } 18530111Ssam } 18630111Ssam 18730111Ssam static 18830111Ssam printregs(c) 18930111Ssam { 19030111Ssam register REGPTR p; 19130111Ssam ADDR v; 19230111Ssam 19330136Ssam for (p = reglist; p->rname; p++) { 19430136Ssam if (c != 'R' && ishiddenreg(p)) 19530111Ssam continue; 19630111Ssam v = *p->rkern; 19730111Ssam printf("%s%6t%R %16t", p->rname, v); 198*30296Ssam valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); 19930111Ssam printc(EOR); 20030111Ssam } 20130111Ssam printpc(); 20230111Ssam } 20330111Ssam 20430111Ssam getreg(regnam) 20530111Ssam { 20630111Ssam register REGPTR p; 20730111Ssam register char *regptr; 20830111Ssam char *olp; 20930111Ssam 21030136Ssam olp = lp; 21130136Ssam for (p = reglist; p->rname; p++) { 21230136Ssam regptr = p->rname; 21330111Ssam if (regnam == *regptr++) { 21430111Ssam while (*regptr) 21530111Ssam if (readchar() != *regptr++) { 21630111Ssam --regptr; 21730111Ssam break; 21830111Ssam } 21930111Ssam if (*regptr) 22030136Ssam lp = olp; 22130111Ssam else 22230136Ssam return ((int)p->rkern); 22330111Ssam } 22430111Ssam } 22530136Ssam lp = olp; 22630111Ssam return (-1); 22730111Ssam } 22830111Ssam 22930111Ssam printpc() 23030111Ssam { 23130111Ssam 232*30296Ssam psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); 233*30296Ssam printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); 23430111Ssam printc(EOR); 23530111Ssam } 236