*/
unsigned long num_free_blocks;
+
+ void *user_metadata; // whatever the user wants
struct rb_node tree_node;
};
unsigned int node_id);
extern void
-buddy_deinit(struct buddy_memzone * zone);
+buddy_deinit(struct buddy_memzone * zone,
+ int (*free_callback)(void *user_metadata));
/* Add pool at given physical address */
extern int
buddy_add_pool(struct buddy_memzone * zone,
unsigned long base_addr,
- unsigned long pool_order);
+ unsigned long pool_order,
+ void *user_metadata);
/* Remove pool based at given physical address */
extern int
buddy_remove_pool(struct buddy_memzone * zone,
unsigned long base_addr,
- unsigned char force);
+ unsigned char force,
+ void **user_metadata);
+
+// constraint=0 => no constraints, otherwise bitmask of:
+#define LWK_BUDDY_CONSTRAINT_4GB 0x1
/* Allocate pages, returns physical address */
extern uintptr_t
buddy_alloc(struct buddy_memzone * zone,
- unsigned long order);
+ unsigned long order,
+ int constraints);
/* Free a physical address */
-extern void
+extern int
buddy_free(struct buddy_memzone * zone,
uintptr_t addr,
unsigned long order);