|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * from: Utah $Hdr: mem.c 1.13 89/10/08$ ! 26: * ! 27: * @(#)mem.c 7.1 (Berkeley) 5/8/90 ! 28: */ ! 29: ! 30: /* ! 31: * Memory special file ! 32: */ ! 33: ! 34: #include "pte.h" ! 35: ! 36: #include "param.h" ! 37: #include "user.h" ! 38: #include "conf.h" ! 39: #include "buf.h" ! 40: #include "systm.h" ! 41: #include "vm.h" ! 42: #include "cmap.h" ! 43: #include "uio.h" ! 44: #include "malloc.h" ! 45: ! 46: #include "cpu.h" ! 47: ! 48: /*ARGSUSED*/ ! 49: mmrw(dev, uio, flags) ! 50: dev_t dev; ! 51: struct uio *uio; ! 52: int flags; ! 53: { ! 54: register int o; ! 55: register u_int c, v; ! 56: register struct iovec *iov; ! 57: int error = 0; ! 58: caddr_t zbuf = NULL; ! 59: extern u_int lowram; ! 60: ! 61: while (uio->uio_resid > 0 && error == 0) { ! 62: iov = uio->uio_iov; ! 63: if (iov->iov_len == 0) { ! 64: uio->uio_iov++; ! 65: uio->uio_iovcnt--; ! 66: if (uio->uio_iovcnt < 0) ! 67: panic("mmrw"); ! 68: continue; ! 69: } ! 70: switch (minor(dev)) { ! 71: ! 72: /* minor device 0 is physical memory */ ! 73: case 0: ! 74: v = uio->uio_offset; ! 75: #ifndef DEBUG ! 76: /* allow reads only in RAM (except for DEBUG) */ ! 77: if (v >= 0xFFFFFFFC || v < lowram) ! 78: goto fault; ! 79: #endif ! 80: *(int *)mmap = (v & PG_FRAME) | PG_CI | PG_V | ! 81: (uio->uio_rw == UIO_READ ? PG_RO : PG_RW); ! 82: TBIS(vmmap); ! 83: o = (int)uio->uio_offset & PGOFSET; ! 84: c = (u_int)(NBPG - ((int)iov->iov_base & PGOFSET)); ! 85: c = MIN(c, (u_int)(NBPG - o)); ! 86: c = MIN(c, (u_int)iov->iov_len); ! 87: error = uiomove((caddr_t)&vmmap[o], (int)c, uio); ! 88: continue; ! 89: ! 90: /* minor device 1 is kernel memory */ ! 91: case 1: ! 92: c = iov->iov_len; ! 93: if (!kernacc((caddr_t)uio->uio_offset, c, ! 94: uio->uio_rw == UIO_READ ? B_READ : B_WRITE)) ! 95: goto fault; ! 96: error = uiomove((caddr_t)uio->uio_offset, (int)c, uio); ! 97: continue; ! 98: ! 99: /* minor device 2 is EOF/RATHOLE */ ! 100: case 2: ! 101: if (uio->uio_rw == UIO_READ) ! 102: return (0); ! 103: c = iov->iov_len; ! 104: break; ! 105: ! 106: /* minor device 12 (/dev/zero) is source of nulls on read, rathole on write */ ! 107: case 12: ! 108: if (uio->uio_rw == UIO_WRITE) { ! 109: c = iov->iov_len; ! 110: break; ! 111: } ! 112: if (zbuf == NULL) { ! 113: zbuf = (caddr_t) ! 114: malloc(CLBYTES, M_TEMP, M_WAITOK); ! 115: bzero(zbuf, CLBYTES); ! 116: } ! 117: c = MIN(iov->iov_len, CLBYTES); ! 118: error = uiomove(zbuf, (int)c, uio); ! 119: continue; ! 120: ! 121: default: ! 122: return (ENXIO); ! 123: } ! 124: if (error) ! 125: break; ! 126: iov->iov_base += c; ! 127: iov->iov_len -= c; ! 128: uio->uio_offset += c; ! 129: uio->uio_resid -= c; ! 130: } ! 131: if (zbuf) ! 132: free(zbuf, M_TEMP); ! 133: return (error); ! 134: fault: ! 135: return (EFAULT); ! 136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.