diff --git a/kernel/include/kmalloc.h b/kernel/include/kmalloc.h index 7635647..f594ace 100644 --- a/kernel/include/kmalloc.h +++ b/kernel/include/kmalloc.h @@ -17,47 +17,48 @@ void* kcalloc(size_t count, size_t size); // powers of 2 #define KMALLOC_MAX_SIZE 17 +#define LOWEST_POWER 3 union per_cpu_freelist_cache { - void* freelists[KMALLOC_MAX_SIZE]; + void** freelists[KMALLOC_MAX_SIZE]; struct { - void* kmalloc_8; - void* kmalloc_16; - void* kmalloc_32; - void* kmalloc_64; - void* kmalloc_128; - void* kmalloc_256; - void* kmalloc_512; - void* kmalloc_1024; - void* kmalloc_2048; - void* kmalloc_4096; - void* kmalloc_8192; - void* kmalloc_16384; - void* kmalloc_32768; - void* kmalloc_65536; - void* kmalloc_131072; + void** kmalloc_8; + void** kmalloc_16; + void** kmalloc_32; + void** kmalloc_64; + void** kmalloc_128; + void** kmalloc_256; + void** kmalloc_512; + void** kmalloc_1024; + void** kmalloc_2048; + void** kmalloc_4096; + void** kmalloc_8192; + void** kmalloc_16384; + void** kmalloc_32768; + void** kmalloc_65536; + void** kmalloc_131072; }; }; union partial_list { - void* freelists[KMALLOC_MAX_SIZE]; + void** freelists[KMALLOC_MAX_SIZE]; struct { - void* kmalloc_8; - void* kmalloc_16; - void* kmalloc_32; - void* kmalloc_64; - void* kmalloc_128; - void* kmalloc_256; - void* kmalloc_512; - void* kmalloc_1024; - void* kmalloc_2048; - void* kmalloc_4096; - void* kmalloc_8192; - void* kmalloc_16384; - void* kmalloc_32768; - void* kmalloc_65536; - void* kmalloc_131072; + void** kmalloc_8; + void** kmalloc_16; + void** kmalloc_32; + void** kmalloc_64; + void** kmalloc_128; + void** kmalloc_256; + void** kmalloc_512; + void** kmalloc_1024; + void** kmalloc_2048; + void** kmalloc_4096; + void** kmalloc_8192; + void** kmalloc_16384; + void** kmalloc_32768; + void** kmalloc_65536; + void** kmalloc_131072; }; }; -#endif \ No newline at end of file +#endif diff --git a/kernel/src/kmalloc.c b/kernel/src/kmalloc.c index 94531d0..acab25a 100644 --- a/kernel/src/kmalloc.c +++ b/kernel/src/kmalloc.c @@ -1,5 +1,7 @@ +#include "kernel.h" #include "types.h" #include +#include #include // this file contains SLUB inspired HEAP allocator @@ -46,7 +48,32 @@ void* kmalloc(size_t size) { : "eax", "edx"); // freelists_all_cpus[core_id]; - // TODO enable when we actualy know how many CPUs we have - if () { + // TODO disable when we actualy know how many CPUs we have + core_id = 0; + + size_t alloc_index; + { + uint8_t leading_zeros = __builtin_clzll(size); + if (__builtin_popcountll(size) == 1) { + alloc_index = leading_zeros; + } else { + alloc_index = sizeof(size) * CHAR_BIT - leading_zeros; + } + if (alloc_index > KMALLOC_MAX_SIZE) { + // NOT IMPLEMENTED + printk("Cannot allocate [%lu] bytes: \e[1MNOT " + "IMPLEMENTED!\e[8M\n", + size); + return NULL; + } + alloc_index -= LOWEST_POWER; + } + void** selected_freelist = + freelists_all_cpus[core_id].freelists[alloc_index]; + if (selected_freelist != NULL) { + // fast path + void** second_item_in_list = *selected_freelist; + } else { + // slower path } } \ No newline at end of file