1 #include <lunaix/mm/mmap.h>
2 #include <lunaix/mm/vmm.h>
3 #include <lunaix/process.h>
4 #include <lunaix/status.h>
6 #include <lunaix/spike.h>
7 #include <lunaix/syscall.h>
8 #include <lunaix/syscall_utils.h>
11 __heap_copied(struct mm_region* region)
13 mm_index((void**)®ion->proc_vms->heap, region);
17 create_heap(struct proc_mm* pvms, ptr_t addr)
19 struct mmap_param map_param = { .pvms = pvms,
21 .flags = MAP_ANON | MAP_PRIVATE,
22 .type = REGION_TYPE_HEAP,
23 .proct = PROT_READ | PROT_WRITE,
26 struct mm_region* heap;
27 if ((status = mem_map(NULL, &heap, addr, NULL, &map_param))) {
31 heap->region_copied = __heap_copied;
32 mm_index((void**)&pvms->heap, heap);
35 __DEFINE_LXSYSCALL1(void*, sbrk, ssize_t, incr)
37 struct proc_mm* pvms = &__current->mm;
38 struct mm_region* heap = pvms->heap;
41 int err = mem_adjust_inplace(&pvms->regions, heap, heap->end + incr);
43 return (void*)DO_STATUS(err);
45 return (void*)heap->end;
48 __DEFINE_LXSYSCALL1(int, brk, void*, addr)
50 struct proc_mm* pvms = &__current->mm;
51 struct mm_region* heap = pvms->heap;
54 return DO_STATUS(create_heap(pvms, addr));
58 int err = mem_adjust_inplace(&pvms->regions, heap, (ptr_t)addr);
59 return DO_STATUS(err);