1*19911Smckusick static char sccsid[] = "@(#)print.c 4.11 05/02/85";
23764Sroot /*
33764Sroot *
43764Sroot * UNIX debugger
53764Sroot *
63764Sroot */
73764Sroot #include "defs.h"
83764Sroot
93764Sroot MSG LONGFIL;
103764Sroot MSG NOTOPEN;
113764Sroot MSG A68BAD;
123764Sroot MSG A68LNK;
133764Sroot MSG BADMOD;
143764Sroot
153764Sroot MAP txtmap;
163764Sroot MAP datmap;
173764Sroot
183764Sroot ADDR lastframe;
193764Sroot ADDR callpc;
203764Sroot
213764Sroot INT infile;
223764Sroot INT outfile;
233764Sroot CHAR *lp;
243764Sroot L_INT maxoff;
253764Sroot L_INT maxpos;
263764Sroot INT radix;
273764Sroot
283764Sroot /* symbol management */
293764Sroot L_INT localval;
303764Sroot
313764Sroot /* breakpoints */
323764Sroot BKPTR bkpthead;
333764Sroot
343764Sroot REGLIST reglist [] = {
353777Sroot "p1lr", P1LR, &pcb.pcb_p1lr,
363777Sroot "p1br", P1BR, &pcb.pcb_p1br,
373777Sroot "p0lr", P0LR, &pcb.pcb_p0lr,
383777Sroot "p0br", P0BR, &pcb.pcb_p0br,
393777Sroot "ksp", KSP, &pcb.pcb_ksp,
403777Sroot "esp", ESP, &pcb.pcb_esp,
413777Sroot "ssp", SSP, &pcb.pcb_ssp,
423777Sroot "psl", PSL, &pcb.pcb_psl,
433777Sroot "pc", PC, &pcb.pcb_pc,
443777Sroot "usp", USP, &pcb.pcb_usp,
453777Sroot "fp", FP, &pcb.pcb_fp,
463777Sroot "ap", AP, &pcb.pcb_ap,
473777Sroot "r11", R11, &pcb.pcb_r11,
483777Sroot "r10", R10, &pcb.pcb_r10,
493777Sroot "r9", R9, &pcb.pcb_r9,
503777Sroot "r8", R8, &pcb.pcb_r8,
513777Sroot "r7", R7, &pcb.pcb_r7,
523777Sroot "r6", R6, &pcb.pcb_r6,
533777Sroot "r5", R5, &pcb.pcb_r5,
543777Sroot "r4", R4, &pcb.pcb_r4,
553777Sroot "r3", R3, &pcb.pcb_r3,
563777Sroot "r2", R2, &pcb.pcb_r2,
573777Sroot "r1", R1, &pcb.pcb_r1,
583777Sroot "r0", R0, &pcb.pcb_r0,
593764Sroot };
603764Sroot
613764Sroot char lastc;
623764Sroot
633764Sroot INT fcor;
643764Sroot STRING errflg;
653764Sroot INT signo;
663764Sroot INT sigcode;
673764Sroot
683764Sroot
693764Sroot L_INT dot;
703764Sroot L_INT var[];
713764Sroot STRING symfil;
723764Sroot STRING corfil;
733764Sroot INT pid;
743764Sroot L_INT adrval;
753764Sroot INT adrflg;
763764Sroot L_INT cntval;
773764Sroot INT cntflg;
783764Sroot
793764Sroot STRING signals[] = {
803764Sroot "",
813764Sroot "hangup",
823764Sroot "interrupt",
833764Sroot "quit",
843764Sroot "illegal instruction",
853764Sroot "trace/BPT",
863764Sroot "IOT",
873764Sroot "EMT",
883764Sroot "floating exception",
893764Sroot "killed",
903764Sroot "bus error",
913764Sroot "memory fault",
923764Sroot "bad system call",
933764Sroot "broken pipe",
943764Sroot "alarm call",
953764Sroot "terminated",
963764Sroot "signal 16",
973764Sroot "stop (signal)",
983764Sroot "stop (tty)",
993764Sroot "continue (signal)",
1003764Sroot "child termination",
1013764Sroot "stop (tty input)",
1023764Sroot "stop (tty output)",
1033764Sroot "input available (signal)",
1043764Sroot "cpu timelimit",
1053764Sroot "file sizelimit",
1063764Sroot "signal 26",
1073764Sroot "signal 27",
1083764Sroot "signal 28",
1093764Sroot "signal 29",
1103764Sroot "signal 30",
1113764Sroot "signal 31",
1123764Sroot };
1133764Sroot
1143764Sroot /* general printing routines ($) */
1153764Sroot
printtrace(modif)1163764Sroot printtrace(modif)
1173764Sroot {
1183764Sroot INT narg, i, stat, name, limit;
1193764Sroot POS dynam;
1203764Sroot REG BKPTR bkptr;
1213764Sroot CHAR hi, lo;
1223764Sroot ADDR word;
1233764Sroot STRING comptr;
1243764Sroot ADDR argp, frame, link;
1253764Sroot register struct nlist *sp;
1263764Sroot INT stack;
1273764Sroot INT ntramp;
1283764Sroot
1293764Sroot IF cntflg==0 THEN cntval = -1; FI
1303764Sroot
1313764Sroot switch (modif) {
1323764Sroot
1333764Sroot case '<':
1343764Sroot IF cntval == 0
1353764Sroot THEN WHILE readchar() != EOR
1363764Sroot DO OD
1373764Sroot lp--;
1383764Sroot break;
1393764Sroot FI
1403764Sroot IF rdc() == '<'
1413764Sroot THEN stack = 1;
1423764Sroot ELSE stack = 0; lp--;
1433764Sroot FI
14417596Ssam /* fall thru... */
14517596Ssam
1463764Sroot case '>':
1473764Sroot {CHAR file[64];
1483764Sroot CHAR Ifile[128];
1493764Sroot extern CHAR *Ipath;
1503764Sroot INT index;
1513764Sroot
1523764Sroot index=0;
1533764Sroot IF rdc()!=EOR
1543764Sroot THEN REP file[index++]=lastc;
1553764Sroot IF index>=63 THEN error(LONGFIL); FI
1563764Sroot PER readchar()!=EOR DONE
1573764Sroot file[index]=0;
1583764Sroot IF modif=='<'
1593764Sroot THEN IF Ipath THEN
1603764Sroot strcpy(Ifile, Ipath);
1613764Sroot strcat(Ifile, "/");
1623764Sroot strcat(Ifile, file);
1633764Sroot FI
1647496Skre IF strcmp(file, "-")!=0
1657496Skre THEN iclose(stack, 0);
1667496Skre infile=open(file,0);
1677496Skre IF infile<0
1687496Skre THEN infile=open(Ifile,0);
1697496Skre FI
1707496Skre ELSE lseek(infile, 0L, 0);
1717496Skre FI
1727496Skre IF infile<0
1733764Sroot THEN infile=0; error(NOTOPEN);
1743764Sroot ELSE IF cntflg
1753764Sroot THEN var[9] = cntval;
1763764Sroot ELSE var[9] = 1;
1773764Sroot FI
1783764Sroot FI
1797496Skre ELSE oclose();
1807496Skre outfile=open(file,1);
1813764Sroot IF outfile<0
1823764Sroot THEN outfile=creat(file,0644);
1833764Sroot #ifndef EDDT
1843764Sroot ELSE lseek(outfile,0L,2);
1853764Sroot #endif
1863764Sroot FI
1873764Sroot FI
1883764Sroot
1893764Sroot ELSE IF modif == '<'
1903764Sroot THEN iclose(-1, 0);
1917496Skre ELSE oclose();
1923764Sroot FI
1933764Sroot FI
1943764Sroot lp--;
1953764Sroot }
1963764Sroot break;
1973764Sroot
1983779Sroot case 'p':
19917596Ssam IF kernel == 0
20017596Ssam THEN printf("not debugging kernel\n");
20117596Ssam ELSE IF adrflg
20217596Ssam THEN int pte = access(RD, dot, DSP, 0);
2033779Sroot masterpcbb = (pte&PG_PFNUM)*512;
2043779Sroot FI
2053779Sroot getpcb();
2063779Sroot FI
2073779Sroot break;
2083779Sroot
2093764Sroot case 'd':
21017596Ssam IF adrflg
21117596Ssam THEN IF adrval < 2 ORF adrval > 16
21217596Ssam THEN printf("must have 2 <= radix <= 16");
21317596Ssam break;
21417596Ssam FI
2153764Sroot printf("radix=%d base ten",radix=adrval);
21617596Ssam FI
2173764Sroot break;
2183764Sroot
2193764Sroot case 'q': case 'Q': case '%':
2203764Sroot done();
2213764Sroot
2223764Sroot case 'w': case 'W':
2233764Sroot maxpos=(adrflg?adrval:MAXPOS);
2243764Sroot break;
2253764Sroot
2263764Sroot case 's': case 'S':
2273764Sroot maxoff=(adrflg?adrval:MAXOFF);
2283764Sroot break;
2293764Sroot
2303764Sroot case 'v': case 'V':
2313764Sroot prints("variables\n");
2323764Sroot FOR i=0;i<=35;i++
23317596Ssam DO IF var[i]
23417596Ssam THEN printc((i<=9 ? '0' : 'a'-10) + i);
23518811Smckusick printf(" = %x\n",var[i]);
23617596Ssam FI
2373764Sroot OD
2383764Sroot break;
2393764Sroot
2403764Sroot case 'm': case 'M':
2413764Sroot printmap("? map",&txtmap);
2423764Sroot printmap("/ map",&datmap);
2433764Sroot break;
2443764Sroot
2453764Sroot case 0: case '?':
2463764Sroot IF pid
2473764Sroot THEN printf("pcs id = %d\n",pid);
2483764Sroot ELSE prints("no process\n");
2493764Sroot FI
2503764Sroot sigprint(); flushbuf();
2513764Sroot
2523764Sroot case 'r': case 'R':
2533764Sroot printregs();
2543764Sroot return;
2553764Sroot
2563764Sroot case 'c': case 'C':
2573764Sroot IF adrflg
25817596Ssam THEN frame=adrval;
2593764Sroot word=get(adrval+6,DSP)&0xFFFF;
2603764Sroot IF word&0x2000
26117596Ssam THEN /* 'calls', can figure out argp */
2623764Sroot argp=adrval+20+((word>>14)&3); word &= 0xFFF;
26317596Ssam WHILE word
26417596Ssam DO IF word&1
26517596Ssam THEN argp+=4;
26617596Ssam FI
26717596Ssam word>>=1;
26817596Ssam OD
26917596Ssam ELSE /* 'callg', can't tell where argp is */
27017596Ssam argp=frame;
2713764Sroot FI
2723764Sroot callpc=get(frame+16,DSP);
27317596Ssam ELIF kcore
27417596Ssam THEN argp = pcb.pcb_ap;
2753779Sroot frame = pcb.pcb_fp;
2763779Sroot callpc = pcb.pcb_pc;
2773779Sroot ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
2783764Sroot frame= *(ADDR *)(((ADDR)&u)+FP);
2793764Sroot callpc= *(ADDR *)(((ADDR)&u)+PC);
2803764Sroot FI
2813764Sroot lastframe=0;
2823764Sroot ntramp = 0;
2833764Sroot WHILE cntval--
2843764Sroot DO char *name;
2853764Sroot chkerr();
28619905Ssam /* if in extended pcb must be signal trampoline code */
28719905Ssam IF KERNOFF - ctob(UPAGES) < callpc ANDF
28819905Ssam (unsigned)callpc < KERNOFF
28917596Ssam THEN name = "sigtramp";
2903764Sroot ntramp++;
29117596Ssam ELSE ntramp = 0;
2923764Sroot findsym(callpc,ISYM);
29317596Ssam IF cursym ANDF
29417596Ssam !strcmp(cursym->n_un.n_name, "start")
29517596Ssam THEN break;
29617596Ssam FI
29717596Ssam IF cursym
29817596Ssam THEN name = cursym->n_un.n_name;
29917596Ssam ELSE name = "?";
30017596Ssam FI
30117596Ssam FI
3023764Sroot printf("%s(", name);
3033764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
30417596Ssam LOOP IF narg==0 THEN break; FI
3053764Sroot printf("%R", get(argp += 4, DSP));
3063764Sroot IF --narg!=0 THEN printc(','); FI
3073764Sroot POOL
30819905Ssam IF ntramp == 1
309*19911Smckusick THEN callpc=get(frame+92, DSP);
31019905Ssam ELSE callpc=get(frame+16, DSP);
31119905Ssam FI
31219905Ssam IF callpc != 0
31319905Ssam THEN prints(") from ");
31419905Ssam psymoff(callpc, ISYM, "\n");
31519905Ssam ELSE prints(")\n");
31619905Ssam FI
3173764Sroot
3183764Sroot IF modif=='C'
31917596Ssam THEN WHILE localsym(frame,argp)
32017596Ssam DO word=get(localval,DSP);
32117596Ssam printf("%8t%s:%10t",
32217596Ssam cursym->n_un.n_name);
32317596Ssam IF errflg
32417596Ssam THEN prints("?\n"); errflg=0;
32517596Ssam ELSE printf("%R\n",word);
32617596Ssam FI
32717596Ssam OD
3283764Sroot FI
3293764Sroot
3303764Sroot argp=get(frame+8, DSP);
3313764Sroot lastframe=frame;
3323764Sroot frame=get(frame+12, DSP)&EVEN;
33317596Ssam IF frame==0 THEN break; FI
33417596Ssam IF !adrflg ANDF !INSTACK(frame)
33517596Ssam THEN IF !kcore ORF !kstackaddr(frame)
33617596Ssam THEN break;
33717596Ssam FI
3383764Sroot FI
3393764Sroot OD
3403764Sroot break;
3413764Sroot
3423764Sroot /*print externals*/
3433764Sroot case 'e': case 'E':
34417596Ssam FOR sp = symtab; sp < esymtab; sp++
34517596Ssam DO IF sp->n_type == (N_DATA|N_EXT) ORF
34617596Ssam sp->n_type == (N_BSS|N_EXT)
34717596Ssam THEN printf("%s:%12t%R\n", sp->n_un.n_name,
34817596Ssam get(sp->n_value,DSP));
34917596Ssam FI
35017596Ssam OD
3513764Sroot break;
3523764Sroot
3533764Sroot case 'a': case 'A':
3543764Sroot error("No algol 68 on VAX");
3553764Sroot /*NOTREACHED*/
3563764Sroot
3573764Sroot /*print breakpoints*/
3583764Sroot case 'b': case 'B':
3593764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n");
36017596Ssam FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
36117596Ssam DO IF bkptr->flag
36217596Ssam THEN printf("%-8.8d",bkptr->count);
3633764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t");
3643764Sroot comptr=bkptr->comm;
3653764Sroot WHILE *comptr DO printc(*comptr++); OD
36617596Ssam FI
36717596Ssam OD
3683764Sroot break;
3693764Sroot
37017596Ssam default:
37117596Ssam error(BADMOD);
3723764Sroot }
3733764Sroot
3743764Sroot }
3753764Sroot
printmap(s,amap)3763764Sroot printmap(s,amap)
3773764Sroot STRING s; MAP *amap;
3783764Sroot {
3793764Sroot int file;
3803764Sroot file=amap->ufd;
38117596Ssam printf("%s%12t`%s'\n", s,
38217596Ssam (file<0 ? "-" : (file==fcor ? corfil : symfil)));
3833764Sroot printf("b1 = %-16R",amap->b1);
3843764Sroot printf("e1 = %-16R",amap->e1);
3853764Sroot printf("f1 = %-16R",amap->f1);
3863764Sroot printf("\nb2 = %-16R",amap->b2);
3873764Sroot printf("e2 = %-16R",amap->e2);
3883764Sroot printf("f2 = %-16R",amap->f2);
3893764Sroot printc(EOR);
3903764Sroot }
3913764Sroot
printregs()3923764Sroot printregs()
3933764Sroot {
3943764Sroot REG REGPTR p;
3953764Sroot L_INT v;
3963764Sroot
3973764Sroot FOR p=reglist; p < ®list[24]; p++
3983777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
3993777Sroot printf("%s%6t%R %16t", p->rname, v);
4003764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM));
4013764Sroot printc(EOR);
4023764Sroot OD
4033764Sroot printpc();
4043764Sroot }
4053764Sroot
getreg(regnam)4063777Sroot getreg(regnam) {
4073764Sroot REG REGPTR p;
4083764Sroot REG STRING regptr;
4093764Sroot CHAR *olp;
4103764Sroot CHAR regnxt;
4113764Sroot
4123764Sroot olp=lp;
4133764Sroot FOR p=reglist; p < ®list[24]; p++
4143764Sroot DO regptr=p->rname;
4153764Sroot IF (regnam == *regptr++)
4163764Sroot THEN
4173764Sroot WHILE *regptr
4183764Sroot DO IF (regnxt=readchar()) != *regptr++
4193764Sroot THEN --regptr; break;
4203764Sroot FI
4213764Sroot OD
4223764Sroot IF *regptr
4233764Sroot THEN lp=olp;
4243778Sroot ELSE
4253778Sroot int i = kcore ? (int)p->rkern : p->roffs;
4263778Sroot return (i);
4273764Sroot FI
4283764Sroot FI
4293764Sroot OD
4303764Sroot lp=olp;
4313764Sroot return(0);
4323764Sroot }
4333764Sroot
printpc()4343764Sroot printpc()
4353764Sroot {
4363764Sroot dot= *(ADDR *)(((ADDR)&u)+PC);
4373764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
4383764Sroot printc(EOR);
4393764Sroot }
4403764Sroot
4413764Sroot char *illinames[] = {
4423764Sroot "reserved addressing fault",
4433764Sroot "priviliged instruction fault",
4443764Sroot "reserved operand fault"
4453764Sroot };
4463764Sroot char *fpenames[] = {
4473764Sroot 0,
4483764Sroot "integer overflow trap",
4493764Sroot "integer divide by zero trap",
4503764Sroot "floating overflow trap",
4513764Sroot "floating/decimal divide by zero trap",
4523764Sroot "floating underflow trap",
4533764Sroot "decimal overflow trap",
4543764Sroot "subscript out of range trap",
4553764Sroot "floating overflow fault",
4563764Sroot "floating divide by zero fault",
4573764Sroot "floating undeflow fault"
4583764Sroot };
4593764Sroot
sigprint()4603764Sroot sigprint()
4613764Sroot {
4623764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
4633764Sroot THEN prints(signals[signo]); FI
4643764Sroot switch (signo) {
4653764Sroot
4663764Sroot case SIGFPE:
4673764Sroot IF (sigcode > 0 &&
4683764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
4693764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")");
4703764Sroot FI
4713764Sroot break;
4723764Sroot
4733764Sroot case SIGILL:
4743764Sroot IF (sigcode >= 0 &&
4753764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN
4763764Sroot prints(" ("); prints(illinames[sigcode]); prints(")");
4773764Sroot FI
4783764Sroot break;
4793764Sroot }
4803764Sroot }
481