xref: /csrg-svn/old/adb/adb.vax/print.c (revision 17596)
1 static	char sccsid[] = "@(#)print.c 4.8 12/30/84";
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 callpc > 0x80000000 - 0x200 * UPAGES
287 			THEN	name = "sigtramp";
288 				ntramp++;
289 			ELSE	ntramp = 0;
290 				findsym(callpc,ISYM);
291 				IF cursym ANDF
292 				    !strcmp(cursym->n_un.n_name, "start")
293 				THEN break;
294 				FI
295 				IF cursym
296 				THEN name = cursym->n_un.n_name;
297 				ELSE name = "?";
298 				FI
299 			FI
300 			printf("%s(", name);
301 			narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
302 			LOOP	IF narg==0 THEN break; FI
303 				printf("%R", get(argp += 4, DSP));
304 				IF --narg!=0 THEN printc(','); FI
305 			POOL
306 			printf(") from %X\n",callpc);
307 
308 			IF modif=='C'
309 			THEN	WHILE localsym(frame,argp)
310 				DO	word=get(localval,DSP);
311 					printf("%8t%s:%10t",
312 					    cursym->n_un.n_name);
313 					IF errflg
314 					THEN prints("?\n"); errflg=0;
315 					ELSE printf("%R\n",word);
316 					FI
317 				OD
318 			FI
319 
320 			IF ntramp == 1
321 			THEN callpc=get(frame+84, DSP);
322 			ELSE callpc=get(frame+16, DSP);
323 			FI
324 			argp=get(frame+8, DSP);
325 			lastframe=frame;
326 			frame=get(frame+12, DSP)&EVEN;
327 			IF frame==0 THEN break; FI
328 			IF !adrflg ANDF !INSTACK(frame)
329 			THEN	IF !kcore ORF !kstackaddr(frame)
330 				THEN break;
331 				FI
332 			FI
333 		OD
334 		break;
335 
336 	    /*print externals*/
337 	    case 'e': case 'E':
338 		FOR sp = symtab; sp < esymtab; sp++
339 		DO	IF sp->n_type == (N_DATA|N_EXT) ORF
340 			   sp->n_type == (N_BSS|N_EXT)
341 			THEN printf("%s:%12t%R\n", sp->n_un.n_name,
342 				    get(sp->n_value,DSP));
343 			FI
344 		OD
345 		break;
346 
347 	    case 'a': case 'A':
348 		error("No algol 68 on VAX");
349 		/*NOTREACHED*/
350 
351 	    /*print breakpoints*/
352 	    case 'b': case 'B':
353 		printf("breakpoints\ncount%8tbkpt%24tcommand\n");
354 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
355 		DO	IF bkptr->flag
356 			THEN	printf("%-8.8d",bkptr->count);
357 				psymoff(leng(bkptr->loc),ISYM,"%24t");
358 				comptr=bkptr->comm;
359 				WHILE *comptr DO printc(*comptr++); OD
360 			FI
361 		OD
362 		break;
363 
364 	    default:
365 		error(BADMOD);
366 	}
367 
368 }
369 
370 printmap(s,amap)
371 STRING	s; MAP *amap;
372 {
373 	int file;
374 	file=amap->ufd;
375 	printf("%s%12t`%s'\n", s,
376 	    (file<0 ? "-" : (file==fcor ? corfil : symfil)));
377 	printf("b1 = %-16R",amap->b1);
378 	printf("e1 = %-16R",amap->e1);
379 	printf("f1 = %-16R",amap->f1);
380 	printf("\nb2 = %-16R",amap->b2);
381 	printf("e2 = %-16R",amap->e2);
382 	printf("f2 = %-16R",amap->f2);
383 	printc(EOR);
384 }
385 
386 printregs()
387 {
388 	REG REGPTR	p;
389 	L_INT		v;
390 
391 	FOR p=reglist; p < &reglist[24]; p++
392 	DO	v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
393 		printf("%s%6t%R %16t", p->rname, v);
394 		valpr(v,(p->roffs==PC?ISYM:DSYM));
395 		printc(EOR);
396 	OD
397 	printpc();
398 }
399 
400 getreg(regnam) {
401 	REG REGPTR	p;
402 	REG STRING	regptr;
403 	CHAR	*olp;
404 	CHAR		regnxt;
405 
406 	olp=lp;
407 	FOR p=reglist; p < &reglist[24]; p++
408 	DO	regptr=p->rname;
409 		IF (regnam == *regptr++)
410 		THEN
411 			WHILE *regptr
412 			DO IF (regnxt=readchar()) != *regptr++
413 				THEN --regptr; break;
414 				FI
415 			OD
416 			IF *regptr
417 			THEN lp=olp;
418 			ELSE
419 				int i = kcore ? (int)p->rkern : p->roffs;
420 				return (i);
421 			FI
422 		FI
423 	OD
424 	lp=olp;
425 	return(0);
426 }
427 
428 printpc()
429 {
430 	dot= *(ADDR *)(((ADDR)&u)+PC);
431 	psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
432 	printc(EOR);
433 }
434 
435 char	*illinames[] = {
436 	"reserved addressing fault",
437 	"priviliged instruction fault",
438 	"reserved operand fault"
439 };
440 char	*fpenames[] = {
441 	0,
442 	"integer overflow trap",
443 	"integer divide by zero trap",
444 	"floating overflow trap",
445 	"floating/decimal divide by zero trap",
446 	"floating underflow trap",
447 	"decimal overflow trap",
448 	"subscript out of range trap",
449 	"floating overflow fault",
450 	"floating divide by zero fault",
451 	"floating undeflow fault"
452 };
453 
454 sigprint()
455 {
456 	IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
457 	THEN prints(signals[signo]); FI
458 	switch (signo) {
459 
460 	case SIGFPE:
461 		IF (sigcode > 0 &&
462 		    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
463 			prints(" ("); prints(fpenames[sigcode]); prints(")");
464 		FI
465 		break;
466 
467 	case SIGILL:
468 		IF (sigcode >= 0 &&
469 		    sigcode < sizeof illinames / sizeof illinames[0]) THEN
470 			prints(" ("); prints(illinames[sigcode]); prints(")");
471 		FI
472 		break;
473 	}
474 }
475