X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/09aa85cf875db1e6fd1317cd2b9947b9d3675d6c..75339638bc5f21f13d3475374ecbd91065a427c3:/lunaix-os/kernel/mm/mmap.c?ds=sidebyside diff --git a/lunaix-os/kernel/mm/mmap.c b/lunaix-os/kernel/mm/mmap.c index 3a8677d..383d83e 100644 --- a/lunaix-os/kernel/mm/mmap.c +++ b/lunaix-os/kernel/mm/mmap.c @@ -11,9 +11,8 @@ #define BS_SIZE (KERNEL_MM_BASE - UMMAP_START) int -mem_has_overlap(vm_regions_t* regions, ptr_t start, size_t len) +mem_has_overlap(vm_regions_t* regions, ptr_t start, ptr_t end) { - ptr_t end = start + end - 1; struct mm_region *pos, *n; llist_for_each(pos, n, regions, head) { @@ -33,6 +32,29 @@ mem_has_overlap(vm_regions_t* regions, ptr_t start, size_t len) return 0; } +int +mem_adjust_inplace(vm_regions_t* regions, + struct mm_region* region, + ptr_t newend) +{ + ssize_t len = newend - region->start; + if (len == 0) { + return 0; + } + + if (len < 0) { + return EINVAL; + } + + if (mem_has_overlap(regions, region->start, newend)) { + return ENOMEM; + } + + region->end = newend; + + return 0; +} + int mem_map(void** addr_out, struct mm_region** created, @@ -48,7 +70,7 @@ mem_map(void** addr_out, vm_regions_t* vm_regions = ¶m->pvms->regions; if ((param->flags & MAP_FIXED_NOREPLACE)) { - if (mem_has_overlap(vm_regions, found_loc, param->mlen)) { + if (mem_has_overlap(vm_regions, found_loc, param->mlen + found_loc)) { return EEXIST; } goto found; @@ -117,6 +139,15 @@ found: return 0; } +int +mem_remap(void** addr_out, + struct mm_region** remapped, + void* addr, + struct v_file* file, + struct mmap_param* param) +{ +} + void mem_sync_pages(ptr_t mnt, struct mm_region* region, @@ -266,8 +297,10 @@ __DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst) if (!addr) { addr = UMMAP_START; } else if (addr < UMMAP_START || addr + length >= UMMAP_END) { - errno = ENOMEM; - goto done; + if (!(options & (MAP_FIXED | MAP_FIXED_NOREPLACE))) { + errno = ENOMEM; + goto done; + } } struct v_fd* vfd;