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