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);
37 __DEFINE_LXSYSCALL1(void*, sbrk, ssize_t, incr)
39 struct proc_mm* pvms = (struct proc_mm*)&__current->mm;
40 struct mm_region* heap = pvms->heap;
43 int err = mem_adjust_inplace(&pvms->regions, heap, heap->end + incr);
45 return (void*)DO_STATUS(err);
47 return (void*)heap->end;
50 __DEFINE_LXSYSCALL1(int, brk, void*, addr)
52 struct proc_mm* pvms = (struct proc_mm*)&__current->mm;
53 struct mm_region* heap = pvms->heap;
56 return DO_STATUS(create_heap(pvms, (ptr_t)addr));
60 int err = mem_adjust_inplace(&pvms->regions, heap, (ptr_t)addr);
61 return DO_STATUS(err);