From ed1ed2fc98cc795acd9bdc76be6d1df138c505c7 Mon Sep 17 00:00:00 2001 From: Matthew Sotoudeh Date: Thu, 16 May 2024 02:23:46 -0700 Subject: no longer require aligned base address --- magic_buddy.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'magic_buddy.c') diff --git a/magic_buddy.c b/magic_buddy.c index 52cf764..18c4e23 100644 --- a/magic_buddy.c +++ b/magic_buddy.c @@ -13,6 +13,7 @@ struct free_list { static struct free_list *(AVAIL[ADDRESS_BITS]); static size_t ROOT_LOGSIZE; +static void *BASE; // log2 of size rounded up (ceil) or down (!ceil) to the nearest power of 2 static size_t size2log(size_t size, int ceil) { @@ -29,9 +30,11 @@ static size_t size2log(size_t size, int ceil) { void init_buddy(uint8_t *base, size_t size, uint8_t magic[MAGIC_COOKIE_BYTES]) { + BASE = base; + size_t logsize = size2log(size, 0); ROOT_LOGSIZE = logsize; - assert(((size_t)base & ((1 << logsize) - 1)) == 0); + AVAIL[logsize] = (struct free_list *)base; AVAIL[logsize]->next = 0; AVAIL[logsize]->pprev = &(AVAIL[logsize]); @@ -39,7 +42,9 @@ void init_buddy(uint8_t *base, size_t size, } static struct free_list *buddy_of(struct free_list *block, size_t logsize) { - return (void *)((size_t)block ^ (1 << logsize)); + size_t virt_block = (size_t)block - (size_t)BASE; + size_t virt_buddy = virt_block ^ (1 << logsize); + return (void*)((uint8_t*)BASE + virt_buddy); } static int isfree(struct free_list *block) { -- cgit v1.2.3