4 * @brief Dynamic memory manager for heap. This design do not incorporate any\
5 * specific implementation of malloc family. The main purpose of this routines is to
6 * provide handy method to initialize & grow the heap as needed by upstream implementation.
8 * This is designed to be portable, so it can serve as syscalls to malloc/free in the c std lib.
13 * @copyright Copyright (c) Lunaixsky 2022
17 #include <lunaix/mm/dmm.h>
18 #include <lunaix/mm/vmm.h>
19 #include <lunaix/mm/page.h>
21 #include <lunaix/spike.h>
24 dmm_init(heap_context_t* heap)
26 assert((uintptr_t)heap->start % BOUNDARY == 0);
28 heap->brk = heap->start;
30 return vmm_alloc_page(heap->brk, PG_PREM_RW) != NULL;
34 lxsbrk(heap_context_t* heap, void* addr)
36 return lxbrk(heap, addr - heap->brk) != NULL;
40 lxbrk(heap_context_t* heap, size_t size)
46 void* current_brk = heap->brk;
48 // The upper bound of our next brk of heap given the size.
49 // This will be used to calculate the page we need to allocate.
50 void* next = current_brk + ROUNDUP(size, BOUNDARY);
52 // any invalid situations
53 if (next >= heap->max_addr || next < current_brk) {
57 uintptr_t diff = PG_ALIGN(next) - PG_ALIGN(current_brk);
59 // if next do require new pages to be allocated
60 if (!vmm_alloc_pages((void*)(PG_ALIGN(current_brk) + PG_SIZE),
64 assert_msg(0, "unable to brk");