xref: /csrg-svn/sys/deprecated/kdb/kdb_print.c (revision 30296)
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