|
|
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"
1.1.1.2 ! root 58: #include "vm/vm.h"
1.1 root 59: #include "specdev.h"
60:
61: static physio(int (*)(), int, int, int, caddr_t, int *, struct proc *);
62:
63: /*
64: * Driver interface to do "raw" I/O in the address space of a
65: * user process directly for read and write operations..
66: */
67:
68: rawread(dev, uio)
69: dev_t dev; struct uio *uio;
70: {
71: return (uioapply(physio, cdevsw[major(dev)].d_strategy, dev, uio));
72: }
73:
74: rawwrite(dev, uio)
75: dev_t dev; struct uio *uio;
76: {
77: return (uioapply(physio, cdevsw[major(dev)].d_strategy, dev, uio));
78: }
79:
80: static physio(strat, dev, off, rw, base, len, p)
81: int (*strat)();
82: dev_t dev;
83: int rw, off;
84: caddr_t base;
85: int *len;
86: struct proc *p;
87: {
88: register struct buf *bp;
1.1.1.2 ! root 89: int amttodo = *len, error, amtdone;
! 90: vm_prot_t ftype;
! 91: static zero;
! 92: caddr_t adr;
1.1 root 93:
94: rw = rw == UIO_READ ? B_READ : 0;
95:
96: /* create and build a buffer header for a transfer */
97: bp = (struct buf *)malloc(sizeof(*bp), M_TEMP, M_NOWAIT);
98: bp->b_flags = B_BUSY | B_PHYS | rw;
99: bp->b_proc = p;
100: bp->b_dev = dev;
101: bp->b_error = 0;
102: bp->b_blkno = off/DEV_BSIZE;
1.1.1.2 ! root 103: amtdone = 0;
1.1 root 104:
105: /* iteratively do I/O on as large a chunk as possible */
106: do {
107: bp->b_flags &= ~B_DONE;
108: bp->b_un.b_addr = base;
1.1.1.2 ! root 109: /* XXX limit */
! 110: bp->b_bcount = min (256*1024, amttodo);
1.1 root 111:
112: /* first, check if accessible */
113: if (rw == B_READ && !useracc(base, bp->b_bcount, B_WRITE))
114: return (EFAULT);
115: if (rw == B_WRITE && !useracc(base, bp->b_bcount, B_READ))
116: return (EFAULT);
117:
1.1.1.2 ! root 118: /* update referenced and dirty bits, handle copy objects */
! 119: if (rw == B_READ)
! 120: ftype = VM_PROT_READ | VM_PROT_WRITE;
! 121: else
! 122: ftype = VM_PROT_READ;
! 123: for (adr = trunc_page(base) ; adr < base + bp->b_bcount;
! 124: adr += NBPG) {
! 125: vm_fault(&curproc->p_vmspace->vm_map,
! 126: adr, ftype, FALSE);
! 127: *(int *) adr += zero;
! 128: }
! 129:
1.1 root 130: /* lock in core */
131: vslock (base, bp->b_bcount);
132:
133: /* perform transfer */
134: physstrat(bp, strat, PRIBIO);
135:
136: /* unlock */
137: vsunlock (base, bp->b_bcount, 0);
1.1.1.2 ! root 138: amtdone = bp->b_bcount - bp->b_resid;
! 139: amttodo -= amtdone;
! 140: base += amtdone;
! 141: bp->b_blkno += amtdone/DEV_BSIZE;
! 142: } while (amttodo && (bp->b_flags & B_ERROR) == 0 && amtdone > 0);
1.1 root 143:
144: error = bp->b_error;
145: free(bp, M_TEMP);
1.1.1.2 ! root 146: *len = amttodo;
1.1 root 147: return (error);
148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.