|
|
1.1 root 1: static char sccsid[] = "@(#)print.c 4.11 5/2/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 < ®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:
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:
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.