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

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

unix.superglobalmegacorp.com

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