xref: /csrg-svn/old/adb/adb.tahoe/print.c (revision 29663)
126422Ssam #ifndef lint
2*29663Ssam static	char sccsid[] = "@(#)print.c	1.2 (Berkeley) 07/25/86";
326422Ssam #endif
426422Ssam /*
526422Ssam  *
626422Ssam  *	UNIX debugger
726422Ssam  *
826422Ssam  */
926422Ssam #include "defs.h"
1026422Ssam 
1126422Ssam MSG		LONGFIL;
1226422Ssam MSG		NOTOPEN;
1326422Ssam MSG		BADMOD;
1426422Ssam 
1526422Ssam MAP		txtmap;
1626422Ssam MAP		datmap;
1726422Ssam 
1826422Ssam ADDR		lastframe;
1926422Ssam ADDR		callpc;
2026422Ssam 
2126422Ssam INT		infile;
2226422Ssam INT		outfile;
2326422Ssam CHAR		*lp;
2426422Ssam ADDR		maxoff;
2526422Ssam L_INT		maxpos;
2626422Ssam INT		radix;
2726422Ssam 
2826422Ssam /* symbol management */
2926422Ssam ADDR		localval;
3026422Ssam 
3126422Ssam /* breakpoints */
3226422Ssam BKPTR		bkpthead;
3326422Ssam 
3426422Ssam REGLIST reglist[] = {
3526422Ssam 	"p2lr",	P2LR,	&pcb.pcb_p2lr,
3626422Ssam 	"p2br",	P2BR,	(int *)&pcb.pcb_p2br,
3726422Ssam 	"p0lr",	P0LR,	&pcb.pcb_p0lr,
3826422Ssam 	"p0br",	P0BR,	(int *)&pcb.pcb_p0br,
3926422Ssam 	"ksp",	KSP,	&pcb.pcb_ksp,
4026422Ssam 	"hfs",	HFS,	&pcb.pcb_hfs,
4126422Ssam 	"psl",	PSL,	&pcb.pcb_psl,
4226422Ssam 	"pc",	PC,	&pcb.pcb_pc,
4326422Ssam 	"ach",	ACHI,	&pcb.pcb_ach,
4426422Ssam 	"acl",	ACLO,	&pcb.pcb_acl,
4526422Ssam 	"usp",	USP,	&pcb.pcb_usp,
4626422Ssam 	"fp",	FP,	&pcb.pcb_fp,
4726422Ssam 	"r12",	R12,	&pcb.pcb_r12,
4826422Ssam 	"r11",	R11,	&pcb.pcb_r11,
4926422Ssam 	"r10",	R10,	&pcb.pcb_r10,
5026422Ssam 	"r9",	R9,	&pcb.pcb_r9,
5126422Ssam 	"r8",	R8,	&pcb.pcb_r8,
5226422Ssam 	"r7",	R7,	&pcb.pcb_r7,
5326422Ssam 	"r6",	R6,	&pcb.pcb_r6,
5426422Ssam 	"r5",	R5,	&pcb.pcb_r5,
5526422Ssam 	"r4",	R4,	&pcb.pcb_r4,
5626422Ssam 	"r3",	R3,	&pcb.pcb_r3,
5726422Ssam 	"r2",	R2,	&pcb.pcb_r2,
5826422Ssam 	"r1",	R1,	&pcb.pcb_r1,
5926422Ssam 	"r0",	R0,	&pcb.pcb_r0,
6026422Ssam 	0
6126422Ssam };
6226422Ssam 
6326422Ssam char		lastc;
6426422Ssam 
6526422Ssam INT		fcor;
6626422Ssam STRING		errflg;
6726422Ssam INT		signo;
6826422Ssam INT		sigcode;
6926422Ssam 
7026422Ssam 
7126422Ssam L_INT		dot;
7226422Ssam L_INT		var[];
7326422Ssam STRING		symfil;
7426422Ssam STRING		corfil;
7526422Ssam L_INT		pid;
7626422Ssam L_INT		adrval;
7726422Ssam INT		adrflg;
7826422Ssam L_INT		cntval;
7926422Ssam INT		cntflg;
8026422Ssam 
8126422Ssam STRING		signals[] = {
8226422Ssam 		"",
8326422Ssam 		"hangup",
8426422Ssam 		"interrupt",
8526422Ssam 		"quit",
8626422Ssam 		"illegal instruction",
8726422Ssam 		"trace/BPT",
8826422Ssam 		"IOT",
8926422Ssam 		"EMT",
9026422Ssam 		"floating exception",
9126422Ssam 		"killed",
9226422Ssam 		"bus error",
9326422Ssam 		"memory fault",
9426422Ssam 		"bad system call",
9526422Ssam 		"broken pipe",
9626422Ssam 		"alarm call",
9726422Ssam 		"terminated",
9826422Ssam 		"signal 16",
9926422Ssam 		"stop (signal)",
10026422Ssam 		"stop (tty)",
10126422Ssam 		"continue (signal)",
10226422Ssam 		"child termination",
10326422Ssam 		"stop (tty input)",
10426422Ssam 		"stop (tty output)",
10526422Ssam 		"input available (signal)",
10626422Ssam 		"cpu timelimit",
10726422Ssam 		"file sizelimit",
10826422Ssam 		"signal 26",
10926422Ssam 		"signal 27",
11026422Ssam 		"signal 28",
11126422Ssam 		"signal 29",
11226422Ssam 		"signal 30",
11326422Ssam 		"signal 31",
11426422Ssam };
11526422Ssam 
11626422Ssam /* general printing routines ($) */
11726422Ssam 
printtrace(modif)11826422Ssam printtrace(modif)
11926422Ssam {
12026422Ssam 	REG		narg, i;
12126422Ssam 	REG BKPTR	bkptr;
12226422Ssam 	REG	ADDR	word;
12326422Ssam 	REG	STRING	comptr;
12426422Ssam 	REG	ADDR	argp, frame;
12526422Ssam 	register struct nlist *sp;
12626422Ssam 	INT		stack, ntramp;
12726422Ssam 
12826422Ssam 	IF cntflg==0 THEN cntval = -1; FI
12926422Ssam 
13026422Ssam 	switch (modif) {
13126422Ssam 
13226422Ssam 	    case '<':
13326422Ssam 		IF cntval == 0
13426422Ssam 		THEN	WHILE readchar() != EOR
13526422Ssam 			DO OD
13626422Ssam 			lp--;
13726422Ssam 			break;
13826422Ssam 		FI
13926422Ssam 		IF rdc() == '<'
14026422Ssam 		THEN	stack = 1;
14126422Ssam 		ELSE	stack = 0; lp--;
14226422Ssam 		FI
14326422Ssam 							/* fall through */
14426422Ssam 	    case '>':
14526422Ssam 		{CHAR		file[64];
14626422Ssam 		CHAR		Ifile[128];
14726422Ssam 		extern CHAR	*Ipath;
14826422Ssam 		INT		index;
14926422Ssam 
15026422Ssam 		index=0;
15126422Ssam 		IF modif=='<'
15226422Ssam 		THEN	iclose(stack, 0);
15326422Ssam 		ELSE	oclose();
15426422Ssam 		FI
15526422Ssam 		IF rdc()!=EOR
15626422Ssam 		THEN	REP file[index++]=lastc;
15726422Ssam 			    IF index>=63 THEN error(LONGFIL); FI
15826422Ssam 			PER readchar()!=EOR DONE
15926422Ssam 			file[index]=0;
16026422Ssam 			IF modif=='<'
16126422Ssam 			THEN	IF Ipath THEN
16226422Ssam 					strcpy(Ifile, Ipath);
16326422Ssam 					strcat(Ifile, "/");
16426422Ssam 					strcat(Ifile, file);
16526422Ssam 				FI
16626422Ssam 				infile=open(file,0);
16726422Ssam 				IF infile<0 && (infile=open(Ifile,0))<0
16826422Ssam 				THEN	infile=0; error(NOTOPEN);
16926422Ssam 				ELSE	IF cntflg
17026422Ssam 					THEN	var[9] = cntval;
17126422Ssam 					ELSE	var[9] = 1;
17226422Ssam 					FI
17326422Ssam 				FI
17426422Ssam 			ELSE	outfile=open(file,1);
17526422Ssam 				IF outfile<0
17626422Ssam 				THEN	outfile=creat(file,0644);
17726422Ssam #ifndef EDDT
17826422Ssam 				ELSE	lseek(outfile,0L,2);
17926422Ssam #endif
18026422Ssam 				FI
18126422Ssam 			FI
18226422Ssam 
18326422Ssam 		ELSE	IF modif == '<'
18426422Ssam 			THEN	iclose(-1, 0);
18526422Ssam 			FI
18626422Ssam 		FI
18726422Ssam 		lp--;
18826422Ssam 		}
18926422Ssam 		break;
19026422Ssam 
19126422Ssam 	    case 'p':
19226422Ssam 		IF kernel == 0 THEN
19326422Ssam 			printf("not debugging kernel\n");
19426422Ssam 		ELSE
19526422Ssam 			IF adrflg THEN
19626422Ssam 				int pte = access(RD, dot, DSP, 0);
19726422Ssam 				masterpcbb = (pte&PG_PFNUM)*NBPG;
19826422Ssam 			FI
19926422Ssam 			getpcb();
20026422Ssam 		FI
20126422Ssam 		break;
20226422Ssam 
20326422Ssam 	    case 'd':
20426422Ssam 		if (adrflg) {
20526422Ssam 			if (!(adrval>=2 && adrval<=16 || adrval<=-2 && adrval>=-16)) {
20626422Ssam 				printf("illegal radix %d base ten",radix);
20726422Ssam 				break;
20826422Ssam 			}
20926422Ssam 			radix=adrval;
21026422Ssam 		}
21126422Ssam 		printf("radix=%d base ten",radix);
21226422Ssam 		break;
21326422Ssam 
21426422Ssam 	    case 'q': case 'Q': case '%':
21526422Ssam 		done();
21626422Ssam 
21726422Ssam 	    case 'w': case 'W':
21826422Ssam 		maxpos=(adrflg?adrval:MAXPOS);
21926422Ssam 		break;
22026422Ssam 
22126422Ssam 	    case 's': case 'S':
22226422Ssam 		maxoff=(adrflg?adrval:MAXOFF);
22326422Ssam 		break;
22426422Ssam 
22526422Ssam 	    case 'v': case 'V':
22626422Ssam 		printf("variables\n");
22726422Ssam 		FOR i=0;i<=35;i++
22826422Ssam 		DO IF var[i]
22926422Ssam 		   THEN printc((i<=9 ? '0' : 'a'-10) + i);
23026422Ssam 			printf(" = %R\n",var[i]);
23126422Ssam 		   FI
23226422Ssam 		OD
23326422Ssam 		break;
23426422Ssam 
23526422Ssam 	    case 'm': case 'M':
23626422Ssam 		printmap("? map",&txtmap);
23726422Ssam 		printmap("/ map",&datmap);
23826422Ssam 		break;
23926422Ssam 
24026422Ssam 	    case 0: case '?':
24126422Ssam 		IF pid
24226422Ssam 		THEN printf("pcs id = %d\n",pid);
24326422Ssam 		ELSE printf("no process\n");
24426422Ssam 		FI
24526422Ssam 		sigprint(); flushbuf();
24626422Ssam 
24726422Ssam 	    case 'r': case 'R':
24826422Ssam 		printregs(modif);
24926422Ssam 		return;
25026422Ssam 
25126422Ssam 	    case 'c': case 'C':
25226422Ssam 		IF adrflg
25326422Ssam 		THEN frame=adrval;
25426422Ssam 			callpc=get(frame-8,DSP);
25526422Ssam 		ELIF kcore THEN
25626422Ssam 			frame = pcb.pcb_fp;
25726422Ssam 			callpc = pcb.pcb_pc;
25826422Ssam 		ELSE
25926422Ssam 			frame = *(ADDR *)(((ADDR)(&u))+FP);
26026422Ssam 			callpc = *(ADDR *)(((ADDR)(&u))+PC);
26126422Ssam 		FI
26226422Ssam 		lastframe=0;
26326422Ssam 		ntramp = 0;
26426422Ssam 		WHILE cntval-- ANDF frame!=0
26526422Ssam 		DO	char *name;
26626422Ssam 			chkerr();
26726422Ssam 			/* check for pc in pcb (signal trampoline code) */
26826422Ssam 			if (MAXSTOR < callpc && callpc < MAXSTOR+ctob(UPAGES)) {
26926422Ssam 				name = "sigtramp";
27026422Ssam 				ntramp++;
27126422Ssam 			} else {
27226422Ssam 				ntramp = 0;
27326422Ssam 				findsym(callpc,ISYM);
27426422Ssam 				if (cursym &&
27526422Ssam 				    !strcmp(cursym->n_un.n_name, "start"))
27626422Ssam 					break;
27726422Ssam 				if (cursym)
27826422Ssam 					name = cursym->n_un.n_name;
27926422Ssam 				else
28026422Ssam 					name = "?";
28126422Ssam 			}
28226422Ssam 			printf("%s(", name);
28326422Ssam 			narg = ((get(frame-4, DSP)&0xffff)-4)/4;
28426422Ssam 			argp = frame;
28526422Ssam 			IF ntramp != 1 THEN
28626422Ssam 			    LOOP IF narg==0 THEN break; FI
28726422Ssam 				printf("%R", get(argp += 4, DSP));
28826422Ssam 				IF --narg!=0 THEN printc(','); FI
28926422Ssam 			    POOL
29026422Ssam 			FI
29126422Ssam 			printf(") at ");
29226422Ssam 			psymoff(callpc, ISYM, "\n");
29326422Ssam 
29426422Ssam 			IF modif=='C'
29526422Ssam 			THEN WHILE localsym(frame,argp)
29626422Ssam 			     DO word=get(localval,DSP);
29726422Ssam 				printf("%8t%s:%10t", cursym->n_un.n_name);
29826422Ssam 				IF errflg THEN printf("?\n"); errflg=0;
29926422Ssam 				ELSE printf("%R\n",word); FI
30026422Ssam 			     OD
30126422Ssam 			FI
30226422Ssam 
30326422Ssam 			if (ntramp != 1) {
30426422Ssam 				callpc = get(frame-8, DSP);
30526422Ssam 				lastframe = frame;
30626422Ssam 				frame = get(frame, DSP)&ALIGN;
30726422Ssam 			} else
30826422Ssam 				callpc = get(lastframe+44, DSP);
30926422Ssam 			IF !adrflg ANDF !INSTACK(frame)
31026422Ssam 			THEN break; FI
31126422Ssam 		OD
31226422Ssam 		break;
31326422Ssam 
31426422Ssam 	    /*print externals*/
31526422Ssam 	    case 'e': case 'E':
31626422Ssam 		for (sp = symtab; sp < esymtab; sp++) {
31726422Ssam 		   if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
31826422Ssam 		   	printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
31926422Ssam 		}
32026422Ssam 		break;
32126422Ssam 
32226422Ssam 	    /*print breakpoints*/
32326422Ssam 	    case 'b': case 'B':
32426422Ssam 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
32526422Ssam 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
32626422Ssam 			if (bkptr->flag) {
32726422Ssam 		   		printf("%-8.8d",bkptr->count);
32826422Ssam 				psymoff(bkptr->loc,ISYM,"%24t");
32926422Ssam 				comptr=bkptr->comm;
33026422Ssam 				WHILE *comptr DO printc(*comptr++); OD
33126422Ssam 			}
33226422Ssam 		break;
33326422Ssam 
33426422Ssam 	    default: error(BADMOD);
33526422Ssam 	}
33626422Ssam 
33726422Ssam }
33826422Ssam 
printmap(s,amap)33926422Ssam printmap(s,amap)
34026422Ssam STRING	s; REG	MAP *amap;
34126422Ssam {
34226422Ssam 	int file;
34326422Ssam 	file=amap->ufd;
34426422Ssam 	printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
34526422Ssam 	printf("b1 = %-16R",amap->b1);
34626422Ssam 	printf("e1 = %-16R",amap->e1);
34726422Ssam 	printf("f1 = %-16R",amap->f1);
34826422Ssam 	printf("\nb2 = %-16R",amap->b2);
34926422Ssam 	printf("e2 = %-16R",amap->e2);
35026422Ssam 	printf("f2 = %-16R",amap->f2);
35126422Ssam 	printc(EOR);
35226422Ssam }
35326422Ssam 
printregs(c)35426422Ssam printregs(c)
35526422Ssam {
35626422Ssam 	REG REGPTR	p;
35726422Ssam 	ADDR		v;
35826422Ssam 
35926422Ssam 	FOR p=reglist; p->rname; p++
36026422Ssam 	DO
36126422Ssam 		if(c!='R' && p->roffs!=PSL)
36226422Ssam 			continue;
36326422Ssam 		c = 'R';
36426422Ssam 		v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
36526422Ssam 		printf("%s%6t%R %16t", p->rname, v);
36626422Ssam 		valpr(v,(p->roffs==PC?ISYM:DSYM));
36726422Ssam 		printc(EOR);
36826422Ssam 	OD
36926422Ssam 	printpc();
37026422Ssam }
37126422Ssam 
getreg(regnam)37226422Ssam getreg(regnam)
37326422Ssam {
37426422Ssam 	REG REGPTR	p;
37526422Ssam 	REG STRING	regptr;
37626422Ssam 	CHAR	*olp;
37726422Ssam 
37826422Ssam 	olp=lp;
37926422Ssam 	FOR p=reglist; p->rname; p++
38026422Ssam 	DO	regptr=p->rname;
38126422Ssam 		IF (regnam == *regptr++)
38226422Ssam 		THEN
38326422Ssam 			WHILE *regptr
38426422Ssam 			DO IF readchar() != *regptr++
38526422Ssam 				THEN --regptr; break;
38626422Ssam 				FI
38726422Ssam 			OD
38826422Ssam 			IF *regptr
38926422Ssam 			THEN lp=olp;
39026422Ssam 			ELSE return(kcore ? (int)p->rkern : p->roffs);
39126422Ssam 			FI
39226422Ssam 		FI
39326422Ssam 	OD
39426422Ssam 	lp=olp;
395*29663Ssam 	return(-1);
39626422Ssam }
39726422Ssam 
printpc()39826422Ssam printpc()
39926422Ssam {
40026422Ssam 	dot= *(ADDR *)(((ADDR)(&u))+PC);
40126422Ssam 	psymoff(dot,ISYM,":%16t"); printins(ISP,chkget(dot,ISP));
40226422Ssam 	printc(EOR);
40326422Ssam }
40426422Ssam 
40526422Ssam char	*illinames[] = {
40626422Ssam 	"reserved addressing fault",
40726422Ssam 	"priviliged instruction fault",
40826422Ssam 	"reserved operand fault"
40926422Ssam };
41026422Ssam char	*fpenames[] = {
41126422Ssam 	0,
41226422Ssam 	"integer overflow trap",
41326422Ssam 	"integer divide by zero trap",
41426422Ssam /* not valid
41526422Ssam 	"floating overflow trap",
41626422Ssam 	"floating/decimal divide by zero trap",
41726422Ssam 	"floating underflow trap",
41826422Ssam 	"decimal overflow trap",
41926422Ssam 	"subscript out of range trap",
42026422Ssam 	"floating overflow fault",
42126422Ssam 	"floating divide by zero fault",
42226422Ssam 	"floating undeflow fault"
42326422Ssam */
42426422Ssam };
42526422Ssam 
sigprint()42626422Ssam sigprint()
42726422Ssam {
42826422Ssam 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
42926422Ssam 	THEN printf(signals[signo]); FI
43026422Ssam 	switch (signo) {
43126422Ssam 
43226422Ssam 	case SIGFPE:
43326422Ssam 		IF (sigcode > 0 &&
43426422Ssam 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
43526422Ssam 			printf(" ("); printf(fpenames[sigcode]); printc(')');
43626422Ssam 		FI
43726422Ssam 		break;
43826422Ssam 
43926422Ssam 	case SIGILL:
44026422Ssam 		IF (sigcode >= 0 &&
44126422Ssam 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
44226422Ssam 			printf(" ("); printf(illinames[sigcode]); printc(')');
44326422Ssam 		FI
44426422Ssam 		break;
44526422Ssam 	}
44626422Ssam }
447