Make inetd a client of Poul-Henning Kamp's new config routines, plus
[unix-history] / sys / kern / kern__physio.c
CommitLineData
15637ed4
RG
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 *
fde1aeb2 48 * $Id: kern__physio.c,v 1.4 1993/11/25 01:32:47 wollman Exp $
15637ed4 49 */
15637ed4
RG
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 "vm/vm.h"
59#include "specdev.h"
60
15637ed4
RG
61/*
62 * Driver interface to do "raw" I/O in the address space of a
63 * user process directly for read and write operations..
64 */
65
4c45483e 66int
15637ed4 67rawread(dev, uio)
fde1aeb2
GW
68 dev_t dev;
69 struct uio *uio;
15637ed4 70{
fde1aeb2
GW
71 return (uioapply(physio,
72 (caddr_t)cdevsw[major(dev)].d_strategy,
73 (caddr_t)(u_long)dev, uio));
15637ed4
RG
74}
75
4c45483e 76int
15637ed4 77rawwrite(dev, uio)
fde1aeb2
GW
78 dev_t dev;
79 struct uio *uio;
15637ed4 80{
fde1aeb2
GW
81 return (uioapply(physio,
82 (caddr_t)cdevsw[major(dev)].d_strategy,
83 (caddr_t)(u_long)dev, uio));
15637ed4
RG
84}
85
fde1aeb2
GW
86int
87physio(strat, dev, bp, off, rw, base, len, p)
88 d_strategy_t *strat;
15637ed4 89 dev_t dev;
519fb2b7 90 struct buf *bp;
15637ed4
RG
91 int rw, off;
92 caddr_t base;
93 int *len;
94 struct proc *p;
95{
15637ed4
RG
96 int amttodo = *len, error, amtdone;
97 vm_prot_t ftype;
98 static zero;
99 caddr_t adr;
519fb2b7 100 int bp_alloc = (bp == 0);
15637ed4
RG
101
102 rw = rw == UIO_READ ? B_READ : 0;
103
104 /* create and build a buffer header for a transfer */
519fb2b7
RG
105
106 if (bp_alloc) {
107 bp = (struct buf *)malloc(sizeof(*bp), M_TEMP, M_NOWAIT);
108 bzero((char *)bp, sizeof(*bp)); /* 09 Sep 92*/
109 }
15637ed4
RG
110 bp->b_flags = B_BUSY | B_PHYS | rw;
111 bp->b_proc = p;
112 bp->b_dev = dev;
113 bp->b_error = 0;
114 bp->b_blkno = off/DEV_BSIZE;
115 amtdone = 0;
116
117 /* iteratively do I/O on as large a chunk as possible */
118 do {
119 bp->b_flags &= ~B_DONE;
120 bp->b_un.b_addr = base;
121 /* XXX limit */
122 bp->b_bcount = min (256*1024, amttodo);
123
124 /* first, check if accessible */
125 if (rw == B_READ && !useracc(base, bp->b_bcount, B_WRITE)) {
519fb2b7
RG
126 if (bp_alloc)
127 free(bp, M_TEMP);
15637ed4
RG
128 return (EFAULT);
129 }
130 if (rw == B_WRITE && !useracc(base, bp->b_bcount, B_READ)) {
519fb2b7
RG
131 if (bp_alloc)
132 free(bp, M_TEMP);
15637ed4
RG
133 return (EFAULT);
134 }
135
136 /* update referenced and dirty bits, handle copy objects */
137 if (rw == B_READ)
138 ftype = VM_PROT_READ | VM_PROT_WRITE;
139 else
140 ftype = VM_PROT_READ;
141/* 09 Sep 92*/ for (adr = (caddr_t)trunc_page(base); adr < base + bp->b_bcount;
142 adr += NBPG) {
143 vm_fault(&curproc->p_vmspace->vm_map,
fde1aeb2 144 (vm_offset_t)adr, ftype, FALSE);
15637ed4
RG
145 *(int *) adr += zero;
146 }
147
148 /* lock in core */
149 vslock (base, bp->b_bcount);
150
151 /* perform transfer */
152 physstrat(bp, strat, PRIBIO);
153
154 /* unlock */
155 vsunlock (base, bp->b_bcount, 0);
156 amtdone = bp->b_bcount - bp->b_resid;
157 amttodo -= amtdone;
158 base += amtdone;
159 bp->b_blkno += amtdone/DEV_BSIZE;
160 } while (amttodo && (bp->b_flags & B_ERROR) == 0 && amtdone > 0);
161
162 error = bp->b_error;
519fb2b7
RG
163 if (bp_alloc)
164 free(bp, M_TEMP);
15637ed4
RG
165 *len = amttodo;
166 return (error);
167}