xref: /csrg-svn/old/adb/adb.vax/print.c (revision 17596)
1*17596Ssam static	char sccsid[] = "@(#)print.c 4.8 12/30/84";
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
144*17596Ssam 		/* fall thru... */
145*17596Ssam 
1463764Sroot 	    case '>':
1473764Sroot 		{CHAR		file[64];
1483764Sroot 		CHAR		Ifile[128];
1493764Sroot 		extern CHAR	*Ipath;
1503764Sroot 		INT		index;
1513764Sroot 
1523764Sroot 		index=0;
1533764Sroot 		IF rdc()!=EOR
1543764Sroot 		THEN	REP file[index++]=lastc;
1553764Sroot 			    IF index>=63 THEN error(LONGFIL); FI
1563764Sroot 			PER readchar()!=EOR DONE
1573764Sroot 			file[index]=0;
1583764Sroot 			IF modif=='<'
1593764Sroot 			THEN	IF Ipath THEN
1603764Sroot 					strcpy(Ifile, Ipath);
1613764Sroot 					strcat(Ifile, "/");
1623764Sroot 					strcat(Ifile, file);
1633764Sroot 				FI
1647496Skre 				IF strcmp(file, "-")!=0
1657496Skre 				THEN	iclose(stack, 0);
1667496Skre 					infile=open(file,0);
1677496Skre 					IF infile<0
1687496Skre 					THEN	infile=open(Ifile,0);
1697496Skre 					FI
1707496Skre 				ELSE	lseek(infile, 0L, 0);
1717496Skre 				FI
1727496Skre 				IF infile<0
1733764Sroot 				THEN	infile=0; error(NOTOPEN);
1743764Sroot 				ELSE	IF cntflg
1753764Sroot 					THEN	var[9] = cntval;
1763764Sroot 					ELSE	var[9] = 1;
1773764Sroot 					FI
1783764Sroot 				FI
1797496Skre 			ELSE	oclose();
1807496Skre 				outfile=open(file,1);
1813764Sroot 				IF outfile<0
1823764Sroot 				THEN	outfile=creat(file,0644);
1833764Sroot #ifndef EDDT
1843764Sroot 				ELSE	lseek(outfile,0L,2);
1853764Sroot #endif
1863764Sroot 				FI
1873764Sroot 			FI
1883764Sroot 
1893764Sroot 		ELSE	IF modif == '<'
1903764Sroot 			THEN	iclose(-1, 0);
1917496Skre 			ELSE	oclose();
1923764Sroot 			FI
1933764Sroot 		FI
1943764Sroot 		lp--;
1953764Sroot 		}
1963764Sroot 		break;
1973764Sroot 
1983779Sroot 	    case 'p':
199*17596Ssam 		IF kernel == 0
200*17596Ssam 		THEN	printf("not debugging kernel\n");
201*17596Ssam 		ELSE	IF adrflg
202*17596Ssam 			THEN	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':
210*17596Ssam 		IF adrflg
211*17596Ssam 		THEN	IF adrval < 2 ORF adrval > 16
212*17596Ssam 			THEN	printf("must have 2 <= radix <= 16");
213*17596Ssam 				break;
214*17596Ssam 			FI
2153764Sroot 			printf("radix=%d base ten",radix=adrval);
216*17596Ssam 		FI
2173764Sroot 		break;
2183764Sroot 
2193764Sroot 	    case 'q': case 'Q': case '%':
2203764Sroot 		done();
2213764Sroot 
2223764Sroot 	    case 'w': case 'W':
2233764Sroot 		maxpos=(adrflg?adrval:MAXPOS);
2243764Sroot 		break;
2253764Sroot 
2263764Sroot 	    case 's': case 'S':
2273764Sroot 		maxoff=(adrflg?adrval:MAXOFF);
2283764Sroot 		break;
2293764Sroot 
2303764Sroot 	    case 'v': case 'V':
2313764Sroot 		prints("variables\n");
2323764Sroot 		FOR i=0;i<=35;i++
233*17596Ssam 		DO	IF var[i]
234*17596Ssam 			THEN printc((i<=9 ? '0' : 'a'-10) + i);
235*17596Ssam 				printf(" = %X\n",var[i]);
236*17596Ssam 			FI
2373764Sroot 		OD
2383764Sroot 		break;
2393764Sroot 
2403764Sroot 	    case 'm': case 'M':
2413764Sroot 		printmap("? map",&txtmap);
2423764Sroot 		printmap("/ map",&datmap);
2433764Sroot 		break;
2443764Sroot 
2453764Sroot 	    case 0: case '?':
2463764Sroot 		IF pid
2473764Sroot 		THEN printf("pcs id = %d\n",pid);
2483764Sroot 		ELSE prints("no process\n");
2493764Sroot 		FI
2503764Sroot 		sigprint(); flushbuf();
2513764Sroot 
2523764Sroot 	    case 'r': case 'R':
2533764Sroot 		printregs();
2543764Sroot 		return;
2553764Sroot 
2563764Sroot 	    case 'c': case 'C':
2573764Sroot 		IF adrflg
258*17596Ssam 		THEN	frame=adrval;
2593764Sroot 			word=get(adrval+6,DSP)&0xFFFF;
2603764Sroot 			IF word&0x2000
261*17596Ssam 			THEN	/* 'calls', can figure out argp */
2623764Sroot 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
263*17596Ssam 				WHILE word
264*17596Ssam 				DO	IF word&1
265*17596Ssam 					THEN	argp+=4;
266*17596Ssam 					FI
267*17596Ssam 					word>>=1;
268*17596Ssam 				OD
269*17596Ssam 			ELSE	/* 'callg', can't tell where argp is */
270*17596Ssam 				argp=frame;
2713764Sroot 			FI
2723764Sroot 			callpc=get(frame+16,DSP);
273*17596Ssam 		ELIF kcore
274*17596Ssam 		THEN	argp = pcb.pcb_ap;
2753779Sroot 			frame = pcb.pcb_fp;
2763779Sroot 			callpc = pcb.pcb_pc;
2773779Sroot 		ELSE	argp= *(ADDR *)(((ADDR)&u)+AP);
2783764Sroot 			frame= *(ADDR *)(((ADDR)&u)+FP);
2793764Sroot 			callpc= *(ADDR *)(((ADDR)&u)+PC);
2803764Sroot 		FI
2813764Sroot 		lastframe=0;
2823764Sroot 		ntramp = 0;
2833764Sroot 		WHILE cntval--
2843764Sroot 		DO	char *name;
2853764Sroot 			chkerr();
286*17596Ssam 			IF callpc > 0x80000000 - 0x200 * UPAGES
287*17596Ssam 			THEN	name = "sigtramp";
2883764Sroot 				ntramp++;
289*17596Ssam 			ELSE	ntramp = 0;
2903764Sroot 				findsym(callpc,ISYM);
291*17596Ssam 				IF cursym ANDF
292*17596Ssam 				    !strcmp(cursym->n_un.n_name, "start")
293*17596Ssam 				THEN break;
294*17596Ssam 				FI
295*17596Ssam 				IF cursym
296*17596Ssam 				THEN name = cursym->n_un.n_name;
297*17596Ssam 				ELSE name = "?";
298*17596Ssam 				FI
299*17596Ssam 			FI
3003764Sroot 			printf("%s(", name);
3013764Sroot 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
302*17596Ssam 			LOOP	IF narg==0 THEN break; FI
3033764Sroot 				printf("%R", get(argp += 4, DSP));
3043764Sroot 				IF --narg!=0 THEN printc(','); FI
3053764Sroot 			POOL
306*17596Ssam 			printf(") from %X\n",callpc);
3073764Sroot 
3083764Sroot 			IF modif=='C'
309*17596Ssam 			THEN	WHILE localsym(frame,argp)
310*17596Ssam 				DO	word=get(localval,DSP);
311*17596Ssam 					printf("%8t%s:%10t",
312*17596Ssam 					    cursym->n_un.n_name);
313*17596Ssam 					IF errflg
314*17596Ssam 					THEN prints("?\n"); errflg=0;
315*17596Ssam 					ELSE printf("%R\n",word);
316*17596Ssam 					FI
317*17596Ssam 				OD
3183764Sroot 			FI
3193764Sroot 
320*17596Ssam 			IF ntramp == 1
321*17596Ssam 			THEN callpc=get(frame+84, DSP);
322*17596Ssam 			ELSE callpc=get(frame+16, DSP);
323*17596Ssam 			FI
3243764Sroot 			argp=get(frame+8, DSP);
3253764Sroot 			lastframe=frame;
3263764Sroot 			frame=get(frame+12, DSP)&EVEN;
327*17596Ssam 			IF frame==0 THEN break; FI
328*17596Ssam 			IF !adrflg ANDF !INSTACK(frame)
329*17596Ssam 			THEN	IF !kcore ORF !kstackaddr(frame)
330*17596Ssam 				THEN break;
331*17596Ssam 				FI
3323764Sroot 			FI
3333764Sroot 		OD
3343764Sroot 		break;
3353764Sroot 
3363764Sroot 	    /*print externals*/
3373764Sroot 	    case 'e': case 'E':
338*17596Ssam 		FOR sp = symtab; sp < esymtab; sp++
339*17596Ssam 		DO	IF sp->n_type == (N_DATA|N_EXT) ORF
340*17596Ssam 			   sp->n_type == (N_BSS|N_EXT)
341*17596Ssam 			THEN printf("%s:%12t%R\n", sp->n_un.n_name,
342*17596Ssam 				    get(sp->n_value,DSP));
343*17596Ssam 			FI
344*17596Ssam 		OD
3453764Sroot 		break;
3463764Sroot 
3473764Sroot 	    case 'a': case 'A':
3483764Sroot 		error("No algol 68 on VAX");
3493764Sroot 		/*NOTREACHED*/
3503764Sroot 
3513764Sroot 	    /*print breakpoints*/
3523764Sroot 	    case 'b': case 'B':
3533764Sroot 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
354*17596Ssam 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
355*17596Ssam 		DO	IF bkptr->flag
356*17596Ssam 			THEN	printf("%-8.8d",bkptr->count);
3573764Sroot 				psymoff(leng(bkptr->loc),ISYM,"%24t");
3583764Sroot 				comptr=bkptr->comm;
3593764Sroot 				WHILE *comptr DO printc(*comptr++); OD
360*17596Ssam 			FI
361*17596Ssam 		OD
3623764Sroot 		break;
3633764Sroot 
364*17596Ssam 	    default:
365*17596Ssam 		error(BADMOD);
3663764Sroot 	}
3673764Sroot 
3683764Sroot }
3693764Sroot 
3703764Sroot printmap(s,amap)
3713764Sroot STRING	s; MAP *amap;
3723764Sroot {
3733764Sroot 	int file;
3743764Sroot 	file=amap->ufd;
375*17596Ssam 	printf("%s%12t`%s'\n", s,
376*17596Ssam 	    (file<0 ? "-" : (file==fcor ? corfil : symfil)));
3773764Sroot 	printf("b1 = %-16R",amap->b1);
3783764Sroot 	printf("e1 = %-16R",amap->e1);
3793764Sroot 	printf("f1 = %-16R",amap->f1);
3803764Sroot 	printf("\nb2 = %-16R",amap->b2);
3813764Sroot 	printf("e2 = %-16R",amap->e2);
3823764Sroot 	printf("f2 = %-16R",amap->f2);
3833764Sroot 	printc(EOR);
3843764Sroot }
3853764Sroot 
3863764Sroot printregs()
3873764Sroot {
3883764Sroot 	REG REGPTR	p;
3893764Sroot 	L_INT		v;
3903764Sroot 
3913764Sroot 	FOR p=reglist; p < &reglist[24]; p++
3923777Sroot 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
3933777Sroot 		printf("%s%6t%R %16t", p->rname, v);
3943764Sroot 		valpr(v,(p->roffs==PC?ISYM:DSYM));
3953764Sroot 		printc(EOR);
3963764Sroot 	OD
3973764Sroot 	printpc();
3983764Sroot }
3993764Sroot 
4003777Sroot getreg(regnam) {
4013764Sroot 	REG REGPTR	p;
4023764Sroot 	REG STRING	regptr;
4033764Sroot 	CHAR	*olp;
4043764Sroot 	CHAR		regnxt;
4053764Sroot 
4063764Sroot 	olp=lp;
4073764Sroot 	FOR p=reglist; p < &reglist[24]; p++
4083764Sroot 	DO	regptr=p->rname;
4093764Sroot 		IF (regnam == *regptr++)
4103764Sroot 		THEN
4113764Sroot 			WHILE *regptr
4123764Sroot 			DO IF (regnxt=readchar()) != *regptr++
4133764Sroot 				THEN --regptr; break;
4143764Sroot 				FI
4153764Sroot 			OD
4163764Sroot 			IF *regptr
4173764Sroot 			THEN lp=olp;
4183778Sroot 			ELSE
4193778Sroot 				int i = kcore ? (int)p->rkern : p->roffs;
4203778Sroot 				return (i);
4213764Sroot 			FI
4223764Sroot 		FI
4233764Sroot 	OD
4243764Sroot 	lp=olp;
4253764Sroot 	return(0);
4263764Sroot }
4273764Sroot 
4283764Sroot printpc()
4293764Sroot {
4303764Sroot 	dot= *(ADDR *)(((ADDR)&u)+PC);
4313764Sroot 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
4323764Sroot 	printc(EOR);
4333764Sroot }
4343764Sroot 
4353764Sroot char	*illinames[] = {
4363764Sroot 	"reserved addressing fault",
4373764Sroot 	"priviliged instruction fault",
4383764Sroot 	"reserved operand fault"
4393764Sroot };
4403764Sroot char	*fpenames[] = {
4413764Sroot 	0,
4423764Sroot 	"integer overflow trap",
4433764Sroot 	"integer divide by zero trap",
4443764Sroot 	"floating overflow trap",
4453764Sroot 	"floating/decimal divide by zero trap",
4463764Sroot 	"floating underflow trap",
4473764Sroot 	"decimal overflow trap",
4483764Sroot 	"subscript out of range trap",
4493764Sroot 	"floating overflow fault",
4503764Sroot 	"floating divide by zero fault",
4513764Sroot 	"floating undeflow fault"
4523764Sroot };
4533764Sroot 
4543764Sroot sigprint()
4553764Sroot {
4563764Sroot 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
4573764Sroot 	THEN prints(signals[signo]); FI
4583764Sroot 	switch (signo) {
4593764Sroot 
4603764Sroot 	case SIGFPE:
4613764Sroot 		IF (sigcode > 0 &&
4623764Sroot 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
4633764Sroot 			prints(" ("); prints(fpenames[sigcode]); prints(")");
4643764Sroot 		FI
4653764Sroot 		break;
4663764Sroot 
4673764Sroot 	case SIGILL:
4683764Sroot 		IF (sigcode >= 0 &&
4693764Sroot 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
4703764Sroot 			prints(" ("); prints(illinames[sigcode]); prints(")");
4713764Sroot 		FI
4723764Sroot 		break;
4733764Sroot 	}
4743764Sroot }
475