xref: /csrg-svn/old/adb/adb.vax/print.c (revision 3779)
1*3779Sroot static	char sccsid[] = "@(#)print.c 4.4 05/15/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 [] = {
353777Sroot 	"p1lr",	P1LR,	&pcb.pcb_p1lr,
363777Sroot 	"p1br",	P1BR,	&pcb.pcb_p1br,
373777Sroot 	"p0lr",	P0LR,	&pcb.pcb_p0lr,
383777Sroot 	"p0br",	P0BR,	&pcb.pcb_p0br,
393777Sroot 	"ksp",	KSP,	&pcb.pcb_ksp,
403777Sroot 	"esp",	ESP,	&pcb.pcb_esp,
413777Sroot 	"ssp",	SSP,	&pcb.pcb_ssp,
423777Sroot 	"psl",	PSL,	&pcb.pcb_psl,
433777Sroot 	"pc",	PC,	&pcb.pcb_pc,
443777Sroot 	"usp",	USP,	&pcb.pcb_usp,
453777Sroot 	"fp",	FP,	&pcb.pcb_fp,
463777Sroot 	"ap",	AP,	&pcb.pcb_ap,
473777Sroot 	"r11",	R11,	&pcb.pcb_r11,
483777Sroot 	"r10",	R10,	&pcb.pcb_r10,
493777Sroot 	"r9",	R9,	&pcb.pcb_r9,
503777Sroot 	"r8",	R8,	&pcb.pcb_r8,
513777Sroot 	"r7",	R7,	&pcb.pcb_r7,
523777Sroot 	"r6",	R6,	&pcb.pcb_r6,
533777Sroot 	"r5",	R5,	&pcb.pcb_r5,
543777Sroot 	"r4",	R4,	&pcb.pcb_r4,
553777Sroot 	"r3",	R3,	&pcb.pcb_r3,
563777Sroot 	"r2",	R2,	&pcb.pcb_r2,
573777Sroot 	"r1",	R1,	&pcb.pcb_r1,
583777Sroot 	"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 
192*3779Sroot 	    case 'p':
193*3779Sroot 		IF kernel == 0 THEN
194*3779Sroot 			printf("not debugging kernel\n");
195*3779Sroot 		ELSE
196*3779Sroot 			IF adrflg THEN
197*3779Sroot 				int pte = access(RD, dot, DSP, 0);
198*3779Sroot 				masterpcbb = (pte&PG_PFNUM)*512;
199*3779Sroot 			FI
200*3779Sroot 			getpcb();
201*3779Sroot 		FI
202*3779Sroot 		break;
203*3779Sroot 
2043764Sroot 	    case 'd':
2053764Sroot 		if (adrflg) {
2063764Sroot 			if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
2073764Sroot 			printf("radix=%d base ten",radix=adrval);
2083764Sroot 		}
2093764Sroot 		break;
2103764Sroot 
2113764Sroot 	    case 'q': case 'Q': case '%':
2123764Sroot 		done();
2133764Sroot 
2143764Sroot 	    case 'w': case 'W':
2153764Sroot 		maxpos=(adrflg?adrval:MAXPOS);
2163764Sroot 		break;
2173764Sroot 
2183764Sroot 	    case 's': case 'S':
2193764Sroot 		maxoff=(adrflg?adrval:MAXOFF);
2203764Sroot 		break;
2213764Sroot 
2223764Sroot 	    case 'v': case 'V':
2233764Sroot 		prints("variables\n");
2243764Sroot 		FOR i=0;i<=35;i++
2253764Sroot 		DO IF var[i]
2263764Sroot 		   THEN printc((i<=9 ? '0' : 'a'-10) + i);
2273764Sroot 			printf(" = %Q\n",var[i]);
2283764Sroot 		   FI
2293764Sroot 		OD
2303764Sroot 		break;
2313764Sroot 
2323764Sroot 	    case 'm': case 'M':
2333764Sroot 		printmap("? map",&txtmap);
2343764Sroot 		printmap("/ map",&datmap);
2353764Sroot 		break;
2363764Sroot 
2373764Sroot 	    case 0: case '?':
2383764Sroot 		IF pid
2393764Sroot 		THEN printf("pcs id = %d\n",pid);
2403764Sroot 		ELSE prints("no process\n");
2413764Sroot 		FI
2423764Sroot 		sigprint(); flushbuf();
2433764Sroot 
2443764Sroot 	    case 'r': case 'R':
2453764Sroot 		printregs();
2463764Sroot 		return;
2473764Sroot 
2483764Sroot 	    case 'c': case 'C':
2493764Sroot 		IF adrflg
2503764Sroot 		THEN frame=adrval;
2513764Sroot 			word=get(adrval+6,DSP)&0xFFFF;
2523764Sroot 			IF word&0x2000
2533764Sroot 			THEN /* 'calls', can figure out argp */
2543764Sroot 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
2553764Sroot 				WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
2563764Sroot 			ELSE /* 'callg', can't tell where argp is */ argp=frame;
2573764Sroot 			FI
2583764Sroot 			callpc=get(frame+16,DSP);
259*3779Sroot 		ELIF kcore THEN
260*3779Sroot 			argp = pcb.pcb_ap;
261*3779Sroot 			frame = pcb.pcb_fp;
262*3779Sroot 			callpc = pcb.pcb_pc;
263*3779Sroot 		ELSE	argp= *(ADDR *)(((ADDR)&u)+AP);
2643764Sroot 			frame= *(ADDR *)(((ADDR)&u)+FP);
2653764Sroot 			callpc= *(ADDR *)(((ADDR)&u)+PC);
2663764Sroot 		FI
2673764Sroot 		lastframe=0;
2683764Sroot 		ntramp = 0;
2693764Sroot 		WHILE cntval--
2703764Sroot 		DO	char *name;
2713764Sroot 			chkerr();
2723764Sroot 			if (callpc > 0x80000000 - 0x200 * UPAGES) {
2733764Sroot 				name = "sigtramp";
2743764Sroot 				ntramp++;
2753764Sroot 			} else {
2763764Sroot 				ntramp = 0;
2773764Sroot 				findsym(callpc,ISYM);
2783764Sroot 				if (cursym &&
2793764Sroot 				    !strcmp(cursym->n_un.n_name, "start"))
2803764Sroot 					break;
2813764Sroot 				if (cursym)
2823764Sroot 					name = cursym->n_un.n_name;
2833764Sroot 				else
2843764Sroot 					name = "?";
2853764Sroot 			}
2863764Sroot 			printf("%s(", name);
2873764Sroot 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
2883764Sroot 			LOOP IF narg==0 THEN break; FI
2893764Sroot 				printf("%R", get(argp += 4, DSP));
2903764Sroot 				IF --narg!=0 THEN printc(','); FI
2913764Sroot 			POOL
2923764Sroot 			printf(") from %X\n",callpc);  /* jkf mod */
2933764Sroot 
2943764Sroot 			IF modif=='C'
2953764Sroot 			THEN WHILE localsym(frame,argp)
2963764Sroot 			     DO word=get(localval,DSP);
2973764Sroot 				printf("%8t%s:%10t", cursym->n_un.n_name);
2983764Sroot 				IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
2993764Sroot 			     OD
3003764Sroot 			FI
3013764Sroot 
3023764Sroot 			if (ntramp == 1)
3033764Sroot 				callpc=get(frame+64, DSP);
3043764Sroot 			else
3053764Sroot 				callpc=get(frame+16, DSP);
3063764Sroot 			argp=get(frame+8, DSP);
3073764Sroot 			lastframe=frame;
3083764Sroot 			frame=get(frame+12, DSP)&EVEN;
3093764Sroot 			IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
3103764Sroot 			THEN break;
3113764Sroot 			FI
3123764Sroot 		OD
3133764Sroot 		break;
3143764Sroot 
3153764Sroot 	    /*print externals*/
3163764Sroot 	    case 'e': case 'E':
3173764Sroot 		for (sp = symtab; sp < esymtab; sp++) {
3183764Sroot 		   if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
3193764Sroot 		   	printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
3203764Sroot 		}
3213764Sroot 		break;
3223764Sroot 
3233764Sroot 	    case 'a': case 'A':
3243764Sroot 		error("No algol 68 on VAX");
3253764Sroot 		/*NOTREACHED*/
3263764Sroot 
3273764Sroot 	    /*print breakpoints*/
3283764Sroot 	    case 'b': case 'B':
3293764Sroot 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
3303764Sroot 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
3313764Sroot 			if (bkptr->flag) {
3323764Sroot 		   		printf("%-8.8d",bkptr->count);
3333764Sroot 				psymoff(leng(bkptr->loc),ISYM,"%24t");
3343764Sroot 				comptr=bkptr->comm;
3353764Sroot 				WHILE *comptr DO printc(*comptr++); OD
3363764Sroot 			}
3373764Sroot 		break;
3383764Sroot 
3393764Sroot 	    default: error(BADMOD);
3403764Sroot 	}
3413764Sroot 
3423764Sroot }
3433764Sroot 
3443764Sroot printmap(s,amap)
3453764Sroot STRING	s; MAP *amap;
3463764Sroot {
3473764Sroot 	int file;
3483764Sroot 	file=amap->ufd;
3493764Sroot 	printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
3503764Sroot 	printf("b1 = %-16R",amap->b1);
3513764Sroot 	printf("e1 = %-16R",amap->e1);
3523764Sroot 	printf("f1 = %-16R",amap->f1);
3533764Sroot 	printf("\nb2 = %-16R",amap->b2);
3543764Sroot 	printf("e2 = %-16R",amap->e2);
3553764Sroot 	printf("f2 = %-16R",amap->f2);
3563764Sroot 	printc(EOR);
3573764Sroot }
3583764Sroot 
3593764Sroot printregs()
3603764Sroot {
3613764Sroot 	REG REGPTR	p;
3623764Sroot 	L_INT		v;
3633764Sroot 
3643764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3653777Sroot 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
3663777Sroot 		printf("%s%6t%R %16t", p->rname, v);
3673764Sroot 		valpr(v,(p->roffs==PC?ISYM:DSYM));
3683764Sroot 		printc(EOR);
3693764Sroot 	OD
3703764Sroot 	printpc();
3713764Sroot }
3723764Sroot 
3733777Sroot getreg(regnam) {
3743764Sroot 	REG REGPTR	p;
3753764Sroot 	REG STRING	regptr;
3763764Sroot 	CHAR	*olp;
3773764Sroot 	CHAR		regnxt;
3783764Sroot 
3793764Sroot 	olp=lp;
3803764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3813764Sroot 	DO	regptr=p->rname;
3823764Sroot 		IF (regnam == *regptr++)
3833764Sroot 		THEN
3843764Sroot 			WHILE *regptr
3853764Sroot 			DO IF (regnxt=readchar()) != *regptr++
3863764Sroot 				THEN --regptr; break;
3873764Sroot 				FI
3883764Sroot 			OD
3893764Sroot 			IF *regptr
3903764Sroot 			THEN lp=olp;
3913778Sroot 			ELSE
3923778Sroot 				int i = kcore ? (int)p->rkern : p->roffs;
3933778Sroot 				printf("returning %X\n", i);
3943778Sroot 				return (i);
3953764Sroot 			FI
3963764Sroot 		FI
3973764Sroot 	OD
3983764Sroot 	lp=olp;
3993764Sroot 	return(0);
4003764Sroot }
4013764Sroot 
4023764Sroot printpc()
4033764Sroot {
4043764Sroot 	dot= *(ADDR *)(((ADDR)&u)+PC);
4053764Sroot 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
4063764Sroot 	printc(EOR);
4073764Sroot }
4083764Sroot 
4093764Sroot char	*illinames[] = {
4103764Sroot 	"reserved addressing fault",
4113764Sroot 	"priviliged instruction fault",
4123764Sroot 	"reserved operand fault"
4133764Sroot };
4143764Sroot char	*fpenames[] = {
4153764Sroot 	0,
4163764Sroot 	"integer overflow trap",
4173764Sroot 	"integer divide by zero trap",
4183764Sroot 	"floating overflow trap",
4193764Sroot 	"floating/decimal divide by zero trap",
4203764Sroot 	"floating underflow trap",
4213764Sroot 	"decimal overflow trap",
4223764Sroot 	"subscript out of range trap",
4233764Sroot 	"floating overflow fault",
4243764Sroot 	"floating divide by zero fault",
4253764Sroot 	"floating undeflow fault"
4263764Sroot };
4273764Sroot 
4283764Sroot sigprint()
4293764Sroot {
4303764Sroot 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
4313764Sroot 	THEN prints(signals[signo]); FI
4323764Sroot 	switch (signo) {
4333764Sroot 
4343764Sroot 	case SIGFPE:
4353764Sroot 		IF (sigcode > 0 &&
4363764Sroot 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
4373764Sroot 			prints(" ("); prints(fpenames[sigcode]); prints(")");
4383764Sroot 		FI
4393764Sroot 		break;
4403764Sroot 
4413764Sroot 	case SIGILL:
4423764Sroot 		IF (sigcode >= 0 &&
4433764Sroot 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
4443764Sroot 			prints(" ("); prints(illinames[sigcode]); prints(")");
4453764Sroot 		FI
4463764Sroot 		break;
4473764Sroot 	}
4483764Sroot }
449