Annotation of 3BSD/cmd/sdb/access.c, revision 1.1

1.1     ! root        1: #
        !             2: /*
        !             3:  *
        !             4:  *     UNIX debugger
        !             5:  *
        !             6:  */
        !             7: 
        !             8: #include "head.h"
        !             9: struct user u;
        !            10: 
        !            11: 
        !            12: MSG            BADDAT;
        !            13: MSG            BADTXT;
        !            14: MAP            txtmap;
        !            15: MAP            datmap;
        !            16: STRING         errflg;
        !            17: int            errno;
        !            18: 
        !            19: INT            pid;
        !            20: 
        !            21: 
        !            22: 
        !            23: 
        !            24: /* file handling and access routines */
        !            25: 
        !            26: int dmask[5] = {0, 0xff, 0xffff, 0xffffff, 0xffffffff};
        !            27: 
        !            28: /* get data at loc using descriptor format d */
        !            29: long
        !            30: getval(loc, d)
        !            31: ADDR loc;
        !            32: char d; {
        !            33:        register int val;
        !            34:        
        !            35:        val = get(loc, DSP);
        !            36:        val &= dmask[dtol(d)];
        !            37:        return(val);
        !            38: }
        !            39: 
        !            40: /* put value at loc using descriptor format d */
        !            41: putval(loc, d, value)
        !            42: ADDR loc; char d; long value; {
        !            43:        register long val;
        !            44:        
        !            45:        val = get(loc, DSP);
        !            46:        val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
        !            47:        put(loc, DSP, val);
        !            48: }
        !            49: 
        !            50: /* put value in named register using descriptor format d */
        !            51: putreg(reg, d, value)
        !            52: ADDR reg; char d; long value; {
        !            53:        register long val;
        !            54:        
        !            55:        val = *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg);
        !            56:        val = (val & !dmask[dtol(d)]) | (value & dmask[dtol(d)]);
        !            57:        *(ADDR *)(((ADDR)&u)+R0+WORDSIZE*reg) = val;
        !            58: }
        !            59: 
        !            60: put(adr,space,value)
        !            61: L_INT  adr;
        !            62: {
        !            63:        access(WT,adr,space,value);
        !            64: }
        !            65: 
        !            66: POS    get(adr, space)
        !            67: L_INT          adr;
        !            68: {
        !            69:        return(access(RD,adr,space,0));
        !            70: }
        !            71: 
        !            72: 
        !            73: access(mode,adr,space,value)
        !            74: L_INT  adr;
        !            75: {
        !            76:        INT     pmode,rd,file;
        !            77:        ADDR    w;
        !            78:        rd = mode==RD;
        !            79: 
        !            80:        IF space == NSP THEN return(0); FI
        !            81: 
        !            82:        IF pid          /* tracing on? */
        !            83:        THEN
        !            84: #ifndef vax
        !            85:                IF adr&01 ANDF !rd THEN error(ODDADR); FI
        !            86: #endif
        !            87:             pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
        !            88:             w = ptrace(pmode, pid, adr, value);
        !            89: #ifndef vax
        !            90:             IF adr&01
        !            91:             THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
        !            92:                  w = (w>>8)&LOBYTE | (w1<<8);
        !            93:             FI
        !            94: #endif
        !            95:             IF errno
        !            96:             THEN errflg = (space&DSP ? BADDAT : BADTXT);
        !            97:             FI
        !            98:             return(w);
        !            99:        FI
        !           100:        w = 0;
        !           101:        IF !chkmap(&adr,space)
        !           102:        THEN return(0);
        !           103:        FI
        !           104:        file=(space&DSP?datmap.ufd:txtmap.ufd);
        !           105:        IF longseek(file,adr)==0 ORF
        !           106:           (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1
        !           107:        THEN    errflg=(space&DSP?BADDAT:BADTXT);
        !           108:        FI
        !           109:        return(w);
        !           110: 
        !           111: }
        !           112: 
        !           113: chkmap(adr,space)
        !           114:        REG L_INT       *adr;
        !           115:        REG INT         space;
        !           116: {
        !           117:        REG MAPPTR amap;
        !           118:        amap=((space&DSP?&datmap:&txtmap));
        !           119:        IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
        !           120:        THEN IF within(*adr,amap->b2,amap->e2)
        !           121:             THEN *adr += (amap->f2)-(amap->b2);
        !           122:             ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
        !           123:             FI
        !           124:        ELSE *adr += (amap->f1)-(amap->b1);
        !           125:        FI
        !           126:        return(1);
        !           127: }
        !           128: 
        !           129: within(adr,lbd,ubd)
        !           130: POS    adr, lbd, ubd;
        !           131: {
        !           132:        return(adr>=lbd && adr<ubd);
        !           133: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.