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

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

unix.superglobalmegacorp.com

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