xref: /csrg-svn/old/adb/adb.vax/print.c (revision 7496)
1*7496Skre static	char sccsid[] = "@(#)print.c 4.5 07/23/82";
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 rdc()!=EOR
1533764Sroot 		THEN	REP file[index++]=lastc;
1543764Sroot 			    IF index>=63 THEN error(LONGFIL); FI
1553764Sroot 			PER readchar()!=EOR DONE
1563764Sroot 			file[index]=0;
1573764Sroot 			IF modif=='<'
1583764Sroot 			THEN	IF Ipath THEN
1593764Sroot 					strcpy(Ifile, Ipath);
1603764Sroot 					strcat(Ifile, "/");
1613764Sroot 					strcat(Ifile, file);
1623764Sroot 				FI
163*7496Skre 				IF strcmp(file, "-")!=0
164*7496Skre 				THEN	iclose(stack, 0);
165*7496Skre 					infile=open(file,0);
166*7496Skre 					IF infile<0
167*7496Skre 					THEN	infile=open(Ifile,0);
168*7496Skre 					FI
169*7496Skre 				ELSE	lseek(infile, 0L, 0);
170*7496Skre 				FI
171*7496Skre 				IF infile<0
1723764Sroot 				THEN	infile=0; error(NOTOPEN);
1733764Sroot 				ELSE	IF cntflg
1743764Sroot 					THEN	var[9] = cntval;
1753764Sroot 					ELSE	var[9] = 1;
1763764Sroot 					FI
1773764Sroot 				FI
178*7496Skre 			ELSE	oclose();
179*7496Skre 				outfile=open(file,1);
1803764Sroot 				IF outfile<0
1813764Sroot 				THEN	outfile=creat(file,0644);
1823764Sroot #ifndef EDDT
1833764Sroot 				ELSE	lseek(outfile,0L,2);
1843764Sroot #endif
1853764Sroot 				FI
1863764Sroot 			FI
1873764Sroot 
1883764Sroot 		ELSE	IF modif == '<'
1893764Sroot 			THEN	iclose(-1, 0);
190*7496Skre 			ELSE	oclose();
1913764Sroot 			FI
1923764Sroot 		FI
1933764Sroot 		lp--;
1943764Sroot 		}
1953764Sroot 		break;
1963764Sroot 
1973779Sroot 	    case 'p':
1983779Sroot 		IF kernel == 0 THEN
1993779Sroot 			printf("not debugging kernel\n");
2003779Sroot 		ELSE
2013779Sroot 			IF adrflg THEN
2023779Sroot 				int pte = access(RD, dot, DSP, 0);
2033779Sroot 				masterpcbb = (pte&PG_PFNUM)*512;
2043779Sroot 			FI
2053779Sroot 			getpcb();
2063779Sroot 		FI
2073779Sroot 		break;
2083779Sroot 
2093764Sroot 	    case 'd':
2103764Sroot 		if (adrflg) {
2113764Sroot 			if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
2123764Sroot 			printf("radix=%d base ten",radix=adrval);
2133764Sroot 		}
2143764Sroot 		break;
2153764Sroot 
2163764Sroot 	    case 'q': case 'Q': case '%':
2173764Sroot 		done();
2183764Sroot 
2193764Sroot 	    case 'w': case 'W':
2203764Sroot 		maxpos=(adrflg?adrval:MAXPOS);
2213764Sroot 		break;
2223764Sroot 
2233764Sroot 	    case 's': case 'S':
2243764Sroot 		maxoff=(adrflg?adrval:MAXOFF);
2253764Sroot 		break;
2263764Sroot 
2273764Sroot 	    case 'v': case 'V':
2283764Sroot 		prints("variables\n");
2293764Sroot 		FOR i=0;i<=35;i++
2303764Sroot 		DO IF var[i]
2313764Sroot 		   THEN printc((i<=9 ? '0' : 'a'-10) + i);
232*7496Skre 			printf(" = %X\n",var[i]);
2333764Sroot 		   FI
2343764Sroot 		OD
2353764Sroot 		break;
2363764Sroot 
2373764Sroot 	    case 'm': case 'M':
2383764Sroot 		printmap("? map",&txtmap);
2393764Sroot 		printmap("/ map",&datmap);
2403764Sroot 		break;
2413764Sroot 
2423764Sroot 	    case 0: case '?':
2433764Sroot 		IF pid
2443764Sroot 		THEN printf("pcs id = %d\n",pid);
2453764Sroot 		ELSE prints("no process\n");
2463764Sroot 		FI
2473764Sroot 		sigprint(); flushbuf();
2483764Sroot 
2493764Sroot 	    case 'r': case 'R':
2503764Sroot 		printregs();
2513764Sroot 		return;
2523764Sroot 
2533764Sroot 	    case 'c': case 'C':
2543764Sroot 		IF adrflg
2553764Sroot 		THEN frame=adrval;
2563764Sroot 			word=get(adrval+6,DSP)&0xFFFF;
2573764Sroot 			IF word&0x2000
2583764Sroot 			THEN /* 'calls', can figure out argp */
2593764Sroot 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
2603764Sroot 				WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
2613764Sroot 			ELSE /* 'callg', can't tell where argp is */ argp=frame;
2623764Sroot 			FI
2633764Sroot 			callpc=get(frame+16,DSP);
2643779Sroot 		ELIF kcore THEN
2653779Sroot 			argp = pcb.pcb_ap;
2663779Sroot 			frame = pcb.pcb_fp;
2673779Sroot 			callpc = pcb.pcb_pc;
2683779Sroot 		ELSE	argp= *(ADDR *)(((ADDR)&u)+AP);
2693764Sroot 			frame= *(ADDR *)(((ADDR)&u)+FP);
2703764Sroot 			callpc= *(ADDR *)(((ADDR)&u)+PC);
2713764Sroot 		FI
2723764Sroot 		lastframe=0;
2733764Sroot 		ntramp = 0;
2743764Sroot 		WHILE cntval--
2753764Sroot 		DO	char *name;
2763764Sroot 			chkerr();
2773764Sroot 			if (callpc > 0x80000000 - 0x200 * UPAGES) {
2783764Sroot 				name = "sigtramp";
2793764Sroot 				ntramp++;
2803764Sroot 			} else {
2813764Sroot 				ntramp = 0;
2823764Sroot 				findsym(callpc,ISYM);
2833764Sroot 				if (cursym &&
284*7496Skre 				    !strcmp(cursym->n_un.n_name, "start"))
2853764Sroot 					break;
2863764Sroot 				if (cursym)
2873764Sroot 					name = cursym->n_un.n_name;
2883764Sroot 				else
2893764Sroot 					name = "?";
2903764Sroot 			}
2913764Sroot 			printf("%s(", name);
2923764Sroot 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
2933764Sroot 			LOOP IF narg==0 THEN break; FI
2943764Sroot 				printf("%R", get(argp += 4, DSP));
2953764Sroot 				IF --narg!=0 THEN printc(','); FI
2963764Sroot 			POOL
2973764Sroot 			printf(") from %X\n",callpc);  /* jkf mod */
2983764Sroot 
2993764Sroot 			IF modif=='C'
3003764Sroot 			THEN WHILE localsym(frame,argp)
3013764Sroot 			     DO word=get(localval,DSP);
3023764Sroot 				printf("%8t%s:%10t", cursym->n_un.n_name);
3033764Sroot 				IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
3043764Sroot 			     OD
3053764Sroot 			FI
3063764Sroot 
3073764Sroot 			if (ntramp == 1)
3083764Sroot 				callpc=get(frame+64, DSP);
3093764Sroot 			else
3103764Sroot 				callpc=get(frame+16, DSP);
3113764Sroot 			argp=get(frame+8, DSP);
3123764Sroot 			lastframe=frame;
3133764Sroot 			frame=get(frame+12, DSP)&EVEN;
3143764Sroot 			IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
3153764Sroot 			THEN break;
3163764Sroot 			FI
3173764Sroot 		OD
3183764Sroot 		break;
3193764Sroot 
3203764Sroot 	    /*print externals*/
3213764Sroot 	    case 'e': case 'E':
3223764Sroot 		for (sp = symtab; sp < esymtab; sp++) {
3233764Sroot 		   if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
3243764Sroot 		   	printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
3253764Sroot 		}
3263764Sroot 		break;
3273764Sroot 
3283764Sroot 	    case 'a': case 'A':
3293764Sroot 		error("No algol 68 on VAX");
3303764Sroot 		/*NOTREACHED*/
3313764Sroot 
3323764Sroot 	    /*print breakpoints*/
3333764Sroot 	    case 'b': case 'B':
3343764Sroot 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
3353764Sroot 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
3363764Sroot 			if (bkptr->flag) {
3373764Sroot 		   		printf("%-8.8d",bkptr->count);
3383764Sroot 				psymoff(leng(bkptr->loc),ISYM,"%24t");
3393764Sroot 				comptr=bkptr->comm;
3403764Sroot 				WHILE *comptr DO printc(*comptr++); OD
3413764Sroot 			}
3423764Sroot 		break;
3433764Sroot 
3443764Sroot 	    default: error(BADMOD);
3453764Sroot 	}
3463764Sroot 
3473764Sroot }
3483764Sroot 
3493764Sroot printmap(s,amap)
3503764Sroot STRING	s; MAP *amap;
3513764Sroot {
3523764Sroot 	int file;
3533764Sroot 	file=amap->ufd;
3543764Sroot 	printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
3553764Sroot 	printf("b1 = %-16R",amap->b1);
3563764Sroot 	printf("e1 = %-16R",amap->e1);
3573764Sroot 	printf("f1 = %-16R",amap->f1);
3583764Sroot 	printf("\nb2 = %-16R",amap->b2);
3593764Sroot 	printf("e2 = %-16R",amap->e2);
3603764Sroot 	printf("f2 = %-16R",amap->f2);
3613764Sroot 	printc(EOR);
3623764Sroot }
3633764Sroot 
3643764Sroot printregs()
3653764Sroot {
3663764Sroot 	REG REGPTR	p;
3673764Sroot 	L_INT		v;
3683764Sroot 
3693764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3703777Sroot 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
3713777Sroot 		printf("%s%6t%R %16t", p->rname, v);
3723764Sroot 		valpr(v,(p->roffs==PC?ISYM:DSYM));
3733764Sroot 		printc(EOR);
3743764Sroot 	OD
3753764Sroot 	printpc();
3763764Sroot }
3773764Sroot 
3783777Sroot getreg(regnam) {
3793764Sroot 	REG REGPTR	p;
3803764Sroot 	REG STRING	regptr;
3813764Sroot 	CHAR	*olp;
3823764Sroot 	CHAR		regnxt;
3833764Sroot 
3843764Sroot 	olp=lp;
3853764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3863764Sroot 	DO	regptr=p->rname;
3873764Sroot 		IF (regnam == *regptr++)
3883764Sroot 		THEN
3893764Sroot 			WHILE *regptr
3903764Sroot 			DO IF (regnxt=readchar()) != *regptr++
3913764Sroot 				THEN --regptr; break;
3923764Sroot 				FI
3933764Sroot 			OD
3943764Sroot 			IF *regptr
3953764Sroot 			THEN lp=olp;
3963778Sroot 			ELSE
3973778Sroot 				int i = kcore ? (int)p->rkern : p->roffs;
3983778Sroot 				return (i);
3993764Sroot 			FI
4003764Sroot 		FI
4013764Sroot 	OD
4023764Sroot 	lp=olp;
4033764Sroot 	return(0);
4043764Sroot }
4053764Sroot 
4063764Sroot printpc()
4073764Sroot {
4083764Sroot 	dot= *(ADDR *)(((ADDR)&u)+PC);
4093764Sroot 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
4103764Sroot 	printc(EOR);
4113764Sroot }
4123764Sroot 
4133764Sroot char	*illinames[] = {
4143764Sroot 	"reserved addressing fault",
4153764Sroot 	"priviliged instruction fault",
4163764Sroot 	"reserved operand fault"
4173764Sroot };
4183764Sroot char	*fpenames[] = {
4193764Sroot 	0,
4203764Sroot 	"integer overflow trap",
4213764Sroot 	"integer divide by zero trap",
4223764Sroot 	"floating overflow trap",
4233764Sroot 	"floating/decimal divide by zero trap",
4243764Sroot 	"floating underflow trap",
4253764Sroot 	"decimal overflow trap",
4263764Sroot 	"subscript out of range trap",
4273764Sroot 	"floating overflow fault",
4283764Sroot 	"floating divide by zero fault",
4293764Sroot 	"floating undeflow fault"
4303764Sroot };
4313764Sroot 
4323764Sroot sigprint()
4333764Sroot {
4343764Sroot 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
4353764Sroot 	THEN prints(signals[signo]); FI
4363764Sroot 	switch (signo) {
4373764Sroot 
4383764Sroot 	case SIGFPE:
4393764Sroot 		IF (sigcode > 0 &&
4403764Sroot 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
4413764Sroot 			prints(" ("); prints(fpenames[sigcode]); prints(")");
4423764Sroot 		FI
4433764Sroot 		break;
4443764Sroot 
4453764Sroot 	case SIGILL:
4463764Sroot 		IF (sigcode >= 0 &&
4473764Sroot 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
4483764Sroot 			prints(" ("); prints(illinames[sigcode]); prints(")");
4493764Sroot 		FI
4503764Sroot 		break;
4513764Sroot 	}
4523764Sroot }
453