xref: /original-bsd/old/adb/adb.vax/print.c (revision e59fb703)
1 static	char sccsid[] = "@(#)print.c 4.11 05/02/85";
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 thru... */
145 
146 	    case '>':
147 		{CHAR		file[64];
148 		CHAR		Ifile[128];
149 		extern CHAR	*Ipath;
150 		INT		index;
151 
152 		index=0;
153 		IF rdc()!=EOR
154 		THEN	REP file[index++]=lastc;
155 			    IF index>=63 THEN error(LONGFIL); FI
156 			PER readchar()!=EOR DONE
157 			file[index]=0;
158 			IF modif=='<'
159 			THEN	IF Ipath THEN
160 					strcpy(Ifile, Ipath);
161 					strcat(Ifile, "/");
162 					strcat(Ifile, file);
163 				FI
164 				IF strcmp(file, "-")!=0
165 				THEN	iclose(stack, 0);
166 					infile=open(file,0);
167 					IF infile<0
168 					THEN	infile=open(Ifile,0);
169 					FI
170 				ELSE	lseek(infile, 0L, 0);
171 				FI
172 				IF infile<0
173 				THEN	infile=0; error(NOTOPEN);
174 				ELSE	IF cntflg
175 					THEN	var[9] = cntval;
176 					ELSE	var[9] = 1;
177 					FI
178 				FI
179 			ELSE	oclose();
180 				outfile=open(file,1);
181 				IF outfile<0
182 				THEN	outfile=creat(file,0644);
183 #ifndef EDDT
184 				ELSE	lseek(outfile,0L,2);
185 #endif
186 				FI
187 			FI
188 
189 		ELSE	IF modif == '<'
190 			THEN	iclose(-1, 0);
191 			ELSE	oclose();
192 			FI
193 		FI
194 		lp--;
195 		}
196 		break;
197 
198 	    case 'p':
199 		IF kernel == 0
200 		THEN	printf("not debugging kernel\n");
201 		ELSE	IF adrflg
202 			THEN	int pte = access(RD, dot, DSP, 0);
203 				masterpcbb = (pte&PG_PFNUM)*512;
204 			FI
205 			getpcb();
206 		FI
207 		break;
208 
209 	    case 'd':
210 		IF adrflg
211 		THEN	IF adrval < 2 ORF adrval > 16
212 			THEN	printf("must have 2 <= radix <= 16");
213 				break;
214 			FI
215 			printf("radix=%d base ten",radix=adrval);
216 		FI
217 		break;
218 
219 	    case 'q': case 'Q': case '%':
220 		done();
221 
222 	    case 'w': case 'W':
223 		maxpos=(adrflg?adrval:MAXPOS);
224 		break;
225 
226 	    case 's': case 'S':
227 		maxoff=(adrflg?adrval:MAXOFF);
228 		break;
229 
230 	    case 'v': case 'V':
231 		prints("variables\n");
232 		FOR i=0;i<=35;i++
233 		DO	IF var[i]
234 			THEN printc((i<=9 ? '0' : 'a'-10) + i);
235 				printf(" = %x\n",var[i]);
236 			FI
237 		OD
238 		break;
239 
240 	    case 'm': case 'M':
241 		printmap("? map",&txtmap);
242 		printmap("/ map",&datmap);
243 		break;
244 
245 	    case 0: case '?':
246 		IF pid
247 		THEN printf("pcs id = %d\n",pid);
248 		ELSE prints("no process\n");
249 		FI
250 		sigprint(); flushbuf();
251 
252 	    case 'r': case 'R':
253 		printregs();
254 		return;
255 
256 	    case 'c': case 'C':
257 		IF adrflg
258 		THEN	frame=adrval;
259 			word=get(adrval+6,DSP)&0xFFFF;
260 			IF word&0x2000
261 			THEN	/* 'calls', can figure out argp */
262 				argp=adrval+20+((word>>14)&3); word &= 0xFFF;
263 				WHILE word
264 				DO	IF word&1
265 					THEN	argp+=4;
266 					FI
267 					word>>=1;
268 				OD
269 			ELSE	/* 'callg', can't tell where argp is */
270 				argp=frame;
271 			FI
272 			callpc=get(frame+16,DSP);
273 		ELIF kcore
274 		THEN	argp = pcb.pcb_ap;
275 			frame = pcb.pcb_fp;
276 			callpc = pcb.pcb_pc;
277 		ELSE	argp= *(ADDR *)(((ADDR)&u)+AP);
278 			frame= *(ADDR *)(((ADDR)&u)+FP);
279 			callpc= *(ADDR *)(((ADDR)&u)+PC);
280 		FI
281 		lastframe=0;
282 		ntramp = 0;
283 		WHILE cntval--
284 		DO	char *name;
285 			chkerr();
286 			/* if in extended pcb must be signal trampoline code */
287 			IF KERNOFF - ctob(UPAGES) < callpc ANDF
288 			    (unsigned)callpc < KERNOFF
289 			THEN	name = "sigtramp";
290 				ntramp++;
291 			ELSE	ntramp = 0;
292 				findsym(callpc,ISYM);
293 				IF cursym ANDF
294 				    !strcmp(cursym->n_un.n_name, "start")
295 				THEN break;
296 				FI
297 				IF cursym
298 				THEN name = cursym->n_un.n_name;
299 				ELSE name = "?";
300 				FI
301 			FI
302 			printf("%s(", name);
303 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
304 			LOOP	IF narg==0 THEN break; FI
305 				printf("%R", get(argp += 4, DSP));
306 				IF --narg!=0 THEN printc(','); FI
307 			POOL
308 			IF ntramp == 1
309 			THEN callpc=get(frame+92, DSP);
310 			ELSE callpc=get(frame+16, DSP);
311 			FI
312 			IF callpc != 0
313 			THEN	prints(") from ");
314 				psymoff(callpc, ISYM, "\n");
315 			ELSE	prints(")\n");
316 			FI
317 
318 			IF modif=='C'
319 			THEN	WHILE localsym(frame,argp)
320 				DO	word=get(localval,DSP);
321 					printf("%8t%s:%10t",
322 					    cursym->n_un.n_name);
323 					IF errflg
324 					THEN prints("?\n"); errflg=0;
325 					ELSE printf("%R\n",word);
326 					FI
327 				OD
328 			FI
329 
330 			argp=get(frame+8, DSP);
331 			lastframe=frame;
332 			frame=get(frame+12, DSP)&EVEN;
333 			IF frame==0 THEN break; FI
334 			IF !adrflg ANDF !INSTACK(frame)
335 			THEN	IF !kcore ORF !kstackaddr(frame)
336 				THEN break;
337 				FI
338 			FI
339 		OD
340 		break;
341 
342 	    /*print externals*/
343 	    case 'e': case 'E':
344 		FOR sp = symtab; sp < esymtab; sp++
345 		DO	IF sp->n_type == (N_DATA|N_EXT) ORF
346 			   sp->n_type == (N_BSS|N_EXT)
347 			THEN printf("%s:%12t%R\n", sp->n_un.n_name,
348 				    get(sp->n_value,DSP));
349 			FI
350 		OD
351 		break;
352 
353 	    case 'a': case 'A':
354 		error("No algol 68 on VAX");
355 		/*NOTREACHED*/
356 
357 	    /*print breakpoints*/
358 	    case 'b': case 'B':
359 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
360 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
361 		DO	IF bkptr->flag
362 			THEN	printf("%-8.8d",bkptr->count);
363 				psymoff(leng(bkptr->loc),ISYM,"%24t");
364 				comptr=bkptr->comm;
365 				WHILE *comptr DO printc(*comptr++); OD
366 			FI
367 		OD
368 		break;
369 
370 	    default:
371 		error(BADMOD);
372 	}
373 
374 }
375 
376 printmap(s,amap)
377 STRING	s; MAP *amap;
378 {
379 	int file;
380 	file=amap->ufd;
381 	printf("%s%12t`%s'\n", s,
382 	    (file<0 ? "-" : (file==fcor ? corfil : symfil)));
383 	printf("b1 = %-16R",amap->b1);
384 	printf("e1 = %-16R",amap->e1);
385 	printf("f1 = %-16R",amap->f1);
386 	printf("\nb2 = %-16R",amap->b2);
387 	printf("e2 = %-16R",amap->e2);
388 	printf("f2 = %-16R",amap->f2);
389 	printc(EOR);
390 }
391 
392 printregs()
393 {
394 	REG REGPTR	p;
395 	L_INT		v;
396 
397 	FOR p=reglist; p < &reglist[24]; p++
398 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
399 		printf("%s%6t%R %16t", p->rname, v);
400 		valpr(v,(p->roffs==PC?ISYM:DSYM));
401 		printc(EOR);
402 	OD
403 	printpc();
404 }
405 
406 getreg(regnam) {
407 	REG REGPTR	p;
408 	REG STRING	regptr;
409 	CHAR	*olp;
410 	CHAR		regnxt;
411 
412 	olp=lp;
413 	FOR p=reglist; p < &reglist[24]; p++
414 	DO	regptr=p->rname;
415 		IF (regnam == *regptr++)
416 		THEN
417 			WHILE *regptr
418 			DO IF (regnxt=readchar()) != *regptr++
419 				THEN --regptr; break;
420 				FI
421 			OD
422 			IF *regptr
423 			THEN lp=olp;
424 			ELSE
425 				int i = kcore ? (int)p->rkern : p->roffs;
426 				return (i);
427 			FI
428 		FI
429 	OD
430 	lp=olp;
431 	return(0);
432 }
433 
434 printpc()
435 {
436 	dot= *(ADDR *)(((ADDR)&u)+PC);
437 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
438 	printc(EOR);
439 }
440 
441 char	*illinames[] = {
442 	"reserved addressing fault",
443 	"priviliged instruction fault",
444 	"reserved operand fault"
445 };
446 char	*fpenames[] = {
447 	0,
448 	"integer overflow trap",
449 	"integer divide by zero trap",
450 	"floating overflow trap",
451 	"floating/decimal divide by zero trap",
452 	"floating underflow trap",
453 	"decimal overflow trap",
454 	"subscript out of range trap",
455 	"floating overflow fault",
456 	"floating divide by zero fault",
457 	"floating undeflow fault"
458 };
459 
460 sigprint()
461 {
462 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
463 	THEN prints(signals[signo]); FI
464 	switch (signo) {
465 
466 	case SIGFPE:
467 		IF (sigcode > 0 &&
468 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
469 			prints(" ("); prints(fpenames[sigcode]); prints(")");
470 		FI
471 		break;
472 
473 	case SIGILL:
474 		IF (sigcode >= 0 &&
475 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
476 			prints(" ("); prints(illinames[sigcode]); prints(")");
477 		FI
478 		break;
479 	}
480 }
481