xref: /csrg-svn/old/adb/adb.vax/print.c (revision 3777)
1*3777Sroot static	char sccsid[] = "@(#)print.c 4.2 05/14/81";
23764Sroot /*
33764Sroot  *
43764Sroot  *	UNIX debugger
53764Sroot  *
63764Sroot  */
73764Sroot #include "defs.h"
83764Sroot 
93764Sroot MSG		LONGFIL;
103764Sroot MSG		NOTOPEN;
113764Sroot MSG		A68BAD;
123764Sroot MSG		A68LNK;
133764Sroot MSG		BADMOD;
143764Sroot 
153764Sroot MAP		txtmap;
163764Sroot MAP		datmap;
173764Sroot 
183764Sroot ADDR		lastframe;
193764Sroot ADDR		callpc;
203764Sroot 
213764Sroot INT		infile;
223764Sroot INT		outfile;
233764Sroot CHAR		*lp;
243764Sroot L_INT		maxoff;
253764Sroot L_INT		maxpos;
263764Sroot INT		radix;
273764Sroot 
283764Sroot /* symbol management */
293764Sroot L_INT		localval;
303764Sroot 
313764Sroot /* breakpoints */
323764Sroot BKPTR		bkpthead;
333764Sroot 
343764Sroot REGLIST reglist [] = {
35*3777Sroot 	"p1lr",	P1LR,	&pcb.pcb_p1lr,
36*3777Sroot 	"p1br",	P1BR,	&pcb.pcb_p1br,
37*3777Sroot 	"p0lr",	P0LR,	&pcb.pcb_p0lr,
38*3777Sroot 	"p0br",	P0BR,	&pcb.pcb_p0br,
39*3777Sroot 	"ksp",	KSP,	&pcb.pcb_ksp,
40*3777Sroot 	"esp",	ESP,	&pcb.pcb_esp,
41*3777Sroot 	"ssp",	SSP,	&pcb.pcb_ssp,
42*3777Sroot 	"psl",	PSL,	&pcb.pcb_psl,
43*3777Sroot 	"pc",	PC,	&pcb.pcb_pc,
44*3777Sroot 	"usp",	USP,	&pcb.pcb_usp,
45*3777Sroot 	"fp",	FP,	&pcb.pcb_fp,
46*3777Sroot 	"ap",	AP,	&pcb.pcb_ap,
47*3777Sroot 	"r11",	R11,	&pcb.pcb_r11,
48*3777Sroot 	"r10",	R10,	&pcb.pcb_r10,
49*3777Sroot 	"r9",	R9,	&pcb.pcb_r9,
50*3777Sroot 	"r8",	R8,	&pcb.pcb_r8,
51*3777Sroot 	"r7",	R7,	&pcb.pcb_r7,
52*3777Sroot 	"r6",	R6,	&pcb.pcb_r6,
53*3777Sroot 	"r5",	R5,	&pcb.pcb_r5,
54*3777Sroot 	"r4",	R4,	&pcb.pcb_r4,
55*3777Sroot 	"r3",	R3,	&pcb.pcb_r3,
56*3777Sroot 	"r2",	R2,	&pcb.pcb_r2,
57*3777Sroot 	"r1",	R1,	&pcb.pcb_r1,
58*3777Sroot 	"r0",	R0,	&pcb.pcb_r0,
593764Sroot };
603764Sroot 
613764Sroot char		lastc;
623764Sroot 
633764Sroot INT		fcor;
643764Sroot STRING		errflg;
653764Sroot INT		signo;
663764Sroot INT		sigcode;
673764Sroot 
683764Sroot 
693764Sroot L_INT		dot;
703764Sroot L_INT		var[];
713764Sroot STRING		symfil;
723764Sroot STRING		corfil;
733764Sroot INT		pid;
743764Sroot L_INT		adrval;
753764Sroot INT		adrflg;
763764Sroot L_INT		cntval;
773764Sroot INT		cntflg;
783764Sroot 
793764Sroot STRING		signals[] = {
803764Sroot 		"",
813764Sroot 		"hangup",
823764Sroot 		"interrupt",
833764Sroot 		"quit",
843764Sroot 		"illegal instruction",
853764Sroot 		"trace/BPT",
863764Sroot 		"IOT",
873764Sroot 		"EMT",
883764Sroot 		"floating exception",
893764Sroot 		"killed",
903764Sroot 		"bus error",
913764Sroot 		"memory fault",
923764Sroot 		"bad system call",
933764Sroot 		"broken pipe",
943764Sroot 		"alarm call",
953764Sroot 		"terminated",
963764Sroot 		"signal 16",
973764Sroot 		"stop (signal)",
983764Sroot 		"stop (tty)",
993764Sroot 		"continue (signal)",
1003764Sroot 		"child termination",
1013764Sroot 		"stop (tty input)",
1023764Sroot 		"stop (tty output)",
1033764Sroot 		"input available (signal)",
1043764Sroot 		"cpu timelimit",
1053764Sroot 		"file sizelimit",
1063764Sroot 		"signal 26",
1073764Sroot 		"signal 27",
1083764Sroot 		"signal 28",
1093764Sroot 		"signal 29",
1103764Sroot 		"signal 30",
1113764Sroot 		"signal 31",
1123764Sroot };
1133764Sroot 
1143764Sroot /* general printing routines ($) */
1153764Sroot 
1163764Sroot printtrace(modif)
1173764Sroot {
1183764Sroot 	INT		narg, i, stat, name, limit;
1193764Sroot 	POS		dynam;
1203764Sroot 	REG BKPTR	bkptr;
1213764Sroot 	CHAR		hi, lo;
1223764Sroot 	ADDR		word;
1233764Sroot 	STRING		comptr;
1243764Sroot 	ADDR		argp, frame, link;
1253764Sroot 	register struct nlist *sp;
1263764Sroot 	INT		stack;
1273764Sroot 	INT		ntramp;
1283764Sroot 
1293764Sroot 	IF cntflg==0 THEN cntval = -1; FI
1303764Sroot 
1313764Sroot 	switch (modif) {
1323764Sroot 
1333764Sroot 	    case '<':
1343764Sroot 		IF cntval == 0
1353764Sroot 		THEN	WHILE readchar() != EOR
1363764Sroot 			DO OD
1373764Sroot 			lp--;
1383764Sroot 			break;
1393764Sroot 		FI
1403764Sroot 		IF rdc() == '<'
1413764Sroot 		THEN	stack = 1;
1423764Sroot 		ELSE	stack = 0; lp--;
1433764Sroot 		FI
1443764Sroot 							/* fall through */
1453764Sroot 	    case '>':
1463764Sroot 		{CHAR		file[64];
1473764Sroot 		CHAR		Ifile[128];
1483764Sroot 		extern CHAR	*Ipath;
1493764Sroot 		INT		index;
1503764Sroot 
1513764Sroot 		index=0;
1523764Sroot 		IF modif=='<'
1533764Sroot 		THEN	iclose(stack, 0);
1543764Sroot 		ELSE	oclose();
1553764Sroot 		FI
1563764Sroot 		IF rdc()!=EOR
1573764Sroot 		THEN	REP file[index++]=lastc;
1583764Sroot 			    IF index>=63 THEN error(LONGFIL); FI
1593764Sroot 			PER readchar()!=EOR DONE
1603764Sroot 			file[index]=0;
1613764Sroot 			IF modif=='<'
1623764Sroot 			THEN	IF Ipath THEN
1633764Sroot 					strcpy(Ifile, Ipath);
1643764Sroot 					strcat(Ifile, "/");
1653764Sroot 					strcat(Ifile, file);
1663764Sroot 				FI
1673764Sroot 				infile=open(file,0);
1683764Sroot 				IF infile<0 && (infile=open(Ifile,0))<0
1693764Sroot 				THEN	infile=0; error(NOTOPEN);
1703764Sroot 				ELSE	IF cntflg
1713764Sroot 					THEN	var[9] = cntval;
1723764Sroot 					ELSE	var[9] = 1;
1733764Sroot 					FI
1743764Sroot 				FI
1753764Sroot 			ELSE	outfile=open(file,1);
1763764Sroot 				IF outfile<0
1773764Sroot 				THEN	outfile=creat(file,0644);
1783764Sroot #ifndef EDDT
1793764Sroot 				ELSE	lseek(outfile,0L,2);
1803764Sroot #endif
1813764Sroot 				FI
1823764Sroot 			FI
1833764Sroot 
1843764Sroot 		ELSE	IF modif == '<'
1853764Sroot 			THEN	iclose(-1, 0);
1863764Sroot 			FI
1873764Sroot 		FI
1883764Sroot 		lp--;
1893764Sroot 		}
1903764Sroot 		break;
1913764Sroot 
1923764Sroot 	    case 'd':
1933764Sroot 		if (adrflg) {
1943764Sroot 			if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
1953764Sroot 			printf("radix=%d base ten",radix=adrval);
1963764Sroot 		}
1973764Sroot 		break;
1983764Sroot 
1993764Sroot 	    case 'q': case 'Q': case '%':
2003764Sroot 		done();
2013764Sroot 
2023764Sroot 	    case 'w': case 'W':
2033764Sroot 		maxpos=(adrflg?adrval:MAXPOS);
2043764Sroot 		break;
2053764Sroot 
2063764Sroot 	    case 's': case 'S':
2073764Sroot 		maxoff=(adrflg?adrval:MAXOFF);
2083764Sroot 		break;
2093764Sroot 
2103764Sroot 	    case 'v': case 'V':
2113764Sroot 		prints("variables\n");
2123764Sroot 		FOR i=0;i<=35;i++
2133764Sroot 		DO IF var[i]
2143764Sroot 		   THEN printc((i<=9 ? '0' : 'a'-10) + i);
2153764Sroot 			printf(" = %Q\n",var[i]);
2163764Sroot 		   FI
2173764Sroot 		OD
2183764Sroot 		break;
2193764Sroot 
2203764Sroot 	    case 'm': case 'M':
2213764Sroot 		printmap("? map",&txtmap);
2223764Sroot 		printmap("/ map",&datmap);
2233764Sroot 		break;
2243764Sroot 
2253764Sroot 	    case 0: case '?':
2263764Sroot 		IF pid
2273764Sroot 		THEN printf("pcs id = %d\n",pid);
2283764Sroot 		ELSE prints("no process\n");
2293764Sroot 		FI
2303764Sroot 		sigprint(); flushbuf();
2313764Sroot 
2323764Sroot 	    case 'r': case 'R':
2333764Sroot 		printregs();
2343764Sroot 		return;
2353764Sroot 
2363764Sroot 	    case 'c': case 'C':
2373764Sroot 		IF adrflg
2383764Sroot 		THEN frame=adrval;
2393764Sroot 			word=get(adrval+6,DSP)&0xFFFF;
2403764Sroot 			IF word&0x2000
2413764Sroot 			THEN /* 'calls', can figure out argp */
2423764Sroot 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
2433764Sroot 				WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
2443764Sroot 			ELSE /* 'callg', can't tell where argp is */ argp=frame;
2453764Sroot 			FI
2463764Sroot 			callpc=get(frame+16,DSP);
2473764Sroot 		ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
2483764Sroot 			frame= *(ADDR *)(((ADDR)&u)+FP);
2493764Sroot 			callpc= *(ADDR *)(((ADDR)&u)+PC);
2503764Sroot 		FI
2513764Sroot 		lastframe=0;
2523764Sroot 		ntramp = 0;
2533764Sroot 		WHILE cntval--
2543764Sroot 		DO	char *name;
2553764Sroot 			chkerr();
2563764Sroot 			if (callpc > 0x80000000 - 0x200 * UPAGES) {
2573764Sroot 				name = "sigtramp";
2583764Sroot 				ntramp++;
2593764Sroot 			} else {
2603764Sroot 				ntramp = 0;
2613764Sroot 				findsym(callpc,ISYM);
2623764Sroot 				if (cursym &&
2633764Sroot 				    !strcmp(cursym->n_un.n_name, "start"))
2643764Sroot 					break;
2653764Sroot 				if (cursym)
2663764Sroot 					name = cursym->n_un.n_name;
2673764Sroot 				else
2683764Sroot 					name = "?";
2693764Sroot 			}
2703764Sroot 			printf("%s(", name);
2713764Sroot 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
2723764Sroot 			LOOP IF narg==0 THEN break; FI
2733764Sroot 				printf("%R", get(argp += 4, DSP));
2743764Sroot 				IF --narg!=0 THEN printc(','); FI
2753764Sroot 			POOL
2763764Sroot 			printf(") from %X\n",callpc);  /* jkf mod */
2773764Sroot 
2783764Sroot 			IF modif=='C'
2793764Sroot 			THEN WHILE localsym(frame,argp)
2803764Sroot 			     DO word=get(localval,DSP);
2813764Sroot 				printf("%8t%s:%10t", cursym->n_un.n_name);
2823764Sroot 				IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
2833764Sroot 			     OD
2843764Sroot 			FI
2853764Sroot 
2863764Sroot 			if (ntramp == 1)
2873764Sroot 				callpc=get(frame+64, DSP);
2883764Sroot 			else
2893764Sroot 				callpc=get(frame+16, DSP);
2903764Sroot 			argp=get(frame+8, DSP);
2913764Sroot 			lastframe=frame;
2923764Sroot 			frame=get(frame+12, DSP)&EVEN;
2933764Sroot 			IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
2943764Sroot 			THEN break;
2953764Sroot 			FI
2963764Sroot 		OD
2973764Sroot 		break;
2983764Sroot 
2993764Sroot 	    /*print externals*/
3003764Sroot 	    case 'e': case 'E':
3013764Sroot 		for (sp = symtab; sp < esymtab; sp++) {
3023764Sroot 		   if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
3033764Sroot 		   	printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
3043764Sroot 		}
3053764Sroot 		break;
3063764Sroot 
3073764Sroot 	    case 'a': case 'A':
3083764Sroot 		error("No algol 68 on VAX");
3093764Sroot 		/*NOTREACHED*/
3103764Sroot 
3113764Sroot 	    /*print breakpoints*/
3123764Sroot 	    case 'b': case 'B':
3133764Sroot 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
3143764Sroot 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
3153764Sroot 			if (bkptr->flag) {
3163764Sroot 		   		printf("%-8.8d",bkptr->count);
3173764Sroot 				psymoff(leng(bkptr->loc),ISYM,"%24t");
3183764Sroot 				comptr=bkptr->comm;
3193764Sroot 				WHILE *comptr DO printc(*comptr++); OD
3203764Sroot 			}
3213764Sroot 		break;
3223764Sroot 
3233764Sroot 	    default: error(BADMOD);
3243764Sroot 	}
3253764Sroot 
3263764Sroot }
3273764Sroot 
3283764Sroot printmap(s,amap)
3293764Sroot STRING	s; MAP *amap;
3303764Sroot {
3313764Sroot 	int file;
3323764Sroot 	file=amap->ufd;
3333764Sroot 	printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
3343764Sroot 	printf("b1 = %-16R",amap->b1);
3353764Sroot 	printf("e1 = %-16R",amap->e1);
3363764Sroot 	printf("f1 = %-16R",amap->f1);
3373764Sroot 	printf("\nb2 = %-16R",amap->b2);
3383764Sroot 	printf("e2 = %-16R",amap->e2);
3393764Sroot 	printf("f2 = %-16R",amap->f2);
3403764Sroot 	printc(EOR);
3413764Sroot }
3423764Sroot 
3433764Sroot printregs()
3443764Sroot {
3453764Sroot 	REG REGPTR	p;
3463764Sroot 	L_INT		v;
3473764Sroot 
3483764Sroot 	FOR p=reglist; p < &reglist[24]; p++
349*3777Sroot 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
350*3777Sroot 		printf("%s%6t%R %16t", p->rname, v);
3513764Sroot 		valpr(v,(p->roffs==PC?ISYM:DSYM));
3523764Sroot 		printc(EOR);
3533764Sroot 	OD
3543764Sroot 	printpc();
3553764Sroot }
3563764Sroot 
357*3777Sroot getreg(regnam) {
3583764Sroot 	REG REGPTR	p;
3593764Sroot 	REG STRING	regptr;
3603764Sroot 	CHAR	*olp;
3613764Sroot 	CHAR		regnxt;
3623764Sroot 
3633764Sroot 	olp=lp;
3643764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3653764Sroot 	DO	regptr=p->rname;
3663764Sroot 		IF (regnam == *regptr++)
3673764Sroot 		THEN
3683764Sroot 			WHILE *regptr
3693764Sroot 			DO IF (regnxt=readchar()) != *regptr++
3703764Sroot 				THEN --regptr; break;
3713764Sroot 				FI
3723764Sroot 			OD
3733764Sroot 			IF *regptr
3743764Sroot 			THEN lp=olp;
375*3777Sroot 			ELSE return(kcore ? (int)p->rkern : p->roffs);
3763764Sroot 			FI
3773764Sroot 		FI
3783764Sroot 	OD
3793764Sroot 	lp=olp;
3803764Sroot 	return(0);
3813764Sroot }
3823764Sroot 
3833764Sroot printpc()
3843764Sroot {
3853764Sroot 	dot= *(ADDR *)(((ADDR)&u)+PC);
3863764Sroot 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
3873764Sroot 	printc(EOR);
3883764Sroot }
3893764Sroot 
3903764Sroot char	*illinames[] = {
3913764Sroot 	"reserved addressing fault",
3923764Sroot 	"priviliged instruction fault",
3933764Sroot 	"reserved operand fault"
3943764Sroot };
3953764Sroot char	*fpenames[] = {
3963764Sroot 	0,
3973764Sroot 	"integer overflow trap",
3983764Sroot 	"integer divide by zero trap",
3993764Sroot 	"floating overflow trap",
4003764Sroot 	"floating/decimal divide by zero trap",
4013764Sroot 	"floating underflow trap",
4023764Sroot 	"decimal overflow trap",
4033764Sroot 	"subscript out of range trap",
4043764Sroot 	"floating overflow fault",
4053764Sroot 	"floating divide by zero fault",
4063764Sroot 	"floating undeflow fault"
4073764Sroot };
4083764Sroot 
4093764Sroot sigprint()
4103764Sroot {
4113764Sroot 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
4123764Sroot 	THEN prints(signals[signo]); FI
4133764Sroot 	switch (signo) {
4143764Sroot 
4153764Sroot 	case SIGFPE:
4163764Sroot 		IF (sigcode > 0 &&
4173764Sroot 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
4183764Sroot 			prints(" ("); prints(fpenames[sigcode]); prints(")");
4193764Sroot 		FI
4203764Sroot 		break;
4213764Sroot 
4223764Sroot 	case SIGILL:
4233764Sroot 		IF (sigcode >= 0 &&
4243764Sroot 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
4253764Sroot 			prints(" ("); prints(illinames[sigcode]); prints(")");
4263764Sroot 		FI
4273764Sroot 		break;
4283764Sroot 	}
4293764Sroot }
430