xref: /csrg-svn/old/adb/adb.vax/print.c (revision 3764)
1*3764Sroot static	char sccsid[] = "@(#)print.c 4.1 05/14/81";
2*3764Sroot /*
3*3764Sroot  *
4*3764Sroot  *	UNIX debugger
5*3764Sroot  *
6*3764Sroot  */
7*3764Sroot #include "defs.h"
8*3764Sroot 
9*3764Sroot MSG		LONGFIL;
10*3764Sroot MSG		NOTOPEN;
11*3764Sroot MSG		A68BAD;
12*3764Sroot MSG		A68LNK;
13*3764Sroot MSG		BADMOD;
14*3764Sroot 
15*3764Sroot MAP		txtmap;
16*3764Sroot MAP		datmap;
17*3764Sroot 
18*3764Sroot ADDR		lastframe;
19*3764Sroot ADDR		callpc;
20*3764Sroot 
21*3764Sroot INT		infile;
22*3764Sroot INT		outfile;
23*3764Sroot CHAR		*lp;
24*3764Sroot L_INT		maxoff;
25*3764Sroot L_INT		maxpos;
26*3764Sroot INT		radix;
27*3764Sroot 
28*3764Sroot /* symbol management */
29*3764Sroot L_INT		localval;
30*3764Sroot 
31*3764Sroot /* breakpoints */
32*3764Sroot BKPTR		bkpthead;
33*3764Sroot 
34*3764Sroot REGLIST reglist [] = {
35*3764Sroot 		"p1lr", P1LR,
36*3764Sroot 		"p1br",P1BR,
37*3764Sroot 		"p0lr", P0LR,
38*3764Sroot 		"p0br",P0BR,
39*3764Sroot 		"ksp",KSP,
40*3764Sroot 		"esp",ESP,
41*3764Sroot 		"ssp",SSP,
42*3764Sroot 		"psl", PSL,
43*3764Sroot 		"pc", PC,
44*3764Sroot 		"usp",USP,
45*3764Sroot 		"fp", FP,
46*3764Sroot 		"ap", AP,
47*3764Sroot 		"r11", R11,
48*3764Sroot 		"r10", R10,
49*3764Sroot 		"r9", R9,
50*3764Sroot 		"r8", R8,
51*3764Sroot 		"r7", R7,
52*3764Sroot 		"r6", R6,
53*3764Sroot 		"r5", R5,
54*3764Sroot 		"r4", R4,
55*3764Sroot 		"r3", R3,
56*3764Sroot 		"r2", R2,
57*3764Sroot 		"r1", R1,
58*3764Sroot 		"r0", R0,
59*3764Sroot };
60*3764Sroot 
61*3764Sroot char		lastc;
62*3764Sroot 
63*3764Sroot INT		fcor;
64*3764Sroot STRING		errflg;
65*3764Sroot INT		signo;
66*3764Sroot INT		sigcode;
67*3764Sroot 
68*3764Sroot 
69*3764Sroot L_INT		dot;
70*3764Sroot L_INT		var[];
71*3764Sroot STRING		symfil;
72*3764Sroot STRING		corfil;
73*3764Sroot INT		pid;
74*3764Sroot L_INT		adrval;
75*3764Sroot INT		adrflg;
76*3764Sroot L_INT		cntval;
77*3764Sroot INT		cntflg;
78*3764Sroot 
79*3764Sroot STRING		signals[] = {
80*3764Sroot 		"",
81*3764Sroot 		"hangup",
82*3764Sroot 		"interrupt",
83*3764Sroot 		"quit",
84*3764Sroot 		"illegal instruction",
85*3764Sroot 		"trace/BPT",
86*3764Sroot 		"IOT",
87*3764Sroot 		"EMT",
88*3764Sroot 		"floating exception",
89*3764Sroot 		"killed",
90*3764Sroot 		"bus error",
91*3764Sroot 		"memory fault",
92*3764Sroot 		"bad system call",
93*3764Sroot 		"broken pipe",
94*3764Sroot 		"alarm call",
95*3764Sroot 		"terminated",
96*3764Sroot 		"signal 16",
97*3764Sroot 		"stop (signal)",
98*3764Sroot 		"stop (tty)",
99*3764Sroot 		"continue (signal)",
100*3764Sroot 		"child termination",
101*3764Sroot 		"stop (tty input)",
102*3764Sroot 		"stop (tty output)",
103*3764Sroot 		"input available (signal)",
104*3764Sroot 		"cpu timelimit",
105*3764Sroot 		"file sizelimit",
106*3764Sroot 		"signal 26",
107*3764Sroot 		"signal 27",
108*3764Sroot 		"signal 28",
109*3764Sroot 		"signal 29",
110*3764Sroot 		"signal 30",
111*3764Sroot 		"signal 31",
112*3764Sroot };
113*3764Sroot 
114*3764Sroot /* general printing routines ($) */
115*3764Sroot 
116*3764Sroot printtrace(modif)
117*3764Sroot {
118*3764Sroot 	INT		narg, i, stat, name, limit;
119*3764Sroot 	POS		dynam;
120*3764Sroot 	REG BKPTR	bkptr;
121*3764Sroot 	CHAR		hi, lo;
122*3764Sroot 	ADDR		word;
123*3764Sroot 	STRING		comptr;
124*3764Sroot 	ADDR		argp, frame, link;
125*3764Sroot 	register struct nlist *sp;
126*3764Sroot 	INT		stack;
127*3764Sroot 	INT		ntramp;
128*3764Sroot 
129*3764Sroot 	IF cntflg==0 THEN cntval = -1; FI
130*3764Sroot 
131*3764Sroot 	switch (modif) {
132*3764Sroot 
133*3764Sroot 	    case '<':
134*3764Sroot 		IF cntval == 0
135*3764Sroot 		THEN	WHILE readchar() != EOR
136*3764Sroot 			DO OD
137*3764Sroot 			lp--;
138*3764Sroot 			break;
139*3764Sroot 		FI
140*3764Sroot 		IF rdc() == '<'
141*3764Sroot 		THEN	stack = 1;
142*3764Sroot 		ELSE	stack = 0; lp--;
143*3764Sroot 		FI
144*3764Sroot 							/* fall through */
145*3764Sroot 	    case '>':
146*3764Sroot 		{CHAR		file[64];
147*3764Sroot 		CHAR		Ifile[128];
148*3764Sroot 		extern CHAR	*Ipath;
149*3764Sroot 		INT		index;
150*3764Sroot 
151*3764Sroot 		index=0;
152*3764Sroot 		IF modif=='<'
153*3764Sroot 		THEN	iclose(stack, 0);
154*3764Sroot 		ELSE	oclose();
155*3764Sroot 		FI
156*3764Sroot 		IF rdc()!=EOR
157*3764Sroot 		THEN	REP file[index++]=lastc;
158*3764Sroot 			    IF index>=63 THEN error(LONGFIL); FI
159*3764Sroot 			PER readchar()!=EOR DONE
160*3764Sroot 			file[index]=0;
161*3764Sroot 			IF modif=='<'
162*3764Sroot 			THEN	IF Ipath THEN
163*3764Sroot 					strcpy(Ifile, Ipath);
164*3764Sroot 					strcat(Ifile, "/");
165*3764Sroot 					strcat(Ifile, file);
166*3764Sroot 				FI
167*3764Sroot 				infile=open(file,0);
168*3764Sroot 				IF infile<0 && (infile=open(Ifile,0))<0
169*3764Sroot 				THEN	infile=0; error(NOTOPEN);
170*3764Sroot 				ELSE	IF cntflg
171*3764Sroot 					THEN	var[9] = cntval;
172*3764Sroot 					ELSE	var[9] = 1;
173*3764Sroot 					FI
174*3764Sroot 				FI
175*3764Sroot 			ELSE	outfile=open(file,1);
176*3764Sroot 				IF outfile<0
177*3764Sroot 				THEN	outfile=creat(file,0644);
178*3764Sroot #ifndef EDDT
179*3764Sroot 				ELSE	lseek(outfile,0L,2);
180*3764Sroot #endif
181*3764Sroot 				FI
182*3764Sroot 			FI
183*3764Sroot 
184*3764Sroot 		ELSE	IF modif == '<'
185*3764Sroot 			THEN	iclose(-1, 0);
186*3764Sroot 			FI
187*3764Sroot 		FI
188*3764Sroot 		lp--;
189*3764Sroot 		}
190*3764Sroot 		break;
191*3764Sroot 
192*3764Sroot 	    case 'd':
193*3764Sroot 		if (adrflg) {
194*3764Sroot 			if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
195*3764Sroot 			printf("radix=%d base ten",radix=adrval);
196*3764Sroot 		}
197*3764Sroot 		break;
198*3764Sroot 
199*3764Sroot 	    case 'q': case 'Q': case '%':
200*3764Sroot 		done();
201*3764Sroot 
202*3764Sroot 	    case 'w': case 'W':
203*3764Sroot 		maxpos=(adrflg?adrval:MAXPOS);
204*3764Sroot 		break;
205*3764Sroot 
206*3764Sroot 	    case 's': case 'S':
207*3764Sroot 		maxoff=(adrflg?adrval:MAXOFF);
208*3764Sroot 		break;
209*3764Sroot 
210*3764Sroot 	    case 'v': case 'V':
211*3764Sroot 		prints("variables\n");
212*3764Sroot 		FOR i=0;i<=35;i++
213*3764Sroot 		DO IF var[i]
214*3764Sroot 		   THEN printc((i<=9 ? '0' : 'a'-10) + i);
215*3764Sroot 			printf(" = %Q\n",var[i]);
216*3764Sroot 		   FI
217*3764Sroot 		OD
218*3764Sroot 		break;
219*3764Sroot 
220*3764Sroot 	    case 'm': case 'M':
221*3764Sroot 		printmap("? map",&txtmap);
222*3764Sroot 		printmap("/ map",&datmap);
223*3764Sroot 		break;
224*3764Sroot 
225*3764Sroot 	    case 0: case '?':
226*3764Sroot 		IF pid
227*3764Sroot 		THEN printf("pcs id = %d\n",pid);
228*3764Sroot 		ELSE prints("no process\n");
229*3764Sroot 		FI
230*3764Sroot 		sigprint(); flushbuf();
231*3764Sroot 
232*3764Sroot 	    case 'r': case 'R':
233*3764Sroot 		printregs();
234*3764Sroot 		return;
235*3764Sroot 
236*3764Sroot 	    case 'c': case 'C':
237*3764Sroot 		IF adrflg
238*3764Sroot 		THEN frame=adrval;
239*3764Sroot 			word=get(adrval+6,DSP)&0xFFFF;
240*3764Sroot 			IF word&0x2000
241*3764Sroot 			THEN /* 'calls', can figure out argp */
242*3764Sroot 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
243*3764Sroot 				WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
244*3764Sroot 			ELSE /* 'callg', can't tell where argp is */ argp=frame;
245*3764Sroot 			FI
246*3764Sroot 			callpc=get(frame+16,DSP);
247*3764Sroot 		ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
248*3764Sroot 			frame= *(ADDR *)(((ADDR)&u)+FP);
249*3764Sroot 			callpc= *(ADDR *)(((ADDR)&u)+PC);
250*3764Sroot 		FI
251*3764Sroot 		lastframe=0;
252*3764Sroot 		ntramp = 0;
253*3764Sroot 		WHILE cntval--
254*3764Sroot 		DO	char *name;
255*3764Sroot 			chkerr();
256*3764Sroot 			if (callpc > 0x80000000 - 0x200 * UPAGES) {
257*3764Sroot 				name = "sigtramp";
258*3764Sroot 				ntramp++;
259*3764Sroot 			} else {
260*3764Sroot 				ntramp = 0;
261*3764Sroot 				findsym(callpc,ISYM);
262*3764Sroot 				if (cursym &&
263*3764Sroot 				    !strcmp(cursym->n_un.n_name, "start"))
264*3764Sroot 					break;
265*3764Sroot 				if (cursym)
266*3764Sroot 					name = cursym->n_un.n_name;
267*3764Sroot 				else
268*3764Sroot 					name = "?";
269*3764Sroot 			}
270*3764Sroot 			printf("%s(", name);
271*3764Sroot 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
272*3764Sroot 			LOOP IF narg==0 THEN break; FI
273*3764Sroot 				printf("%R", get(argp += 4, DSP));
274*3764Sroot 				IF --narg!=0 THEN printc(','); FI
275*3764Sroot 			POOL
276*3764Sroot 			printf(") from %X\n",callpc);  /* jkf mod */
277*3764Sroot 
278*3764Sroot 			IF modif=='C'
279*3764Sroot 			THEN WHILE localsym(frame,argp)
280*3764Sroot 			     DO word=get(localval,DSP);
281*3764Sroot 				printf("%8t%s:%10t", cursym->n_un.n_name);
282*3764Sroot 				IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
283*3764Sroot 			     OD
284*3764Sroot 			FI
285*3764Sroot 
286*3764Sroot 			if (ntramp == 1)
287*3764Sroot 				callpc=get(frame+64, DSP);
288*3764Sroot 			else
289*3764Sroot 				callpc=get(frame+16, DSP);
290*3764Sroot 			argp=get(frame+8, DSP);
291*3764Sroot 			lastframe=frame;
292*3764Sroot 			frame=get(frame+12, DSP)&EVEN;
293*3764Sroot 			IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
294*3764Sroot 			THEN break;
295*3764Sroot 			FI
296*3764Sroot 		OD
297*3764Sroot 		break;
298*3764Sroot 
299*3764Sroot 	    /*print externals*/
300*3764Sroot 	    case 'e': case 'E':
301*3764Sroot 		for (sp = symtab; sp < esymtab; sp++) {
302*3764Sroot 		   if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
303*3764Sroot 		   	printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
304*3764Sroot 		}
305*3764Sroot 		break;
306*3764Sroot 
307*3764Sroot 	    case 'a': case 'A':
308*3764Sroot 		error("No algol 68 on VAX");
309*3764Sroot 		/*NOTREACHED*/
310*3764Sroot 
311*3764Sroot 	    /*print breakpoints*/
312*3764Sroot 	    case 'b': case 'B':
313*3764Sroot 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
314*3764Sroot 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
315*3764Sroot 			if (bkptr->flag) {
316*3764Sroot 		   		printf("%-8.8d",bkptr->count);
317*3764Sroot 				psymoff(leng(bkptr->loc),ISYM,"%24t");
318*3764Sroot 				comptr=bkptr->comm;
319*3764Sroot 				WHILE *comptr DO printc(*comptr++); OD
320*3764Sroot 			}
321*3764Sroot 		break;
322*3764Sroot 
323*3764Sroot 	    default: error(BADMOD);
324*3764Sroot 	}
325*3764Sroot 
326*3764Sroot }
327*3764Sroot 
328*3764Sroot printmap(s,amap)
329*3764Sroot STRING	s; MAP *amap;
330*3764Sroot {
331*3764Sroot 	int file;
332*3764Sroot 	file=amap->ufd;
333*3764Sroot 	printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
334*3764Sroot 	printf("b1 = %-16R",amap->b1);
335*3764Sroot 	printf("e1 = %-16R",amap->e1);
336*3764Sroot 	printf("f1 = %-16R",amap->f1);
337*3764Sroot 	printf("\nb2 = %-16R",amap->b2);
338*3764Sroot 	printf("e2 = %-16R",amap->e2);
339*3764Sroot 	printf("f2 = %-16R",amap->f2);
340*3764Sroot 	printc(EOR);
341*3764Sroot }
342*3764Sroot 
343*3764Sroot printregs()
344*3764Sroot {
345*3764Sroot 	REG REGPTR	p;
346*3764Sroot 	L_INT		v;
347*3764Sroot 
348*3764Sroot 	FOR p=reglist; p < &reglist[24]; p++
349*3764Sroot 	DO	printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
350*3764Sroot 		valpr(v,(p->roffs==PC?ISYM:DSYM));
351*3764Sroot 		printc(EOR);
352*3764Sroot 	OD
353*3764Sroot 	printpc();
354*3764Sroot }
355*3764Sroot 
356*3764Sroot getreg(regnam)
357*3764Sroot {
358*3764Sroot 	REG REGPTR	p;
359*3764Sroot 	REG STRING	regptr;
360*3764Sroot 	CHAR	*olp;
361*3764Sroot 	CHAR		regnxt;
362*3764Sroot 
363*3764Sroot 	olp=lp;
364*3764Sroot 	FOR p=reglist; p < &reglist[24]; p++
365*3764Sroot 	DO	regptr=p->rname;
366*3764Sroot 		IF (regnam == *regptr++)
367*3764Sroot 		THEN
368*3764Sroot 			WHILE *regptr
369*3764Sroot 			DO IF (regnxt=readchar()) != *regptr++
370*3764Sroot 				THEN --regptr; break;
371*3764Sroot 				FI
372*3764Sroot 			OD
373*3764Sroot 			IF *regptr
374*3764Sroot 			THEN lp=olp;
375*3764Sroot 			ELSE return(p->roffs);
376*3764Sroot 			FI
377*3764Sroot 		FI
378*3764Sroot 	OD
379*3764Sroot 	lp=olp;
380*3764Sroot 	return(0);
381*3764Sroot }
382*3764Sroot 
383*3764Sroot printpc()
384*3764Sroot {
385*3764Sroot 	dot= *(ADDR *)(((ADDR)&u)+PC);
386*3764Sroot 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
387*3764Sroot 	printc(EOR);
388*3764Sroot }
389*3764Sroot 
390*3764Sroot char	*illinames[] = {
391*3764Sroot 	"reserved addressing fault",
392*3764Sroot 	"priviliged instruction fault",
393*3764Sroot 	"reserved operand fault"
394*3764Sroot };
395*3764Sroot char	*fpenames[] = {
396*3764Sroot 	0,
397*3764Sroot 	"integer overflow trap",
398*3764Sroot 	"integer divide by zero trap",
399*3764Sroot 	"floating overflow trap",
400*3764Sroot 	"floating/decimal divide by zero trap",
401*3764Sroot 	"floating underflow trap",
402*3764Sroot 	"decimal overflow trap",
403*3764Sroot 	"subscript out of range trap",
404*3764Sroot 	"floating overflow fault",
405*3764Sroot 	"floating divide by zero fault",
406*3764Sroot 	"floating undeflow fault"
407*3764Sroot };
408*3764Sroot 
409*3764Sroot sigprint()
410*3764Sroot {
411*3764Sroot 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
412*3764Sroot 	THEN prints(signals[signo]); FI
413*3764Sroot 	switch (signo) {
414*3764Sroot 
415*3764Sroot 	case SIGFPE:
416*3764Sroot 		IF (sigcode > 0 &&
417*3764Sroot 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
418*3764Sroot 			prints(" ("); prints(fpenames[sigcode]); prints(")");
419*3764Sroot 		FI
420*3764Sroot 		break;
421*3764Sroot 
422*3764Sroot 	case SIGILL:
423*3764Sroot 		IF (sigcode >= 0 &&
424*3764Sroot 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
425*3764Sroot 			prints(" ("); prints(illinames[sigcode]); prints(")");
426*3764Sroot 		FI
427*3764Sroot 		break;
428*3764Sroot 	}
429*3764Sroot }
430