Annotation of researchv10no/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:        w = 0;
        !            86:        IF pid
        !            87:        THEN file = datmap.ufd; /* always look in proc, no mapping */
        !            88:        ELSE IF !chkmap(&adr,space) THEN return(0); FI
        !            89:             file=(space&DSP?datmap.ufd:txtmap.ufd);
        !            90:        FI
        !            91:        if (longseek(file,adr)==0 ||
        !            92:           (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1)
        !            93:                errflg=(space&DSP?BADDAT:BADTXT);
        !            94:        return(w);
        !            95: 
        !            96: }
        !            97: 
        !            98: chkmap(adr,space)
        !            99:        REG L_INT       *adr;
        !           100:        REG INT         space;
        !           101: {
        !           102:        REG MAPPTR amap;
        !           103:        amap=((space&DSP?&datmap:&txtmap));
        !           104:        IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
        !           105:        THEN if (within(*adr,amap->b2,amap->e2))
        !           106:                *adr += (amap->f2)-(amap->b2);
        !           107:             else {
        !           108:                errflg=(space&DSP?BADDAT:BADTXT); return(0);
        !           109:             }
        !           110:        ELSE *adr += (amap->f1)-(amap->b1);
        !           111:        FI
        !           112:        return(1);
        !           113: }
        !           114: 
        !           115: within(adr,lbd,ubd)
        !           116: POS    adr, lbd, ubd;
        !           117: {
        !           118:        return(adr>=lbd && adr<ubd);
        !           119: }
        !           120: 
        !           121: /* ------------ */
        !           122: POS    chkget(n, space)
        !           123: L_INT          n;
        !           124: {
        !           125: #ifndef vax
        !           126:        REG INT         w;
        !           127: #else
        !           128:        REG L_INT       w;
        !           129: #endif
        !           130: 
        !           131:        w = get(n, space);
        !           132:        chkerr();
        !           133:        return(w);
        !           134: }
        !           135: 
        !           136: POS bchkget(n, space) 
        !           137: L_INT  n;
        !           138: {
        !           139:        return(chkget(n, space) & LOBYTE);
        !           140: }

unix.superglobalmegacorp.com

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