These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / xferbuf.h
1 #ifndef _IPXE_XFERBUF_H
2 #define _IPXE_XFERBUF_H
3
4 /** @file
5  *
6  * Data transfer buffer
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
12 #include <stdint.h>
13 #include <ipxe/iobuf.h>
14 #include <ipxe/uaccess.h>
15 #include <ipxe/interface.h>
16 #include <ipxe/xfer.h>
17
18 /** A data transfer buffer */
19 struct xfer_buffer {
20         /** Data */
21         void *data;
22         /** Size of data */
23         size_t len;
24         /** Current offset within data */
25         size_t pos;
26         /** Data transfer buffer operations */
27         struct xfer_buffer_operations *op;
28 };
29
30 /** Data transfer buffer operations */
31 struct xfer_buffer_operations {
32         /** Reallocate data buffer
33          *
34          * @v xferbuf           Data transfer buffer
35          * @v len               New length (or zero to free buffer)
36          * @ret rc              Return status code
37          */
38         int ( * realloc ) ( struct xfer_buffer *xferbuf, size_t len );
39         /** Write data to buffer
40          *
41          * @v xferbuf           Data transfer buffer
42          * @v offset            Starting offset
43          * @v data              Data to write
44          * @v len               Length of data
45          *
46          * This call is simply a wrapper for the appropriate
47          * memcpy()-like operation: the caller is responsible for
48          * ensuring that the write does not exceed the buffer length.
49          */
50         void ( * write ) ( struct xfer_buffer *xferbuf, size_t offset,
51                            const void *data, size_t len );
52         /** Read data from buffer
53          *
54          * @v xferbuf           Data transfer buffer
55          * @v offset            Starting offset
56          * @v data              Data to read
57          * @v len               Length of data
58          *
59          * This call is simply a wrapper for the appropriate
60          * memcpy()-like operation: the caller is responsible for
61          * ensuring that the read does not exceed the buffer length.
62          */
63         void ( * read ) ( struct xfer_buffer *xferbuf, size_t offset,
64                           void *data, size_t len );
65 };
66
67 extern struct xfer_buffer_operations xferbuf_malloc_operations;
68 extern struct xfer_buffer_operations xferbuf_umalloc_operations;
69
70 /**
71  * Initialise malloc()-based data transfer buffer
72  *
73  * @v xferbuf           Data transfer buffer
74  */
75 static inline __attribute__ (( always_inline )) void
76 xferbuf_malloc_init ( struct xfer_buffer *xferbuf ) {
77         xferbuf->op = &xferbuf_malloc_operations;
78 }
79
80 /**
81  * Initialise umalloc()-based data transfer buffer
82  *
83  * @v xferbuf           Data transfer buffer
84  * @v data              User pointer
85  */
86 static inline __attribute__ (( always_inline )) void
87 xferbuf_umalloc_init ( struct xfer_buffer *xferbuf, userptr_t *data ) {
88         xferbuf->data = data;
89         xferbuf->op = &xferbuf_umalloc_operations;
90 }
91
92 extern void xferbuf_free ( struct xfer_buffer *xferbuf );
93 extern int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset,
94                            const void *data, size_t len );
95 extern int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset,
96                           void *data, size_t len );
97 extern int xferbuf_deliver ( struct xfer_buffer *xferbuf,
98                              struct io_buffer *iobuf,
99                              struct xfer_metadata *meta );
100
101 extern struct xfer_buffer * xfer_buffer ( struct interface *intf );
102 #define xfer_buffer_TYPE( object_type ) \
103         typeof ( struct xfer_buffer * ( object_type ) )
104
105 #endif /* _IPXE_XFERBUF_H */