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