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