feat: No more kernel page table switching upon interrupt.
[lunaix-os.git] / lunaix-os / kernel / mm / kalloc.c
index 6f04e2edebcabe6a2497e00b5288e4e1509af0bb..e970c1d5ac96ad399102a28b7deca8818cff939b 100644 (file)
@@ -14,7 +14,7 @@
 #include <lunaix/mm/kalloc.h>
 #include <lunaix/mm/dmm.h>
 
-#include <lunaix/constants.h>
+#include <lunaix/common.h>
 #include <lunaix/spike.h>
 
 #include <klibc/string.h>
@@ -23,8 +23,6 @@
 
 extern uint8_t __kernel_heap_start;
 
-heap_context_t __kalloc_kheap;
-
 void*
 lx_malloc_internal(heap_context_t* heap, size_t size);
 
@@ -59,26 +57,32 @@ lx_grow_heap(heap_context_t* heap, size_t sz);
     Note: the brk always point to the beginning of epilogue.
 */
 
+static heap_context_t kheap;
+
 int
 kalloc_init() {
-    __kalloc_kheap.start = &__kernel_heap_start;
-    __kalloc_kheap.brk = NULL;
-    __kalloc_kheap.max_addr = (void*)K_STACK_START;
+    kheap.start = &__kernel_heap_start;
+    kheap.brk = NULL;
+    kheap.max_addr = (void*)KSTACK_START;
 
-    if (!dmm_init(&__kalloc_kheap)) {
+    if (!dmm_init(&kheap)) {
         return 0;
     }
 
-    SW(__kalloc_kheap.start, PACK(4, M_ALLOCATED));
-    SW(__kalloc_kheap.start + WSIZE, PACK(0, M_ALLOCATED));
-    __kalloc_kheap.brk += WSIZE;
+    SW(kheap.start, PACK(4, M_ALLOCATED));
+    SW(kheap.start + WSIZE, PACK(0, M_ALLOCATED));
+    kheap.brk += WSIZE;
 
-    return lx_grow_heap(&__kalloc_kheap, HEAP_INIT_SIZE) != NULL;
+    return lx_grow_heap(&kheap, HEAP_INIT_SIZE) != NULL;
 }
 
 void*
 lxmalloc(size_t size) {
-    return lx_malloc_internal(&__kalloc_kheap, size);
+    mutex_lock(&kheap.lock);
+    void* r = lx_malloc_internal(&kheap, size);
+    mutex_unlock(&kheap.lock);
+
+    return r;
 }
 
 void*
@@ -103,6 +107,7 @@ lxfree(void* ptr) {
     if (!ptr) {
         return;
     }
+    mutex_lock(&kheap.lock);
 
     uint8_t* chunk_ptr = (uint8_t*)ptr - WSIZE;
     uint32_t hdr = LW(chunk_ptr);
@@ -123,6 +128,8 @@ lxfree(void* ptr) {
     SW(next_hdr, LW(next_hdr) | M_PREV_FREE);
     
     coalesce(chunk_ptr);
+
+    mutex_unlock(&kheap.lock);
 }
 
 
@@ -242,7 +249,7 @@ lx_grow_heap(heap_context_t* heap, size_t sz)
     void* start;
 
     // The "+ WSIZE" capture the overhead for epilogue marker
-    if (!(start = lxbrk(heap, sz + WSIZE))) {
+    if (!(start = lxsbrk(heap, sz + WSIZE))) {
         return NULL;
     }
     sz = ROUNDUP(sz, BOUNDARY);