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