Annotation of src/sys/sys/xio.h, revision 1.6
1.1 dillon 1: /*
1.5 dillon 2: * Copyright (c) 2003,2004 The DragonFly Project. All rights reserved.
3: *
4: * This code is derived from software contributed to The DragonFly Project
5: * by Matthew Dillon <dillon@backplane.com>
6: *
1.1 dillon 7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
1.5 dillon 10: *
1.1 dillon 11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
1.5 dillon 14: * notice, this list of conditions and the following disclaimer in
15: * the documentation and/or other materials provided with the
16: * distribution.
17: * 3. Neither the name of The DragonFly Project nor the names of its
18: * contributors may be used to endorse or promote products derived
19: * from this software without specific, prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24: * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25: * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1.1 dillon 32: * SUCH DAMAGE.
1.5 dillon 33: *
1.1 dillon 34: * $DragonFly$
35: */
36:
37: /*
1.6 ! dillon 38: * An XIO holds a platform-agnostic page list representing a data set for
! 39: * the purposes of I/O, mapping (SFBUF/MSFBUF), or other operations. The
! 40: * representation of the data set is byte aligned. xio_offset and xio_bytes
! 41: * specifies the precise byte-ranged block within the page list being
! 42: * represented.
! 43: *
! 44: * XIOs do not track an ongoing I/O, they simply represent a block of data.
! 45: * For this reason most XIO API functions have a 'uoffset' argument which
! 46: * the caller may use to index within the represented dataset. This index
! 47: * is relative to the represented dataset, NOT to the beginning of the
! 48: * first page.
1.1 dillon 49: */
50: #ifndef _SYS_XIO_H_
51: #define _SYS_XIO_H_
52:
53: #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
54:
55: #ifndef _SYS_MSGPORT_H_
56: #include <sys/msgport.h>
57: #endif
58:
59: #define XIO_INTERNAL_PAGES btoc(MAXPHYS)
60: #define XIO_INTERNAL_SIZE (XIO_INTERNAL_PAGES * PAGE_SIZE)
61:
62: struct vm_page;
63:
64: struct xio {
65: struct vm_page **xio_pages;
66: int xio_npages; /* number of pages in xio_pages[] array */
67: int xio_offset; /* byte offset (may exceed a page) */
68: int xio_bytes; /* number of bytes to transfer */
69: int xio_flags;
70: int xio_error;
71: struct vm_page *xio_internal_pages[XIO_INTERNAL_PAGES];
72: };
73:
74: typedef struct xio *xio_t;
75:
76: #define XIOF_READ 0x0001
77: #define XIOF_WRITE 0x0002
78:
79: #endif
80:
81: #if defined(_KERNEL)
82:
1.4 dillon 83: void xio_init(xio_t xio);
1.1 dillon 84: int xio_init_ubuf(xio_t xio, void *ubase, size_t ubytes, int vmprot);
85: int xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes);
86: void xio_release(xio_t xio);
1.6 ! dillon 87: int xio_uio_copy(xio_t xio, int uoffset, struct uio *uio, int *sizep);
! 88: int xio_copy_xtou(xio_t xio, int uoffset, void *uptr, int bytes);
! 89: int xio_copy_xtok(xio_t xio, int uoffset, void *kptr, int bytes);
! 90:
! 91: /*
! 92: * XIOs are not modified by copy operations, the caller must track the
! 93: * offset itself. This routine will return the number of bytes remaining
! 94: * in an XIO's buffer given an offset relative to the buffer used to
! 95: * originally construct the XIO.
! 96: */
! 97: static __inline
! 98: int
! 99: xio_remaining(xio_t xio, int uoffset)
! 100: {
! 101: return(xio->xio_bytes - uoffset);
! 102: }
! 103:
! 104: /*
! 105: * XIOs do not map data but if the page list WERE mapped, this routine will
! 106: * return the actual KVA offset given a user offset relative to the original
! 107: * buffer used to construct the XIO.
! 108: */
! 109: static __inline
! 110: int
! 111: xio_kvaoffset(xio_t xio, int uoffset)
! 112: {
! 113: return(xio->xio_offset + uoffset);
! 114: }
1.1 dillon 115:
116: #endif /* _KERNEL */
117:
1.2 joerg 118: #endif /* !_SYS_XIO_H_ */