1 | /*- |
---|
2 | * Copyright (c) 1982, 1986, 1993, 1994 |
---|
3 | * The Regents of the University of California. 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 | * 4. 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 REGENTS 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 REGENTS 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 | * @(#)uio.h 8.5 (Berkeley) 2/22/94 |
---|
30 | * $FreeBSD: head/sys/sys/uio.h 291716 2015-12-03 20:54:55Z ken $ |
---|
31 | */ |
---|
32 | |
---|
33 | #ifndef _SYS_UIO_H_ |
---|
34 | #define _SYS_UIO_H_ |
---|
35 | |
---|
36 | #include <sys/cdefs.h> |
---|
37 | #include <sys/_types.h> |
---|
38 | #include <sys/_iovec.h> |
---|
39 | |
---|
40 | #ifndef _SSIZE_T_DECLARED |
---|
41 | typedef __ssize_t ssize_t; |
---|
42 | #define _SSIZE_T_DECLARED |
---|
43 | #endif |
---|
44 | |
---|
45 | #ifndef _OFF_T_DECLARED |
---|
46 | typedef __off_t off_t; |
---|
47 | #define _OFF_T_DECLARED |
---|
48 | #endif |
---|
49 | |
---|
50 | #if __BSD_VISIBLE |
---|
51 | enum uio_rw { UIO_READ, UIO_WRITE }; |
---|
52 | |
---|
53 | /* Segment flag values. */ |
---|
54 | enum uio_seg { |
---|
55 | UIO_USERSPACE, /* from user data space */ |
---|
56 | UIO_SYSSPACE, /* from system space */ |
---|
57 | UIO_NOCOPY /* don't copy, already in object */ |
---|
58 | }; |
---|
59 | #endif |
---|
60 | |
---|
61 | #ifdef _KERNEL |
---|
62 | |
---|
63 | struct uio { |
---|
64 | struct iovec *uio_iov; /* scatter/gather list */ |
---|
65 | int uio_iovcnt; /* length of scatter/gather list */ |
---|
66 | off_t uio_offset; /* offset in target object */ |
---|
67 | ssize_t uio_resid; /* remaining bytes to process */ |
---|
68 | enum uio_seg uio_segflg; /* address space */ |
---|
69 | enum uio_rw uio_rw; /* operation */ |
---|
70 | struct thread *uio_td; /* owner */ |
---|
71 | }; |
---|
72 | |
---|
73 | /* |
---|
74 | * Limits |
---|
75 | * |
---|
76 | * N.B.: UIO_MAXIOV must be no less than IOV_MAX from <sys/syslimits.h> |
---|
77 | * which in turn must be no less than _XOPEN_IOV_MAX from <limits.h>. If |
---|
78 | * we ever make this tunable (probably pointless), then IOV_MAX should be |
---|
79 | * removed from <sys/syslimits.h> and applications would be expected to use |
---|
80 | * sysconf(3) to find out the correct value, or else assume the worst |
---|
81 | * (_XOPEN_IOV_MAX). Perhaps UIO_MAXIOV should be simply defined as |
---|
82 | * IOV_MAX. |
---|
83 | */ |
---|
84 | #define UIO_MAXIOV 1024 /* max 1K of iov's */ |
---|
85 | |
---|
86 | struct vm_object; |
---|
87 | struct vm_page; |
---|
88 | struct bus_dma_segment; |
---|
89 | |
---|
90 | struct uio *cloneuio(struct uio *uiop); |
---|
91 | int copyinfrom(const void * __restrict src, void * __restrict dst, |
---|
92 | size_t len, int seg); |
---|
93 | int copyiniov(const struct iovec *iovp, u_int iovcnt, struct iovec **iov, |
---|
94 | int error); |
---|
95 | int copyinstrfrom(const void * __restrict src, void * __restrict dst, |
---|
96 | size_t len, size_t * __restrict copied, int seg); |
---|
97 | int copyinuio(const struct iovec *iovp, u_int iovcnt, struct uio **uiop); |
---|
98 | int copyout_map(struct thread *td, vm_offset_t *addr, size_t sz); |
---|
99 | int copyout_unmap(struct thread *td, vm_offset_t addr, size_t sz); |
---|
100 | #ifndef __rtems__ |
---|
101 | int physcopyin(void *src, vm_paddr_t dst, size_t len); |
---|
102 | int physcopyout(vm_paddr_t src, void *dst, size_t len); |
---|
103 | int physcopyin_vlist(struct bus_dma_segment *src, off_t offset, |
---|
104 | vm_paddr_t dst, size_t len); |
---|
105 | int physcopyout_vlist(vm_paddr_t src, struct bus_dma_segment *dst, |
---|
106 | off_t offset, size_t len); |
---|
107 | #endif /* __rtems__ */ |
---|
108 | int uiomove(void *cp, int n, struct uio *uio); |
---|
109 | int uiomove_frombuf(void *buf, int buflen, struct uio *uio); |
---|
110 | #ifndef __rtems__ |
---|
111 | int uiomove_fromphys(struct vm_page *ma[], vm_offset_t offset, int n, |
---|
112 | struct uio *uio); |
---|
113 | #endif /* __rtems__ */ |
---|
114 | int uiomove_nofault(void *cp, int n, struct uio *uio); |
---|
115 | int uiomove_object(struct vm_object *obj, off_t obj_size, struct uio *uio); |
---|
116 | |
---|
117 | #else /* !_KERNEL */ |
---|
118 | |
---|
119 | __BEGIN_DECLS |
---|
120 | ssize_t readv(int, const struct iovec *, int); |
---|
121 | ssize_t writev(int, const struct iovec *, int); |
---|
122 | #if __BSD_VISIBLE |
---|
123 | ssize_t preadv(int, const struct iovec *, int, off_t); |
---|
124 | ssize_t pwritev(int, const struct iovec *, int, off_t); |
---|
125 | #endif |
---|
126 | __END_DECLS |
---|
127 | |
---|
128 | #endif /* _KERNEL */ |
---|
129 | |
---|
130 | #endif /* !_SYS_UIO_H_ */ |
---|