|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989, 1990, 1991, 1992 William F. Jolitz, TeleMuse ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This software is a component of "386BSD" developed by ! 16: William F. Jolitz, TeleMuse. ! 17: * 4. Neither the name of the developer nor the name "386BSD" ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS A COMPONENT OF 386BSD DEVELOPED BY WILLIAM F. JOLITZ ! 22: * AND IS INTENDED FOR RESEARCH AND EDUCATIONAL PURPOSES ONLY. THIS ! 23: * SOFTWARE SHOULD NOT BE CONSIDERED TO BE A COMMERCIAL PRODUCT. ! 24: * THE DEVELOPER URGES THAT USERS WHO REQUIRE A COMMERCIAL PRODUCT ! 25: * NOT MAKE USE THIS WORK. ! 26: * ! 27: * FOR USERS WHO WISH TO UNDERSTAND THE 386BSD SYSTEM DEVELOPED ! 28: * BY WILLIAM F. JOLITZ, WE RECOMMEND THE USER STUDY WRITTEN ! 29: * REFERENCES SUCH AS THE "PORTING UNIX TO THE 386" SERIES ! 30: * (BEGINNING JANUARY 1991 "DR. DOBBS JOURNAL", USA AND BEGINNING ! 31: * JUNE 1991 "UNIX MAGAZIN", GERMANY) BY WILLIAM F. JOLITZ AND ! 32: * LYNNE GREER JOLITZ, AS WELL AS OTHER BOOKS ON UNIX AND THE ! 33: * ON-LINE 386BSD USER MANUAL BEFORE USE. A BOOK DISCUSSING THE INTERNALS ! 34: * OF 386BSD ENTITLED "386BSD FROM THE INSIDE OUT" WILL BE AVAILABLE LATE 1992. ! 35: * ! 36: * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ! 37: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 38: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 39: * ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPER BE LIABLE ! 40: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 41: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 42: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 43: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 44: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 45: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 46: * SUCH DAMAGE. ! 47: * ! 48: */ ! 49: static char rcsid[] = "$Header: /usr/bill/working/sys/kern/RCS/kern__physio.c,v 1.3 92/01/21 21:29:06 william Exp $"; ! 50: ! 51: #include "param.h" ! 52: #include "systm.h" ! 53: #include "buf.h" ! 54: #include "conf.h" ! 55: #include "proc.h" ! 56: #include "malloc.h" ! 57: #include "vnode.h" ! 58: #include "specdev.h" ! 59: ! 60: static physio(int (*)(), int, int, int, caddr_t, int *, struct proc *); ! 61: ! 62: /* ! 63: * Driver interface to do "raw" I/O in the address space of a ! 64: * user process directly for read and write operations.. ! 65: */ ! 66: ! 67: rawread(dev, uio) ! 68: dev_t dev; struct uio *uio; ! 69: { ! 70: return (uioapply(physio, cdevsw[major(dev)].d_strategy, dev, uio)); ! 71: } ! 72: ! 73: rawwrite(dev, uio) ! 74: dev_t dev; struct uio *uio; ! 75: { ! 76: return (uioapply(physio, cdevsw[major(dev)].d_strategy, dev, uio)); ! 77: } ! 78: ! 79: static physio(strat, dev, off, rw, base, len, p) ! 80: int (*strat)(); ! 81: dev_t dev; ! 82: int rw, off; ! 83: caddr_t base; ! 84: int *len; ! 85: struct proc *p; ! 86: { ! 87: register struct buf *bp; ! 88: int resid = *len, error; ! 89: ! 90: rw = rw == UIO_READ ? B_READ : 0; ! 91: ! 92: /* create and build a buffer header for a transfer */ ! 93: bp = (struct buf *)malloc(sizeof(*bp), M_TEMP, M_NOWAIT); ! 94: bp->b_flags = B_BUSY | B_PHYS | rw; ! 95: bp->b_proc = p; ! 96: bp->b_dev = dev; ! 97: bp->b_error = 0; ! 98: bp->b_blkno = off/DEV_BSIZE; ! 99: ! 100: /* iteratively do I/O on as large a chunk as possible */ ! 101: do { ! 102: bp->b_flags &= ~B_DONE; ! 103: bp->b_un.b_addr = base; ! 104: /* DMA controller limit */ ! 105: bp->b_bcount = min (64*1024, resid); ! 106: resid -= bp->b_bcount; ! 107: off += bp->b_bcount; ! 108: ! 109: /* first, check if accessible */ ! 110: if (rw == B_READ && !useracc(base, bp->b_bcount, B_WRITE)) ! 111: return (EFAULT); ! 112: if (rw == B_WRITE && !useracc(base, bp->b_bcount, B_READ)) ! 113: return (EFAULT); ! 114: ! 115: /* lock in core */ ! 116: vslock (base, bp->b_bcount); ! 117: ! 118: /* perform transfer */ ! 119: physstrat(bp, strat, PRIBIO); ! 120: ! 121: /* unlock */ ! 122: vsunlock (base, bp->b_bcount, 0); ! 123: resid += bp->b_resid; ! 124: bp->b_blkno = off/DEV_BSIZE; ! 125: } while (resid && (bp->b_flags & B_ERROR) == 0 && bp->b_resid == 0); ! 126: ! 127: error = bp->b_error; ! 128: free(bp, M_TEMP); ! 129: *len = resid; ! 130: return (error); ! 131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.