From: Howard Katseff Date: Mon, 10 Dec 1979 15:59:26 +0000 (-0800) Subject: BSD 3 development X-Git-Tag: BSD-3~389 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/d6f0eb7766885108f90dd6c54c3e93f889d123f4?ds=inline BSD 3 development 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 --- diff --git a/usr/src/cmd/sdb/access.c b/usr/src/cmd/sdb/access.c new file mode 100644 index 0000000000..2f74c4cab0 --- /dev/null +++ b/usr/src/cmd/sdb/access.c @@ -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=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)&~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 index 0000000000..bf7c7aeb66 --- /dev/null +++ b/usr/src/cmd/sdb/decode.c @@ -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); +}