BSD 4 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Mon, 10 Nov 1980 02:53:15 +0000 (18:53 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Mon, 10 Nov 1980 02:53:15 +0000 (18:53 -0800)
Work on file usr/src/cmd/adb/:rofix
Work on file usr/src/cmd/adb/Makefile
Work on file usr/src/cmd/adb/command.c
Work on file usr/src/cmd/adb/access.c

Synthesized-from: CSRG//cd1/4.0

usr/src/cmd/adb/:rofix [new file with mode: 0644]
usr/src/cmd/adb/Makefile [new file with mode: 0644]
usr/src/cmd/adb/access.c [new file with mode: 0644]
usr/src/cmd/adb/command.c [new file with mode: 0644]

diff --git a/usr/src/cmd/adb/:rofix b/usr/src/cmd/adb/:rofix
new file mode 100644 (file)
index 0000000..cd5fa24
--- /dev/null
@@ -0,0 +1,3 @@
+g/^[   ]*\.data/s//.text/
+w
+q
diff --git a/usr/src/cmd/adb/Makefile b/usr/src/cmd/adb/Makefile
new file mode 100644 (file)
index 0000000..a88cfa8
--- /dev/null
@@ -0,0 +1,46 @@
+DESTDIR= 
+CFLAGS=        -g -w
+CFILES= access.c command.c expr.c format.c input.c main.c message.c \
+       opset.c optab.c output.c pcs.c print.c runpcs.c setup.c sym.c
+OFILES= access.o command.o expr.o format.o input.o main.o message.o \
+       opset.o optab.o output.o pcs.o print.o runpcs.o setup.o sym.o
+
+adb:   ${OFILES}
+       ${CC} -o adb ${OFILES}
+
+defs.h:                mac.h mode.h
+mode.h:                machine.h
+
+access.o:      defs.h access.c
+command.o:     defs.h command.c
+expr.o:                defs.h expr.c
+format.o:      defs.h format.c
+input.o:       defs.h input.c
+main.o:                defs.h main.c
+message.o:     mac.h mode.h message.c
+       ${CC} -S message.c
+       ed <:rofix message.s
+       ${AS} -o message.o message.s
+       rm message.s
+opset.o:       defs.h opset.c
+optab.o:       defs.h optab.c
+       ${CC} -S optab.c
+       ed <:rofix optab.s
+       ${AS} -o optab.o optab.s
+       rm optab.s
+output.o:      defs.h output.c
+pcs.o:         defs.h pcs.c
+print.o:       defs.h print.c
+runpcs.o:      defs.h runpcs.c
+setup.o:       defs.h setup.c
+sym.o:         defs.h sym.c
+
+install:
+       install -s adb ${DESTDIR}/bin
+
+clean:
+       rm -f adb ${OFILES}
+
+print:
+       @ls -l | pr
+       @pr -f Makefile *.h ${CFILES}
diff --git a/usr/src/cmd/adb/access.c b/usr/src/cmd/adb/access.c
new file mode 100644 (file)
index 0000000..1078e62
--- /dev/null
@@ -0,0 +1,135 @@
+#
+/*
+ *
+ *     UNIX debugger
+ *
+ */
+
+#include "defs.h"
+static char sccsid[] = "%Z%%M% %I% %G%";
+
+MSG            ODDADR;
+MSG            BADDAT;
+MSG            BADTXT;
+MAP            txtmap;
+MAP            datmap;
+INT            wtflag;
+STRING         errflg;
+INT            errno;
+
+INT            pid;
+
+/* file handling and access routines */
+
+put(adr,space,value)
+#ifndef EDDT
+L_INT  adr;
+{
+       access(WT,adr,space,value);
+}
+#else
+       L_INT *adr; {*adr=value;}
+#endif
+
+POS    get(adr, space)
+#ifndef EDDT
+L_INT          adr;
+{
+       return(access(RD,adr,space,0));
+}
+#else
+       L_INT *adr; {return(*adr);}
+#endif
+
+POS    chkget(n, space)
+L_INT          n;
+{
+#ifndef vax
+       REG INT         w;
+#else
+       REG L_INT       w;
+#endif
+
+       w = get(n, space);
+       chkerr();
+       return(w);
+}
+
+POS bchkget(n, space) 
+L_INT  n;
+{
+       return(chkget(n, space) & LOBYTE);
+}
+
+#ifndef EDDT
+access(mode,adr,space,value)
+L_INT  adr;
+{
+       INT     pmode,rd,file;
+       ADDR    w;
+       rd = mode==RD;
+
+       IF space == NSP THEN return(0); FI
+
+       IF pid          /* tracing on? */
+       THEN
+#ifndef vax
+               IF adr&01 ANDF !rd THEN error(ODDADR); FI
+#endif
+            pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
+            w = ptrace(pmode, pid, adr, value);
+#ifndef vax
+            IF adr&01
+            THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
+                 w = (w>>8)&LOBYTE | (w1<<8);
+            FI
+#endif
+            IF errno
+            THEN errflg = (space&DSP ? BADDAT : BADTXT);
+            FI
+            return(w);
+       FI
+       w = 0;
+       IF mode==WT ANDF wtflag==0
+       THEN    error("not in write mode");
+       FI
+       IF !chkmap(&adr,space)
+       THEN return(0);
+       FI
+       file=(space&DSP?datmap.ufd:txtmap.ufd);
+       IF longseek(file,adr)==0 ORF
+          (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1
+       THEN    errflg=(space&DSP?BADDAT:BADTXT);
+       FI
+       return(w);
+
+}
+#endif
+
+chkmap(adr,space)
+       REG L_INT       *adr;
+       REG INT         space;
+{
+       REG MAPPTR amap;
+       amap=((space&DSP?&datmap:&txtmap));
+       IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
+       THEN IF within(*adr,amap->b2,amap->e2)
+            THEN *adr += (amap->f2)-(amap->b2);
+            ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
+            FI
+       ELSE *adr += (amap->f1)-(amap->b1);
+       FI
+       return(1);
+}
+
+within(adr,lbd,ubd)
+POS    adr, lbd, ubd;
+{
+       return(adr>=lbd && adr<ubd);
+}
+
+longseek(f, a)
+L_INT a;
+{
+       return(lseek(f,a,0) != -1);
+}
diff --git a/usr/src/cmd/adb/command.c b/usr/src/cmd/adb/command.c
new file mode 100644 (file)
index 0000000..3f326bf
--- /dev/null
@@ -0,0 +1,214 @@
+#
+/*
+ *
+ *     UNIX debugger
+ *
+ */
+
+#include "defs.h"
+static char sccsid[] = "%Z%%M% %I% %G%";
+
+MSG            BADEQ;
+MSG            NOMATCH;
+MSG            BADVAR;
+MSG            BADCOM;
+
+MAP            txtmap;
+MAP            datmap;
+INT            executing;
+CHAR           *lp;
+INT            fcor;
+INT            fsym;
+INT            mkfault;
+STRING         errflg;
+
+CHAR           lastc;
+CHAR           eqformat[128] = "z";
+CHAR           stformat[128] = "X\"= \"^i";
+
+L_INT          dot;
+L_INT          ditto;
+INT            dotinc;
+INT            lastcom = '=';
+L_INT          var[];
+L_INT          locval;
+L_INT          locmsk;
+INT            pid;
+L_INT          expv;
+L_INT          adrval;
+INT            adrflg;
+L_INT          cntval;
+INT            cntflg;
+
+
+
+
+/* command decoding */
+
+command(buf,defcom)
+STRING         buf;
+CHAR           defcom;
+{
+       INT             itype, ptype, modifier, regptr;
+       BOOL            longpr, eqcom;
+       CHAR            wformat[1];
+       CHAR            savc;
+       L_INT           w, savdot;
+       STRING          savlp=lp;
+       IF buf
+       THEN IF *buf==EOR
+            THEN return(FALSE);
+            ELSE lp=buf;
+            FI
+       FI
+
+       REP
+       IF adrflg=expr(0)
+       THEN dot=expv; ditto=dot;
+       FI
+       adrval=dot;
+       IF rdc()==',' ANDF expr(0)
+       THEN cntflg=TRUE; cntval=expv;
+       ELSE cntflg=FALSE; cntval=1; lp--;
+       FI
+
+       IF !eol(rdc())
+       THEN lastcom=lastc;
+       ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
+            lp--; lastcom=defcom;
+       FI
+
+       switch(lastcom&STRIP) {
+
+           case '/':
+               itype=DSP; ptype=DSYM;
+               goto trystar;
+
+           case '=':
+               itype=NSP; ptype=0;
+               goto trypr;
+
+           case '?':
+               itype=ISP; ptype=ISYM;
+               goto trystar;
+
+           trystar:
+               IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
+               IF lastcom&QUOTE
+               THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
+               FI
+
+           trypr:
+               longpr=FALSE; eqcom=lastcom=='=';
+               switch (rdc()) {
+
+                       case 'm':
+                           {/*reset map data*/
+                           INT         fcount;
+                           MAP         *smap;
+                           UNION{MAP *m; L_INT *mp;}amap;
+
+                           IF eqcom THEN error(BADEQ); FI
+                           smap=(itype&DSP?&datmap:&txtmap);
+                           amap.m=smap; fcount=3;
+                           IF itype&STAR
+                           THEN amap.mp += 3;
+                           FI
+                           WHILE fcount-- ANDF expr(0)
+                           DO *(amap.mp)++ = expv; OD
+                           IF rdc()=='?' THEN smap->ufd=fsym;
+                           ELIF lastc == '/' THEN smap->ufd=fcor;
+                           ELSE lp--;
+                           FI
+                           }
+                           break;
+
+                       case 'L':
+                           longpr=TRUE;
+                       case 'l':
+                           /*search for exp*/
+                           IF eqcom THEN error(BADEQ); FI
+                           dotinc=(longpr?4:2); savdot=dot;
+                           expr(1); locval=expv;
+                           IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
+                               IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
+                           LOOP w=get(dot,itype);
+                                IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
+                                dot=inkdot(dotinc);
+                           POOL
+                           IF errflg
+                           THEN dot=savdot; errflg=NOMATCH;
+                           FI
+                           psymoff(dot,ptype,"");
+                           break;
+
+                       case 'W':
+                           longpr=TRUE;
+                       case 'w':
+                           IF eqcom THEN error(BADEQ); FI
+                           wformat[0]=lastc; expr(1);
+                           REP  savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
+                                errflg=0; dot=savdot;
+                                IF longpr
+                                THEN put(dot,itype,expv);
+                                ELSE put(dot,itype,itol(get(dot+2,itype),expv));
+                                FI
+                                savdot=dot;
+                                printf("=%8t"); exform(1,wformat,itype,ptype);
+                                newline();
+                           PER  expr(0) ANDF errflg==0 DONE
+                           dot=savdot;
+                           chkerr();
+                           break;
+
+                       default:
+                           lp--;
+                           getformat(eqcom ? eqformat : stformat);
+                           IF !eqcom
+                           THEN psymoff(dot,ptype,":%16t");
+                           FI
+                           scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
+               }
+               break;
+
+           case '>':
+               lastcom=0; savc=rdc();
+               IF regptr=getreg(savc)
+               THEN * (ADDR *) (((ADDR)&u)+regptr)=dot;
+                    ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
+               ELIF (modifier=varchk(savc)) != -1
+               THEN    var[modifier]=dot;
+               ELSE    error(BADVAR);
+               FI
+               break;
+
+           case '!':
+               lastcom=0;
+               shell(); break;
+
+           case '$':
+               lastcom=0;
+               printtrace(nextchar()); break;
+
+           case ':':
+               IF !executing
+               THEN executing=TRUE;
+                    subpcs(nextchar());
+                    executing=FALSE;
+                    lastcom=0;
+               FI
+               break;
+
+           case 0:
+               prints(DBNAME);
+               break;
+
+           default: error(BADCOM);
+       }
+
+       flushbuf();
+       PER rdc()==';' DONE
+       IF buf THEN lp=savlp; ELSE lp--; FI
+       return(adrflg ANDF dot!=0);
+}
+