summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sotoudeh <matthew@masot.net>2024-05-16 02:23:46 -0700
committerMatthew Sotoudeh <matthew@masot.net>2024-05-16 02:23:46 -0700
commited1ed2fc98cc795acd9bdc76be6d1df138c505c7 (patch)
treea815094c8577705b6bb71c8a23fd8fc2c5cdf0b7
parentaffa5e2933186970d0a3dac38d2ca8f02190e4d9 (diff)
no longer require aligned base address
-rw-r--r--magic_buddy.c9
-rw-r--r--main.c11
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);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback