Annotation of 43BSDTahoe/sys/vax/mem.c, revision 1.1

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

unix.superglobalmegacorp.com

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