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
printtrace(modif)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
printmap(s,amap)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
printregs()392 printregs()
393 {
394 REG REGPTR p;
395 L_INT v;
396
397 FOR p=reglist; p < ®list[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
getreg(regnam)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 < ®list[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
printpc()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
sigprint()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