Architectural Support: x86_64 (#37)
[lunaix-os.git] / lunaix-os / kernel / mm / mmap.c
index 10d4f2c701a06bf010768c0825ea6e5c70180c99..972bbee150b80bfdbca41bd41a1489d6852b76f3 100644 (file)
@@ -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,