Annotation of 43BSDTahoe/sys/vax/mem.c, revision 1.1.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.