summaryrefslogtreecommitdiff
path: root/magic_buddy/magic_buddy.c
diff options
context:
space:
mode:
Diffstat (limited to 'magic_buddy/magic_buddy.c')
-rw-r--r--magic_buddy/magic_buddy.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/magic_buddy/magic_buddy.c b/magic_buddy/magic_buddy.c
index da18d4a..89daaa4 100644
--- a/magic_buddy/magic_buddy.c
+++ b/magic_buddy/magic_buddy.c
@@ -148,7 +148,8 @@ static struct free_block *rhs_child_of(struct free_block *block, size_t logsize,
// NOTE: this method is perhaps more complicated than it needs to be because we
// take great pains to avoid writing to the region that is being reserved
// (e.g., in case it is device MMIO).
-int reserve(void *start, size_t size, struct buddy *state) {
+int reserve(void *start, size_t size, void **out_start, size_t *out_size,
+ struct buddy *state) {
// (1) find the first free block to the left of start
uint8_t *base = state->base;
size_t virtual_start = (uint8_t*)start - base;
@@ -169,7 +170,8 @@ int reserve(void *start, size_t size, struct buddy *state) {
int needs_zero = 1;
size_t min_logsize = size2log(sizeof(struct free_block), 1);
pop(block);
- for (size_t logsize = block->logsize; logsize > min_logsize;) {
+ size_t logsize = block->logsize;
+ while (logsize > min_logsize) {
struct free_block *rhs_child = rhs_child_of(block, logsize, state);
if ((void*)rhs_child <= start) { // move right
block = rhs_child;
@@ -183,6 +185,8 @@ int reserve(void *start, size_t size, struct buddy *state) {
}
}
if (needs_zero) memset(block, 0, sizeof(struct free_block));
+ if (out_start) *out_start = block;
+ if (out_size) *out_size = logsize;
return 1;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback