date and time created 81/05/14 15:19:56 by root
authorBill Joy <root@ucbvax.Berkeley.EDU>
Fri, 15 May 1981 06:19:56 +0000 (22:19 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Fri, 15 May 1981 06:19:56 +0000 (22:19 -0800)
SCCS-vsn: old/adb/adb.vax/print.c 4.1

usr/src/old/adb/adb.vax/print.c [new file with mode: 0644]

diff --git a/usr/src/old/adb/adb.vax/print.c b/usr/src/old/adb/adb.vax/print.c
new file mode 100644 (file)
index 0000000..b819d03
--- /dev/null
@@ -0,0 +1,429 @@
+static char sccsid[] = "@(#)print.c 4.1 %G%";
+/*
+ *
+ *     UNIX debugger
+ *
+ */
+#include "defs.h"
+
+MSG            LONGFIL;
+MSG            NOTOPEN;
+MSG            A68BAD;
+MSG            A68LNK;
+MSG            BADMOD;
+
+MAP            txtmap;
+MAP            datmap;
+
+ADDR           lastframe;
+ADDR           callpc;
+
+INT            infile;
+INT            outfile;
+CHAR           *lp;
+L_INT          maxoff;
+L_INT          maxpos;
+INT            radix;
+
+/* symbol management */
+L_INT          localval;
+
+/* breakpoints */
+BKPTR          bkpthead;
+
+REGLIST reglist [] = {
+               "p1lr", P1LR,
+               "p1br",P1BR,
+               "p0lr", P0LR,
+               "p0br",P0BR,
+               "ksp",KSP,
+               "esp",ESP,
+               "ssp",SSP,
+               "psl", PSL,
+               "pc", PC,
+               "usp",USP,
+               "fp", FP,
+               "ap", AP,
+               "r11", R11,
+               "r10", R10,
+               "r9", R9,
+               "r8", R8,
+               "r7", R7,
+               "r6", R6,
+               "r5", R5,
+               "r4", R4,
+               "r3", R3,
+               "r2", R2,
+               "r1", R1,
+               "r0", R0,
+};
+
+char           lastc;
+
+INT            fcor;
+STRING         errflg;
+INT            signo;
+INT            sigcode;
+
+
+L_INT          dot;
+L_INT          var[];
+STRING         symfil;
+STRING         corfil;
+INT            pid;
+L_INT          adrval;
+INT            adrflg;
+L_INT          cntval;
+INT            cntflg;
+
+STRING         signals[] = {
+               "",
+               "hangup",
+               "interrupt",
+               "quit",
+               "illegal instruction",
+               "trace/BPT",
+               "IOT",
+               "EMT",
+               "floating exception",
+               "killed",
+               "bus error",
+               "memory fault",
+               "bad system call",
+               "broken pipe",
+               "alarm call",
+               "terminated",
+               "signal 16",
+               "stop (signal)",
+               "stop (tty)",
+               "continue (signal)",
+               "child termination",
+               "stop (tty input)",
+               "stop (tty output)",
+               "input available (signal)",
+               "cpu timelimit",
+               "file sizelimit",
+               "signal 26",
+               "signal 27",
+               "signal 28",
+               "signal 29",
+               "signal 30",
+               "signal 31",
+};
+
+/* general printing routines ($) */
+
+printtrace(modif)
+{
+       INT             narg, i, stat, name, limit;
+       POS             dynam;
+       REG BKPTR       bkptr;
+       CHAR            hi, lo;
+       ADDR            word;
+       STRING          comptr;
+       ADDR            argp, frame, link;
+       register struct nlist *sp;
+       INT             stack;
+       INT             ntramp;
+
+       IF cntflg==0 THEN cntval = -1; FI
+
+       switch (modif) {
+
+           case '<':
+               IF cntval == 0
+               THEN    WHILE readchar() != EOR
+                       DO OD
+                       lp--;
+                       break;
+               FI
+               IF rdc() == '<'
+               THEN    stack = 1;
+               ELSE    stack = 0; lp--;
+               FI
+                                                       /* fall through */
+           case '>':
+               {CHAR           file[64];
+               CHAR            Ifile[128];
+               extern CHAR     *Ipath;
+               INT             index;
+
+               index=0;
+               IF modif=='<'
+               THEN    iclose(stack, 0);
+               ELSE    oclose();
+               FI
+               IF rdc()!=EOR
+               THEN    REP file[index++]=lastc;
+                           IF index>=63 THEN error(LONGFIL); FI
+                       PER readchar()!=EOR DONE
+                       file[index]=0;
+                       IF modif=='<'
+                       THEN    IF Ipath THEN
+                                       strcpy(Ifile, Ipath);
+                                       strcat(Ifile, "/");
+                                       strcat(Ifile, file);
+                               FI
+                               infile=open(file,0);
+                               IF infile<0 && (infile=open(Ifile,0))<0
+                               THEN    infile=0; error(NOTOPEN);
+                               ELSE    IF cntflg
+                                       THEN    var[9] = cntval;
+                                       ELSE    var[9] = 1;
+                                       FI
+                               FI
+                       ELSE    outfile=open(file,1);
+                               IF outfile<0
+                               THEN    outfile=creat(file,0644);
+#ifndef EDDT
+                               ELSE    lseek(outfile,0L,2);
+#endif
+                               FI
+                       FI
+
+               ELSE    IF modif == '<'
+                       THEN    iclose(-1, 0);
+                       FI
+               FI
+               lp--;
+               }
+               break;
+
+           case 'd':
+               if (adrflg) {
+                       if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
+                       printf("radix=%d base ten",radix=adrval);
+               }
+               break;
+
+           case 'q': case 'Q': case '%':
+               done();
+
+           case 'w': case 'W':
+               maxpos=(adrflg?adrval:MAXPOS);
+               break;
+
+           case 's': case 'S':
+               maxoff=(adrflg?adrval:MAXOFF);
+               break;
+
+           case 'v': case 'V':
+               prints("variables\n");
+               FOR i=0;i<=35;i++
+               DO IF var[i]
+                  THEN printc((i<=9 ? '0' : 'a'-10) + i);
+                       printf(" = %Q\n",var[i]);
+                  FI
+               OD
+               break;
+
+           case 'm': case 'M':
+               printmap("? map",&txtmap);
+               printmap("/ map",&datmap);
+               break;
+
+           case 0: case '?':
+               IF pid
+               THEN printf("pcs id = %d\n",pid);
+               ELSE prints("no process\n");
+               FI
+               sigprint(); flushbuf();
+
+           case 'r': case 'R':
+               printregs();
+               return;
+
+           case 'c': case 'C':
+               IF adrflg
+               THEN frame=adrval;
+                       word=get(adrval+6,DSP)&0xFFFF;
+                       IF word&0x2000
+                       THEN /* 'calls', can figure out argp */
+                               argp=adrval+20+((word>>14)&3); word &= 0xFFF;
+                               WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
+                       ELSE /* 'callg', can't tell where argp is */ argp=frame;
+                       FI
+                       callpc=get(frame+16,DSP);
+               ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
+                       frame= *(ADDR *)(((ADDR)&u)+FP);
+                       callpc= *(ADDR *)(((ADDR)&u)+PC);
+               FI
+               lastframe=0;
+               ntramp = 0;
+               WHILE cntval--
+               DO      char *name;
+                       chkerr();
+                       if (callpc > 0x80000000 - 0x200 * UPAGES) {
+                               name = "sigtramp";
+                               ntramp++;
+                       } else {
+                               ntramp = 0;
+                               findsym(callpc,ISYM);
+                               if (cursym &&
+                                   !strcmp(cursym->n_un.n_name, "start"))
+                                       break;
+                               if (cursym)
+                                       name = cursym->n_un.n_name;
+                               else
+                                       name = "?";
+                       }
+                       printf("%s(", name);
+                       narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
+                       LOOP IF narg==0 THEN break; FI
+                               printf("%R", get(argp += 4, DSP));
+                               IF --narg!=0 THEN printc(','); FI
+                       POOL
+                       printf(") from %X\n",callpc);  /* jkf mod */
+
+                       IF modif=='C'
+                       THEN WHILE localsym(frame,argp)
+                            DO word=get(localval,DSP);
+                               printf("%8t%s:%10t", cursym->n_un.n_name);
+                               IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
+                            OD
+                       FI
+
+                       if (ntramp == 1)
+                               callpc=get(frame+64, DSP);
+                       else
+                               callpc=get(frame+16, DSP);
+                       argp=get(frame+8, DSP);
+                       lastframe=frame;
+                       frame=get(frame+12, DSP)&EVEN;
+                       IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
+                       THEN break;
+                       FI
+               OD
+               break;
+
+           /*print externals*/
+           case 'e': case 'E':
+               for (sp = symtab; sp < esymtab; sp++) {
+                  if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
+                       printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
+               }
+               break;
+
+           case 'a': case 'A':
+               error("No algol 68 on VAX");
+               /*NOTREACHED*/
+
+           /*print breakpoints*/
+           case 'b': case 'B':
+               printf("breakpoints\ncount%8tbkpt%24tcommand\n");
+               for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
+                       if (bkptr->flag) {
+                               printf("%-8.8d",bkptr->count);
+                               psymoff(leng(bkptr->loc),ISYM,"%24t");
+                               comptr=bkptr->comm;
+                               WHILE *comptr DO printc(*comptr++); OD
+                       }
+               break;
+
+           default: error(BADMOD);
+       }
+
+}
+
+printmap(s,amap)
+STRING s; MAP *amap;
+{
+       int file;
+       file=amap->ufd;
+       printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
+       printf("b1 = %-16R",amap->b1);
+       printf("e1 = %-16R",amap->e1);
+       printf("f1 = %-16R",amap->f1);
+       printf("\nb2 = %-16R",amap->b2);
+       printf("e2 = %-16R",amap->e2);
+       printf("f2 = %-16R",amap->f2);
+       printc(EOR);
+}
+
+printregs()
+{
+       REG REGPTR      p;
+       L_INT           v;
+
+       FOR p=reglist; p < &reglist[24]; p++
+       DO      printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
+               valpr(v,(p->roffs==PC?ISYM:DSYM));
+               printc(EOR);
+       OD
+       printpc();
+}
+
+getreg(regnam)
+{
+       REG REGPTR      p;
+       REG STRING      regptr;
+       CHAR    *olp;
+       CHAR            regnxt;
+
+       olp=lp;
+       FOR p=reglist; p < &reglist[24]; p++
+       DO      regptr=p->rname;
+               IF (regnam == *regptr++)
+               THEN
+                       WHILE *regptr
+                       DO IF (regnxt=readchar()) != *regptr++
+                               THEN --regptr; break;
+                               FI
+                       OD
+                       IF *regptr
+                       THEN lp=olp;
+                       ELSE return(p->roffs);
+                       FI
+               FI
+       OD
+       lp=olp;
+       return(0);
+}
+
+printpc()
+{
+       dot= *(ADDR *)(((ADDR)&u)+PC);
+       psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
+       printc(EOR);
+}
+
+char   *illinames[] = {
+       "reserved addressing fault",
+       "priviliged instruction fault",
+       "reserved operand fault"
+};
+char   *fpenames[] = {
+       0,
+       "integer overflow trap",
+       "integer divide by zero trap",
+       "floating overflow trap",
+       "floating/decimal divide by zero trap",
+       "floating underflow trap",
+       "decimal overflow trap",
+       "subscript out of range trap",
+       "floating overflow fault",
+       "floating divide by zero fault",
+       "floating undeflow fault"
+};
+
+sigprint()
+{
+       IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
+       THEN prints(signals[signo]); FI
+       switch (signo) {
+
+       case SIGFPE:
+               IF (sigcode > 0 &&
+                   sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
+                       prints(" ("); prints(fpenames[sigcode]); prints(")");
+               FI
+               break;
+
+       case SIGILL:
+               IF (sigcode >= 0 &&
+                   sigcode < sizeof illinames / sizeof illinames[0]) THEN
+                       prints(" ("); prints(illinames[sigcode]); prints(")");
+               FI
+               break;
+       }
+}