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 +++++++-- main.c | 11 +---------- 2 files changed, 8 insertions(+), 12 deletions(-) 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) { diff --git a/main.c b/main.c index b84e958..e3b62bd 100644 --- a/main.c +++ b/main.c @@ -12,21 +12,12 @@ void get_random(uint8_t *dst, size_t count) { close(fd); } -// helper for getting an aligned allocation -static void *malloc_aligned(size_t size) { - uint8_t *data = malloc(size); - if (!((size_t)data % size)) return data; - data = realloc(data, size * 2); - data = data + (size - ((size_t)data % size)); - return data; -} - void main() { size_t region_size = 1024 * 1024; uint8_t magic[MAGIC_COOKIE_BYTES]; get_random(magic, MAGIC_COOKIE_BYTES); - init_buddy(malloc_aligned(region_size), region_size, magic); + init_buddy(malloc(region_size), region_size, magic); memset(magic, 0, sizeof(magic)); void *x = allocate(1024); -- cgit v1.2.3