X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/9fe5e02cf615ad121c4460fbaaac2787d1e09c0e..95be6317c7ba61fc905f0f1a9bbe37e4340e969c:/lunaix-os/kernel/mm/dmm.c diff --git a/lunaix-os/kernel/mm/dmm.c b/lunaix-os/kernel/mm/dmm.c index 04a0249..50804db 100644 --- a/lunaix-os/kernel/mm/dmm.c +++ b/lunaix-os/kernel/mm/dmm.c @@ -1,19 +1,62 @@ -#include +#include #include +#include +#include + +#include +#include +#include -// This is a temporary design. -// We can do better when we are ready for multitasking void -lxsbrk(void* current, void* next) { - // TODO: sbrk +__heap_copied(struct mm_region* region) +{ + mm_index((void**)®ion->proc_vms->heap, region); } -void -lxmalloc(size_t size) { - // TODO: Malloc +int +create_heap(struct proc_mm* pvms, ptr_t addr) +{ + struct mmap_param map_param = { .pvms = pvms, + .vms_mnt = VMS_SELF, + .flags = MAP_ANON | MAP_PRIVATE, + .type = REGION_TYPE_HEAP, + .proct = PROT_READ | PROT_WRITE, + .mlen = PAGE_SIZE }; + int status = 0; + struct mm_region* heap; + if ((status = mmap_user(NULL, &heap, addr, NULL, &map_param))) { + return status; + } + + heap->region_copied = __heap_copied; + mm_index((void**)&pvms->heap, heap); + + return status; } -void -lxfree(size_t size) { - // TODO: Free +__DEFINE_LXSYSCALL1(void*, sbrk, ssize_t, incr) +{ + struct proc_mm* pvms = vmspace(__current); + struct mm_region* heap = pvms->heap; + + assert(heap); + int err = mem_adjust_inplace(&pvms->regions, heap, heap->end + incr); + if (err) { + return (void*)__ptr(DO_STATUS(err)); + } + return (void*)heap->end; +} + +__DEFINE_LXSYSCALL1(int, brk, void*, addr) +{ + struct proc_mm* pvms = vmspace(__current); + struct mm_region* heap = pvms->heap; + + if (!heap) { + return DO_STATUS(create_heap(pvms, (ptr_t)addr)); + } + + assert(heap); + int err = mem_adjust_inplace(&pvms->regions, heap, (ptr_t)addr); + return DO_STATUS(err); } \ No newline at end of file