Annotation of 42BSD/sys/vax/mem.c, revision 1.1

1.1     ! root        1: /*     mem.c   6.1     83/07/29        */
        !             2: 
        !             3: /*
        !             4:  * Memory special file
        !             5:  */
        !             6: 
        !             7: #include "../machine/pte.h"
        !             8: 
        !             9: #include "../h/param.h"
        !            10: #include "../h/dir.h"
        !            11: #include "../h/user.h"
        !            12: #include "../h/conf.h"
        !            13: #include "../h/buf.h"
        !            14: #include "../h/systm.h"
        !            15: #include "../h/vm.h"
        !            16: #include "../h/cmap.h"
        !            17: #include "../h/uio.h"
        !            18: 
        !            19: #include "../vax/mtpr.h"
        !            20: 
        !            21: mmread(dev, uio)
        !            22:        dev_t dev;
        !            23:        struct uio *uio;
        !            24: {
        !            25: 
        !            26:        return (mmrw(dev, uio, UIO_READ));
        !            27: }
        !            28: 
        !            29: mmwrite(dev, uio)
        !            30:        dev_t dev;
        !            31:        struct uio *uio;
        !            32: {
        !            33: 
        !            34:        return (mmrw(dev, uio, UIO_WRITE));
        !            35: }
        !            36: 
        !            37: mmrw(dev, uio, rw)
        !            38:        dev_t dev;
        !            39:        struct uio *uio;
        !            40:        enum uio_rw rw;
        !            41: {
        !            42:        register int o;
        !            43:        register u_int c, v;
        !            44:        register struct iovec *iov;
        !            45:        int error = 0;
        !            46:        extern int umbabeg, umbaend;
        !            47: 
        !            48: 
        !            49:        while (uio->uio_resid > 0 && error == 0) {
        !            50:                iov = uio->uio_iov;
        !            51:                if (iov->iov_len == 0) {
        !            52:                        uio->uio_iov++;
        !            53:                        uio->uio_iovcnt--;
        !            54:                        if (uio->uio_iovcnt < 0)
        !            55:                                panic("mmrw");
        !            56:                        continue;
        !            57:                }
        !            58:                switch (minor(dev)) {
        !            59: 
        !            60: /* minor device 0 is physical memory */
        !            61:                case 0:
        !            62:                        v = btop(uio->uio_offset);
        !            63:                        if (v >= physmem)
        !            64:                                goto fault;
        !            65:                        *(int *)mmap = v | PG_V |
        !            66:                                (rw == UIO_READ ? PG_KR : PG_KW);
        !            67:                        mtpr(TBIS, vmmap);
        !            68:                        o = (int)uio->uio_offset & PGOFSET;
        !            69:                        c = min((u_int)(NBPG - o), (u_int)iov->iov_len);
        !            70:                        c = min(c, (u_int)(NBPG - ((int)iov->iov_base&PGOFSET)));
        !            71:                        error = uiomove((caddr_t)&vmmap[o], (int)c, rw, uio);
        !            72:                        continue;
        !            73: 
        !            74: /* minor device 1 is kernel memory */
        !            75:                case 1:
        !            76:                        if ((caddr_t)uio->uio_offset < (caddr_t)&umbabeg &&
        !            77:                            (caddr_t)uio->uio_offset + uio->uio_resid >= (caddr_t)&umbabeg)
        !            78:                                goto fault;
        !            79:                        if ((caddr_t)uio->uio_offset >= (caddr_t)&umbabeg &&
        !            80:                            (caddr_t)uio->uio_offset < (caddr_t)&umbaend)
        !            81:                                goto fault;
        !            82:                        c = iov->iov_len;
        !            83:                        if (!kernacc((caddr_t)uio->uio_offset, c, rw == UIO_READ ? B_READ : B_WRITE))
        !            84:                                goto fault;
        !            85:                        error = uiomove((caddr_t)uio->uio_offset, (int)c, rw, uio);
        !            86:                        continue;
        !            87: 
        !            88: /* minor device 2 is EOF/RATHOLE */
        !            89:                case 2:
        !            90:                        if (rw == UIO_READ)
        !            91:                                return (0);
        !            92:                        c = iov->iov_len;
        !            93:                        break;
        !            94: 
        !            95: /* minor device 3 is unibus memory (addressed by shorts) */
        !            96:                case 3:
        !            97:                        c = iov->iov_len;
        !            98:                        if (!kernacc((caddr_t)uio->uio_offset, c, rw == UIO_READ ? B_READ : B_WRITE))
        !            99:                                goto fault;
        !           100:                        if (!useracc(iov->iov_base, c, rw == UIO_READ ? B_WRITE : B_READ))
        !           101:                                goto fault;
        !           102:                        error = UNIcpy((caddr_t)uio->uio_offset, iov->iov_base,
        !           103:                            (int)c, rw);
        !           104:                        break;
        !           105:                }
        !           106:                if (error)
        !           107:                        break;
        !           108:                iov->iov_base += c;
        !           109:                iov->iov_len -= c;
        !           110:                uio->uio_offset += c;
        !           111:                uio->uio_resid -= c;
        !           112:        }
        !           113:        return (error);
        !           114: fault:
        !           115:        return (EFAULT);
        !           116: }
        !           117: 
        !           118: /*
        !           119:  * UNIBUS Address Space <--> User Space transfer
        !           120:  */
        !           121: UNIcpy(uniadd, usradd, n, rw)
        !           122:        caddr_t uniadd, usradd;
        !           123:        register int n;
        !           124:        enum uio_rw rw;
        !           125: {
        !           126:        register short *from, *to;
        !           127:  
        !           128:        if (rw == UIO_READ) {
        !           129:                from = (short *)uniadd;
        !           130:                to = (short *)usradd;
        !           131:        } else {
        !           132:                from = (short *)usradd;
        !           133:                to = (short *)uniadd;
        !           134:        }
        !           135:        for (n >>= 1; n > 0; n--)
        !           136:                *to++ = *from++;
        !           137:        return (0);
        !           138: }

unix.superglobalmegacorp.com

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