#include <lunaix/mm/kalloc.h>
#include <lunaix/mm/dmm.h>
-#include <lunaix/constants.h>
+#include <lunaix/common.h>
#include <lunaix/spike.h>
-#include <libc/string.h>
+#include <klibc/string.h>
#include <stdint.h>
extern uint8_t __kernel_heap_start;
-heap_context_t __kalloc_kheap;
-
void*
lx_malloc_internal(heap_context_t* heap, size_t size);
int
kalloc_init() {
- __kalloc_kheap.start = &__kernel_heap_start;
- __kalloc_kheap.brk = NULL;
- __kalloc_kheap.max_addr = (void*)K_STACK_START;
+ heap_context_t* kheap = &__current->mm.k_heap;
+ 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);
+ return lx_malloc_internal(&__current->mm.k_heap, size);
}
void*
-lxcalloc(size_t size) {
- void* ptr = lxmalloc(size);
+lxcalloc(size_t n, size_t elem) {
+ size_t pd = n * elem;
+
+ // overflow detection
+ if (pd < elem || pd < n) {
+ return NULL;
+ }
+
+ void* ptr = lxmalloc(pd);
if (!ptr) {
return NULL;
}
- return memset(ptr, 0, size);
+ return memset(ptr, 0, pd);
}
void