Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
script3r
GitHub Repository: script3r/os161
Path: blob/master/kern/include/uio.h
2093 views
1
/*
2
* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
3
* The President and Fellows of Harvard College.
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. Neither the name of the University nor the names of its contributors
14
* may be used to endorse or promote products derived from this software
15
* without specific prior written permission.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
#ifndef _UIO_H_
31
#define _UIO_H_
32
33
/*
34
* Like BSD uio, but simplified a bit. (In BSD, there can be more than one
35
* iovec in a uio.)
36
*
37
* struct iovec is in <kern/iovec.h>.
38
*/
39
40
#include <kern/iovec.h>
41
42
/* Direction. */
43
enum uio_rw {
44
UIO_READ, /* From kernel to uio_seg */
45
UIO_WRITE, /* From uio_seg to kernel */
46
};
47
48
/* Source/destination. */
49
enum uio_seg {
50
UIO_USERISPACE, /* User process code. */
51
UIO_USERSPACE, /* User process data. */
52
UIO_SYSSPACE, /* Kernel. */
53
};
54
55
struct uio {
56
struct iovec *uio_iov; /* Data blocks */
57
unsigned uio_iovcnt; /* Number of iovecs */
58
off_t uio_offset; /* Desired offset into object */
59
size_t uio_resid; /* Remaining amt of data to xfer */
60
enum uio_seg uio_segflg; /* What kind of pointer we have */
61
enum uio_rw uio_rw; /* Whether op is a read or write */
62
struct addrspace *uio_space; /* Address space for user pointer */
63
};
64
65
66
/*
67
* Copy data from a kernel buffer to a data region defined by a uio struct,
68
* updating the uio struct's offset and resid fields. May alter the iovec
69
* fields as well.
70
*
71
* Before calling this, you should
72
* (1) set up uio_iov to point to the buffer(s) you want to transfer
73
* to, and set uio_iovcnt to the number of such buffers;
74
* (2) initialize uio_offset as desired;
75
* (3) initialize uio_resid to the total amount of data that can be
76
* transferred through this uio;
77
* (4) set up uio_seg and uio_rw correctly;
78
* (5) if uio_seg is UIO_SYSSPACE, set uio_space to NULL; otherwise,
79
* initialize uio_space to the address space in which the buffer
80
* should be found.
81
*
82
* After calling,
83
* (1) the contents of uio_iov and uio_iovcnt may be altered and
84
* should not be interpreted;
85
* (2) uio_offset will have been incremented by the amount transferred;
86
* (3) uio_resid will have been decremented by the amount transferred;
87
* (4) uio_segflg, uio_rw, and uio_space will be unchanged.
88
*
89
* uiomove() may be called repeatedly on the same uio to transfer
90
* additional data until the available buffer space the uio refers to
91
* is exhausted.
92
*
93
* Note that the actual value of uio_offset is not interpreted. It is
94
* provided to allow for easier file seek pointer management.
95
*
96
* When uiomove is called, the address space presently in context must
97
* be the same as the one recorded in uio_space. This is an important
98
* sanity check if I/O has been queued.
99
*/
100
int uiomove(void *kbuffer, size_t len, struct uio *uio);
101
102
/*
103
* Like uiomove, but sends zeros.
104
*/
105
int uiomovezeros(size_t len, struct uio *uio);
106
107
/*
108
* Initialize a uio suitable for I/O from a kernel buffer.
109
*
110
* Usage example;
111
* char buf[128];
112
* struct iovec iov;
113
* struct uio myuio;
114
*
115
* uio_kinit(&iov, &myuio, buf, sizeof(buf), 0, UIO_READ);
116
* result = VOP_READ(vn, &myuio);
117
* ...
118
*/
119
void uio_kinit(struct iovec *, struct uio *,
120
void *kbuf, size_t len, off_t pos, enum uio_rw rw);
121
122
123
#endif /* _UIO_H_ */
124
125