diff options
Diffstat (limited to 'kernel/heap.c')
| -rw-r--r-- | kernel/heap.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/kernel/heap.c b/kernel/heap.c new file mode 100644 index 0000000..d1f1021 --- /dev/null +++ b/kernel/heap.c @@ -0,0 +1,45 @@ +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include "paging.h" + +/* a simple pointer-arithmetic-based malloc */ + +/* a symbol put there by the linker */ +extern uint32_t link_mem_end; +uint32_t kmalloc_addr = &link_mem_end; + +static void *kmalloc_int(size_t sz, int align, void **phys) +{ + if(align) + { + kmalloc_addr += (PAGE_SIZE - 1); + kmalloc_addr &= PAGE_MASK; + } + if(phys) + *phys = (void*)kmalloc_addr; + void *ret = (void*)kmalloc_addr; + kmalloc_addr += sz; + assert(((uint32_t)ret & 0xFFF) == 0); + return ret; +} + +void *kmalloc(size_t sz) +{ + return kmalloc_int(sz, 0, NULL); +} + +void *kmalloc_a(size_t sz) +{ + return kmalloc_int(sz, 1, NULL); +} + +void *kmalloc_p(size_t sz, void **phys) +{ + return kmalloc_int(sz, 0, phys); +} + +void *kmalloc_ap(size_t sz, void **phys) +{ + return kmalloc_int(sz, 1, phys); +} |