BSD 3 development
authorHoward Katseff <hpk@ucbvax.Berkeley.EDU>
Mon, 10 Dec 1979 15:59:26 +0000 (07:59 -0800)
committerHoward Katseff <hpk@ucbvax.Berkeley.EDU>
Mon, 10 Dec 1979 15:59:26 +0000 (07:59 -0800)
Work on file usr/src/cmd/sdb/access.c
Work on file usr/src/cmd/sdb/cdefs.h
Work on file usr/src/cmd/sdb/decode.c

Synthesized-from: 3bsd

usr/src/cmd/sdb/access.c [new file with mode: 0644]
usr/src/cmd/sdb/cdefs.h [new file with mode: 0644]
usr/src/cmd/sdb/decode.c [new file with mode: 0644]

diff --git a/usr/src/cmd/sdb/access.c b/usr/src/cmd/sdb/access.c
new file mode 100644 (file)
index 0000000..2f74c4c
--- /dev/null
@@ -0,0 +1,133 @@
+#
+/*
+ *
+ *     UNIX debugger
+ *
+ */
+
+#include "head.h"
+struct user u;
+
+
+MSG            BADDAT;
+MSG            BADTXT;
+MAP            txtmap;
+MAP            datmap;
+STRING         errflg;
+int            errno;
+
+INT            pid;
+
+
+
+
+/* file handling and access routines */
+
+int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
+
+/* get data at loc using descriptor format d */
+long
+getval(loc, d)
+ADDR loc;
+char d; {
+       register int val;
+       
+       val = get(loc, DSP);
+       val &= dmask[dtol(d)];
+       return(val);
+}
+
+/* put value at loc using descriptor format d */
+putval(loc, d, value)
+ADDR loc; char d; long value; {
+       register long val;
+       
+       val = get(loc, DSP);
+       val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
+       put(loc, DSP, val);
+}
+
+/* put value in named register using descriptor format d */
+putreg(reg, d, value)
+ADDR reg; char d; long value; {
+       register long val;
+       
+       val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
+       val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
+       *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
+}
+
+put(adr,space,value)
+L_INT  adr;
+{
+       access(WT,adr,space,value);
+}
+
+POS    get(adr, space)
+L_INT          adr;
+{
+       return(access(RD,adr,space,0));
+}
+
+
+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 !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);
+
+}
+
+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);
+}
diff --git a/usr/src/cmd/sdb/cdefs.h b/usr/src/cmd/sdb/cdefs.h
new file mode 100644 (file)
index 0000000..adfa323
--- /dev/null
@@ -0,0 +1,32 @@
+/* type modifiers */
+
+# define PTR  020
+# define FTN  040
+# define ARY  060
+
+/* type packing constants */
+
+# define TMASK 060
+# define TMASK1 0300
+# define TMASK2  0360
+# define BTMASK 017
+# define BTSHIFT 4
+# define TSHIFT 2
+
+/*     macros  */
+
+# define BTYPE(x)  (x&BTMASK)   /* basic type of x */
+# define ISUNSIGNED(x) ((x)<=ULONG&&(x)>=UCHAR)
+# define UNSIGNABLE(x) ((x)<=LONG&&(x)>=CHAR)
+# define ENUNSIGN(x) ((x)+(UNSIGNED-INT))
+# define DEUNSIGN(x) ((x)+(INT-UNSIGNED))
+# define ISPTR(x) ((x&TMASK)==PTR)
+# define ISFTN(x)  ((x&TMASK)==FTN)  /* is x a function type */
+# define ISARY(x)   ((x&TMASK)==ARY)   /* is x an array type */
+# define INCREF(x) (((x&~BTMASK)<<TSHIFT)|PTR|(x&BTMASK))
+# define DECREF(x) (((x>>TSHIFT)&~BTMASK&0x3fff)|(x&BTMASK))
+       /* pack and unpack field descriptors (size and offset) */
+# define PKFIELD(s,o) ((o<<6)|s)
+# define UPKFSZ(v)  (v&077)
+# define UPKFOFF(v) (v>>6)
+
diff --git a/usr/src/cmd/sdb/decode.c b/usr/src/cmd/sdb/decode.c
new file mode 100644 (file)
index 0000000..bf7c7ae
--- /dev/null
@@ -0,0 +1,110 @@
+#include "head.h"
+
+/* decode() - read a line from standard input and decode it */
+
+decode(p)
+char *p; {
+       register char c, *q;
+       integ = scallf = reflag = colonflag = 0;
+       proc[0] = cmd = args[0] = var[0] = '\0';
+       argsp = args;
+       
+       if (eqany(*p, "/?")) {  /* regular expression */
+               c = *p;
+               redir = (c == '/');
+               reflag = 1;
+               p++;
+               if (*p == '\n' || *p == c) return(0);
+               q = re;
+               while(*p != c && *p != '\n') *q++ = *p++;
+               *q = '\0';
+               return(0);
+       }
+       
+       if (*p == '!') { /* shell escape */
+               for (q = p; *q != '\n'; q++) ;
+               *q = '\0';
+               system(p+1);
+               return(0);
+       }
+       
+       if (*p == '\n') {
+               cmd = '\n';
+               return(0);
+       }
+       
+       if (*p == ':') {
+               colonflag++;
+       }
+       
+       while (*p != '\n') {    /* decode item by item */
+       
+               if (number(*p)) {       /* decimal number */
+                       if(integ) {
+                               error("Too many numbers");
+                               return(1);
+                       }
+                       integ = readint(&p);
+                       continue;
+               }
+               
+               if (varchar(*p) || eqany(*p, COMMANDS)) { 
+                                       /* proc, variable or command */
+                       if (cmd != '\0') {
+                               p = cpall(args, p);
+                               continue;
+                       }
+                       q = p;
+                       while (varchar(*q) || number(*q) || eqany(*q,COMMANDS))
+                               q++;
+                       if (*q == '(') {        /* procedure call */
+                               if (proc[0] != '\0') {
+                                       error("Too many procedure calls");
+                                       return(1);
+                               }
+                               scallf = 1;
+                               p = cpname(proc, p);
+                               p = cpall(args, p);
+                               continue;
+                       }
+                       if (*q == ':') {        /* procedure name */
+                               colonflag++;
+                               p = cpname(proc, p);
+                               continue;
+                       }
+                       if (*q == '$') {        /* variable name */
+                               p = cpname(var, p);
+                               continue;
+                       }
+                       if (((q-p == 1 && eqany(*p,COMMANDS) && 
+                               (proc[0]=='\0' || eqany(*p, "abcd"))) ||
+                               (integ && eqany(*p,COMMANDS))|| eqany(*p, "+-")) 
+                               && !(*p=='-' && *(p+1) == '>'))
+                                                       {  /* command */
+                               cmd = *p++;
+                               if (eqany(cmd, "acers")) {
+                                       while(*p == ' ')
+                                               p++;
+                                       p = cpall(args, p);
+                               }
+                               continue;
+                       }
+                       /* otherwise, its a variable */
+                       if (var[0] != '\0') {
+                               error("Too many variable names");
+                               return(1);
+                       }
+                       p = cpname(var, p);
+                       if (*p == '\n') {
+                               cmd = '/';
+                               continue;
+                       }
+                       if (cmd == '\0') cmd = *p ? *p : '/';
+                       p++;
+                       p = cpall(args,p);
+                       continue;
+               }
+               p++;    /* otherwise ignore p */
+       }
+       return(0);
+}