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