Modified to use physical addresses, and to not assume that we can directly
[people/xl0/gpxe.git] / src / include / buffer.h
1 #ifndef BUFFER_H
2 #define BUFFER_H
3
4 #include "stdint.h"
5
6 /*
7  * Free blocks in the buffer start with a "tail byte".  If non-zero,
8  * this byte indicates that the free block is the tail of the buffer,
9  * i.e. occupies all the remaining space up to the end of the buffer.
10  * When the tail byte is non-zero, it indicates that the remainder of
11  * the descriptor (the struct buffer_free_block) follows the tail
12  * byte.
13  *
14  * This scheme is necessary because we may end up with a tail that is
15  * smaller than a struct buffer_free_block.
16  *
17  */
18
19 struct buffer_free_block {
20         char            tail;
21         physaddr_t      next_free;
22         physaddr_t      end;
23 } __attribute__ (( packed ));
24
25 struct buffer {
26         physaddr_t      start;
27         physaddr_t      end;
28         physaddr_t      first_free;
29 };
30
31 /* Functions in buffer.c */
32
33 extern void init_buffer ( struct buffer *buffer, physaddr_t start,
34                           size_t len );
35 extern off_t fill_buffer ( struct buffer *buffer, void *data,
36                            off_t offset, size_t len );
37
38 #endif /* BUFFER_H */