Modified to use physical addresses, and to not assume that we can directly
[people/xl0/gpxe.git] / src / include / buffer.h
index 3c99bde..7ed57fa 100644 (file)
@@ -1,16 +1,38 @@
 #ifndef BUFFER_H
 #define BUFFER_H
 
+#include "stdint.h"
+
+/*
+ * Free blocks in the buffer start with a "tail byte".  If non-zero,
+ * this byte indicates that the free block is the tail of the buffer,
+ * i.e. occupies all the remaining space up to the end of the buffer.
+ * When the tail byte is non-zero, it indicates that the remainder of
+ * the descriptor (the struct buffer_free_block) follows the tail
+ * byte.
+ *
+ * This scheme is necessary because we may end up with a tail that is
+ * smaller than a struct buffer_free_block.
+ *
+ */
+
 struct buffer_free_block {
-       struct buffer_free_block *next;
-       struct buffer_free_block *prev; 
-       void *end;
-};
+       char            tail;
+       physaddr_t      next_free;
+       physaddr_t      end;
+} __attribute__ (( packed ));
 
 struct buffer {
-       struct buffer_free_block free_blocks;
-       void *start;
-       void *end;
+       physaddr_t      start;
+       physaddr_t      end;
+               physaddr_t      first_free;
 };
 
+/* Functions in buffer.c */
+
+extern void init_buffer ( struct buffer *buffer, physaddr_t start,
+                         size_t len );
+extern off_t fill_buffer ( struct buffer *buffer, void *data,
+                          off_t offset, size_t len );
+
 #endif /* BUFFER_H */