1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 6707 brutus * Common Development and Distribution License (the "License"). 6 6707 brutus * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 9412 Aleksandr * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27 0 stevel /* All Rights Reserved */ 28 0 stevel 29 0 stevel /* 30 0 stevel * University Copyright- Copyright (c) 1982, 1986, 1988 31 0 stevel * The Regents of the University of California 32 0 stevel * All Rights Reserved 33 0 stevel * 34 0 stevel * University Acknowledgment- Portions of this document are derived from 35 0 stevel * software developed by the University of California, Berkeley, and its 36 0 stevel * contributors. 37 0 stevel */ 38 0 stevel 39 0 stevel #ifndef _SYS_UIO_H 40 0 stevel #define _SYS_UIO_H 41 0 stevel 42 0 stevel #include <sys/feature_tests.h> 43 0 stevel 44 0 stevel #ifdef __cplusplus 45 0 stevel extern "C" { 46 0 stevel #endif 47 0 stevel 48 0 stevel #include <sys/types.h> 49 0 stevel 50 0 stevel /* 51 0 stevel * I/O parameter information. A uio structure describes the I/O which 52 0 stevel * is to be performed by an operation. Typically the data movement will 53 0 stevel * be performed by a routine such as uiomove(), which updates the uio 54 0 stevel * structure to reflect what was done. 55 0 stevel */ 56 0 stevel 57 0 stevel #if defined(_XPG4_2) 58 0 stevel typedef struct iovec { 59 0 stevel void *iov_base; 60 0 stevel size_t iov_len; 61 0 stevel } iovec_t; 62 0 stevel #else 63 0 stevel typedef struct iovec { 64 0 stevel caddr_t iov_base; 65 0 stevel #if defined(_LP64) 66 0 stevel size_t iov_len; 67 0 stevel #else 68 0 stevel long iov_len; 69 0 stevel #endif 70 0 stevel } iovec_t; 71 0 stevel #endif /* defined(_XPG4_2) */ 72 0 stevel 73 0 stevel #if defined(_SYSCALL32) 74 0 stevel 75 0 stevel /* Kernel's view of user ILP32 iovec struct */ 76 0 stevel 77 0 stevel typedef struct iovec32 { 78 0 stevel caddr32_t iov_base; 79 0 stevel int32_t iov_len; 80 0 stevel } iovec32_t; 81 0 stevel 82 0 stevel #endif /* _SYSCALL32 */ 83 0 stevel 84 0 stevel #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 85 0 stevel /* 86 0 stevel * Segment flag values. 87 0 stevel */ 88 0 stevel typedef enum uio_seg { UIO_USERSPACE, UIO_SYSSPACE, UIO_USERISPACE } uio_seg_t; 89 0 stevel 90 0 stevel typedef struct uio { 91 0 stevel iovec_t *uio_iov; /* pointer to array of iovecs */ 92 0 stevel int uio_iovcnt; /* number of iovecs */ 93 0 stevel lloff_t _uio_offset; /* file offset */ 94 0 stevel uio_seg_t uio_segflg; /* address space (kernel or user) */ 95 0 stevel uint16_t uio_fmode; /* file mode flags */ 96 0 stevel uint16_t uio_extflg; /* extended flags */ 97 0 stevel lloff_t _uio_limit; /* u-limit (maximum byte offset) */ 98 0 stevel ssize_t uio_resid; /* residual count */ 99 0 stevel } uio_t; 100 0 stevel 101 6707 brutus /* 102 6707 brutus * Extended uio_t uioa_t used for asynchronous uio. 103 6707 brutus * 104 6707 brutus * Note: UIOA_IOV_MAX is defined and used as it is in "fs/vncalls.c" 105 6707 brutus * as there isn't a formal definition of IOV_MAX for the kernel. 106 6707 brutus */ 107 6707 brutus #define UIOA_IOV_MAX 16 108 6707 brutus 109 6707 brutus typedef struct uioa_page_s { /* locked uio_iov state */ 110 6707 brutus int uioa_pfncnt; /* count of pfn_t(s) in *uioa_ppp */ 111 6707 brutus void **uioa_ppp; /* page_t or pfn_t arrary */ 112 6707 brutus caddr_t uioa_base; /* address base */ 113 6707 brutus size_t uioa_len; /* span length */ 114 6707 brutus } uioa_page_t; 115 6707 brutus 116 6707 brutus typedef struct uioa_s { 117 6707 brutus iovec_t *uio_iov; /* pointer to array of iovecs */ 118 6707 brutus int uio_iovcnt; /* number of iovecs */ 119 6707 brutus lloff_t _uio_offset; /* file offset */ 120 6707 brutus uio_seg_t uio_segflg; /* address space (kernel or user) */ 121 6707 brutus uint16_t uio_fmode; /* file mode flags */ 122 6707 brutus uint16_t uio_extflg; /* extended flags */ 123 6707 brutus lloff_t _uio_limit; /* u-limit (maximum byte offset) */ 124 6707 brutus ssize_t uio_resid; /* residual count */ 125 6707 brutus /* 126 6707 brutus * uioa extended members. 127 6707 brutus */ 128 6707 brutus uint32_t uioa_state; /* state of asynch i/o */ 129 7660 Eric ssize_t uioa_mbytes; /* bytes that have been uioamove()ed */ 130 6707 brutus uioa_page_t *uioa_lcur; /* pointer into uioa_locked[] */ 131 6707 brutus void **uioa_lppp; /* pointer into lcur->uioa_ppp[] */ 132 6707 brutus void *uioa_hwst[4]; /* opaque hardware state */ 133 6707 brutus uioa_page_t uioa_locked[UIOA_IOV_MAX]; /* Per iov locked pages */ 134 6707 brutus } uioa_t; 135 6707 brutus 136 6707 brutus #define UIOA_ALLOC 0x0001 /* allocated but not yet initialized */ 137 6707 brutus #define UIOA_INIT 0x0002 /* initialized but not yet enabled */ 138 6707 brutus #define UIOA_ENABLED 0x0004 /* enabled, asynch i/o active */ 139 6707 brutus #define UIOA_FINI 0x0008 /* finished waiting for uioafini() */ 140 6707 brutus 141 6707 brutus #define UIOA_CLR (~0x000F) /* clear mutually exclusive bits */ 142 6707 brutus 143 6707 brutus #define UIOA_POLL 0x0010 /* need dcopy_poll() */ 144 6707 brutus 145 0 stevel #define uio_loffset _uio_offset._f 146 0 stevel #if !defined(_LP64) 147 0 stevel #define uio_offset _uio_offset._p._l 148 0 stevel #else 149 0 stevel #define uio_offset uio_loffset 150 0 stevel #endif 151 0 stevel 152 0 stevel #define uio_llimit _uio_limit._f 153 0 stevel #if !defined(_LP64) 154 0 stevel #define uio_limit _uio_limit._p._l 155 0 stevel #else 156 0 stevel #define uio_limit uio_llimit 157 0 stevel #endif 158 0 stevel 159 0 stevel /* 160 0 stevel * I/O direction. 161 0 stevel */ 162 0 stevel typedef enum uio_rw { UIO_READ, UIO_WRITE } uio_rw_t; 163 0 stevel 164 0 stevel /* 165 0 stevel * uio_extflg: extended flags 166 0 stevel * 167 0 stevel * NOTE: This flag will be used in uiomove to determine if non-temporal 168 0 stevel * access, ie, access bypassing caches, should be used. Filesystems that 169 0 stevel * don't initialize this field could experience suboptimal performance due to 170 0 stevel * the random data the field contains. 171 6707 brutus * 172 6707 brutus * NOTE: This flag is also used by uioasync callers to pass an extended 173 6707 brutus * uio_t (uioa_t), to uioasync enabled consumers. Unlike above all 174 6707 brutus * consumers of a uioa_t require the uio_extflg to be initialized. 175 0 stevel */ 176 0 stevel #define UIO_COPY_DEFAULT 0x0000 /* no special options to copy */ 177 0 stevel #define UIO_COPY_CACHED 0x0001 /* copy should not bypass caches */ 178 6707 brutus 179 6707 brutus #define UIO_ASYNC 0x0002 /* uio_t is really a uioa_t */ 180 6707 brutus 181 6707 brutus /* 182 6707 brutus * Global uioasync capability shadow state. 183 6707 brutus */ 184 6707 brutus typedef struct uioasync_s { 185 6707 brutus boolean_t enabled; /* Is uioasync enabled? */ 186 6707 brutus size_t mincnt; /* Minimum byte count for use of */ 187 6707 brutus } uioasync_t; 188 0 stevel 189 0 stevel #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 190 0 stevel 191 0 stevel #if defined(_KERNEL) 192 0 stevel 193 0 stevel int uiomove(void *, size_t, enum uio_rw, uio_t *); 194 8059 Donghai void uio_prefaultpages(ssize_t, uio_t *); 195 9412 Aleksandr int uiocopy(void *, size_t, enum uio_rw, uio_t *, size_t *); 196 0 stevel int ureadc(int, uio_t *); /* should be errno_t in future */ 197 0 stevel int uwritec(struct uio *); 198 0 stevel void uioskip(uio_t *, size_t); 199 0 stevel int uiodup(uio_t *, uio_t *, iovec_t *, int); 200 6707 brutus 201 6707 brutus int uioamove(void *, size_t, enum uio_rw, uioa_t *); 202 6707 brutus int uioainit(uio_t *, uioa_t *); 203 6707 brutus int uioafini(uio_t *, uioa_t *); 204 6707 brutus extern uioasync_t uioasync; 205 0 stevel 206 0 stevel #else /* defined(_KERNEL) */ 207 0 stevel 208 0 stevel #if defined(__STDC__) 209 0 stevel 210 0 stevel extern ssize_t readv(int, const struct iovec *, int); 211 0 stevel extern ssize_t writev(int, const struct iovec *, int); 212 0 stevel 213 0 stevel #else /* defined(__STDC__) */ 214 0 stevel 215 0 stevel extern ssize_t readv(); 216 0 stevel extern ssize_t writev(); 217 0 stevel 218 0 stevel #endif /* defined(__STDC__) */ 219 0 stevel 220 0 stevel #endif /* defined(_KERNEL) */ 221 0 stevel 222 0 stevel #ifdef __cplusplus 223 0 stevel } 224 0 stevel #endif 225 0 stevel 226 0 stevel #endif /* _SYS_UIO_H */ 227