X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c166bd62fbb907f95f79f621e2a2fb4fdde08e01..34f6af4f61e0eec9c96113e07f140b609b4113c8:/lunaix-os/kernel/mm/mmap.c diff --git a/lunaix-os/kernel/mm/mmap.c b/lunaix-os/kernel/mm/mmap.c index 10d4f2c..493d26c 100644 --- a/lunaix-os/kernel/mm/mmap.c +++ b/lunaix-os/kernel/mm/mmap.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include @@ -232,6 +232,7 @@ found: ((param->proct | param->flags) & 0x3f) | (param->type & ~0xffff)); region->mfile = file; + region->flen = param->flen; region->foff = param->offset; region->proc_vms = param->pvms; @@ -459,9 +460,14 @@ mem_unmap(ptr_t mnt, vm_regions_t* regions, ptr_t addr, size_t length) } } - while (&pos->head != regions && length) { + size_t remaining = length; + while (&pos->head != regions && remaining) { n = container_of(pos->head.next, typeof(*pos), head); - __unmap_overlapped_cases(mnt, pos, &cur_addr, &length); + if (pos->start > cur_addr + length) { + break; + } + + __unmap_overlapped_cases(mnt, pos, &cur_addr, &remaining); pos = n; } @@ -469,16 +475,24 @@ mem_unmap(ptr_t mnt, vm_regions_t* regions, ptr_t addr, size_t length) return 0; } -__DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst) +__DEFINE_LXSYSCALL1(void*, sys_mmap, struct usr_mmap_param*, mparam) { - int proct = va_arg(lst, int); - int fd = va_arg(lst, u32_t); - off_t offset = va_arg(lst, off_t); - int options = va_arg(lst, int); - int errno = 0; - void* result = (void*)-1; - - ptr_t addr_ptr = (ptr_t)addr; + off_t offset; + size_t length; + int proct, fd, options; + int errno; + void* result; + ptr_t addr_ptr; + + proct = mparam->proct; + fd = mparam->fd; + offset = mparam->offset; + options = mparam->flags; + addr_ptr = __ptr(mparam->addr); + length = mparam->length; + + errno = 0; + result = (void*)-1; if (!length || length > BS_SIZE || va_offset(addr_ptr)) { errno = EINVAL; @@ -509,8 +523,10 @@ __DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst) } } + length = ROUNDUP(length, PAGE_SIZE); struct mmap_param param = { .flags = options, - .mlen = ROUNDUP(length, PAGE_SIZE), + .mlen = length, + .flen = length, .offset = offset, .type = REGION_TYPE_GENERAL, .proct = proct,