Annotation of Net2/kern/kern__physio.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com