add lunaix dynamic linker as submodule
[lunaix-os.git] / lunaix-os / kernel / mm / mmap.c
index f700fd533179d9528ff84191e6f14402d0f5eca2..8a4c9bc6af509a653477f61833b389b2ce9e549d 100644 (file)
@@ -7,8 +7,10 @@
 #include <lunaix/syscall.h>
 #include <lunaix/syscall_utils.h>
 
 #include <lunaix/syscall.h>
 #include <lunaix/syscall_utils.h>
 
+#include <sys/mm/mempart.h>
+
 // any size beyond this is bullshit
 // any size beyond this is bullshit
-#define BS_SIZE (KERNEL_MM_BASE - UMMAP_START)
+#define BS_SIZE (KERNEL_EXEC - UMMAP_START)
 
 int
 mem_has_overlap(vm_regions_t* regions, ptr_t start, ptr_t end)
 
 int
 mem_has_overlap(vm_regions_t* regions, ptr_t start, ptr_t end)
@@ -58,13 +60,13 @@ mem_adjust_inplace(vm_regions_t* regions,
 int
 mem_map(void** addr_out,
         struct mm_region** created,
 int
 mem_map(void** addr_out,
         struct mm_region** created,
-        void* addr,
+        ptr_t addr,
         struct v_file* file,
         struct mmap_param* param)
 {
     assert_msg(addr, "addr can not be NULL");
 
         struct v_file* file,
         struct mmap_param* param)
 {
     assert_msg(addr, "addr can not be NULL");
 
-    ptr_t last_end = USER_START, found_loc = (ptr_t)addr;
+    ptr_t last_end = USER_START, found_loc = addr;
     struct mm_region *pos, *n;
 
     vm_regions_t* vm_regions = &param->pvms->regions;
     struct mm_region *pos, *n;
 
     vm_regions_t* vm_regions = &param->pvms->regions;
@@ -101,7 +103,7 @@ mem_map(void** addr_out,
     return ENOMEM;
 
 found:
     return ENOMEM;
 
 found:
-    if (found_loc >= KERNEL_MM_BASE || found_loc < USER_START) {
+    if (found_loc >= KERNEL_EXEC || found_loc < USER_START) {
         return ENOMEM;
     }
 
         return ENOMEM;
     }
 
@@ -131,7 +133,7 @@ found:
     }
 
     if (addr_out) {
     }
 
     if (addr_out) {
-        *addr_out = found_loc;
+        *addr_out = (void*)found_loc;
     }
     if (created) {
         *created = region;
     }
     if (created) {
         *created = region;
@@ -139,6 +141,18 @@ found:
     return 0;
 }
 
     return 0;
 }
 
+int
+mem_remap(void** addr_out,
+          struct mm_region** remapped,
+          void* addr,
+          struct v_file* file,
+          struct mmap_param* param)
+{
+    // TODO
+
+    return EINVAL;
+}
+
 void
 mem_sync_pages(ptr_t mnt,
                struct mm_region* region,
 void
 mem_sync_pages(ptr_t mnt,
                struct mm_region* region,
@@ -159,9 +173,13 @@ mem_sync_pages(ptr_t mnt,
         if (PG_IS_DIRTY(*mapping.pte)) {
             size_t offset = mapping.va - region->start + region->foff;
             struct v_inode* inode = region->mfile->inode;
         if (PG_IS_DIRTY(*mapping.pte)) {
             size_t offset = mapping.va - region->start + region->foff;
             struct v_inode* inode = region->mfile->inode;
-            region->mfile->ops->write_page(inode, mapping.va, PG_SIZE, offset);
+
+            region->mfile->ops->write_page(
+              inode, (void*)mapping.va, PG_SIZE, offset);
+
             *mapping.pte &= ~PG_DIRTY;
             *mapping.pte &= ~PG_DIRTY;
-            cpu_invplg(mapping.pte);
+
+            cpu_flush_page((ptr_t)mapping.pte);
         } else if ((options & MS_INVALIDATE)) {
             goto invalidate;
         }
         } else if ((options & MS_INVALIDATE)) {
             goto invalidate;
         }
@@ -175,7 +193,7 @@ mem_sync_pages(ptr_t mnt,
     invalidate:
         *mapping.pte &= ~PG_PRESENT;
         pmm_free_page(KERNEL_PID, mapping.pa);
     invalidate:
         *mapping.pte &= ~PG_PRESENT;
         pmm_free_page(KERNEL_PID, mapping.pa);
-        cpu_invplg(mapping.pte);
+        cpu_flush_page((ptr_t)mapping.pte);
     }
 }
 
     }
 }
 
@@ -222,7 +240,7 @@ mem_unmap_region(ptr_t mnt, struct mm_region* region)
 }
 
 int
 }
 
 int
-mem_unmap(ptr_t mnt, vm_regions_t* regions, void* addr, size_t length)
+mem_unmap(ptr_t mnt, vm_regions_t* regions, ptr_t addr, size_t length)
 {
     length = ROUNDUP(length, PG_SIZE);
     ptr_t cur_addr = PG_ALIGN(addr);
 {
     length = ROUNDUP(length, PG_SIZE);
     ptr_t cur_addr = PG_ALIGN(addr);
@@ -280,52 +298,57 @@ __DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst)
     int errno = 0;
     void* result = (void*)-1;
 
     int errno = 0;
     void* result = (void*)-1;
 
-    if (!length || length > BS_SIZE || !PG_ALIGNED(addr)) {
-        errno = EINVAL;
-        goto done;
-    }
+    ptr_t addr_ptr = (ptr_t)addr;
 
 
-    if (!addr) {
-        addr = UMMAP_START;
-    } else if (addr < UMMAP_START || addr + length >= UMMAP_END) {
-        errno = ENOMEM;
+    if (!length || length > BS_SIZE || !PG_ALIGNED(addr_ptr)) {
+        errno = EINVAL;
         goto done;
     }
 
         goto done;
     }
 
-    struct v_fd* vfd;
-    if ((errno = vfs_getfd(fd, &vfd))) {
-        goto done;
+    if (!addr_ptr) {
+        addr_ptr = UMMAP_START;
+    } else if (addr_ptr < UMMAP_START || addr_ptr + length >= UMMAP_END) {
+        if (!(options & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
+            errno = ENOMEM;
+            goto done;
+        }
     }
 
     }
 
-    struct v_file* file = vfd->file;
+    struct v_file* file = NULL;
 
     if (!(options & MAP_ANON)) {
 
     if (!(options & MAP_ANON)) {
+        struct v_fd* vfd;
+        if ((errno = vfs_getfd(fd, &vfd))) {
+            goto done;
+        }
+
+        file = vfd->file;
         if (!file->ops->read_page) {
             errno = ENODEV;
             goto done;
         }
         if (!file->ops->read_page) {
             errno = ENODEV;
             goto done;
         }
-    } else {
-        file = NULL;
     }
 
     struct mmap_param param = { .flags = options,
                                 .mlen = ROUNDUP(length, PG_SIZE),
     }
 
     struct mmap_param param = { .flags = options,
                                 .mlen = ROUNDUP(length, PG_SIZE),
+                                .flen = length,
                                 .offset = offset,
                                 .type = REGION_TYPE_GENERAL,
                                 .proct = proct,
                                 .offset = offset,
                                 .type = REGION_TYPE_GENERAL,
                                 .proct = proct,
-                                .pvms = &__current->mm,
+                                .pvms = (struct proc_mm*)&__current->mm,
                                 .vms_mnt = VMS_SELF };
 
                                 .vms_mnt = VMS_SELF };
 
-    errno = mem_map(&result, NULL, addr, file, &param);
+    errno = mem_map(&result, NULL, addr_ptr, file, &param);
 
 done:
     __current->k_status = errno;
     return result;
 }
 
 
 done:
     __current->k_status = errno;
     return result;
 }
 
-__DEFINE_LXSYSCALL2(void, munmap, void*, addr, size_t, length)
+__DEFINE_LXSYSCALL2(int, munmap, void*, addr, size_t, length)
 {
 {
-    return mem_unmap(VMS_SELF, &__current->mm.regions, addr, length);
+    return mem_unmap(
+      VMS_SELF, (vm_regions_t*)&__current->mm.regions, (ptr_t)addr, length);
 }
 
 __DEFINE_LXSYSCALL3(int, msync, void*, addr, size_t, length, int, flags)
 }
 
 __DEFINE_LXSYSCALL3(int, msync, void*, addr, size_t, length, int, flags)
@@ -334,8 +357,11 @@ __DEFINE_LXSYSCALL3(int, msync, void*, addr, size_t, length, int, flags)
         return DO_STATUS(EINVAL);
     }
 
         return DO_STATUS(EINVAL);
     }
 
-    int status =
-      mem_msync(VMS_SELF, &__current->mm.regions, addr, length, flags);
+    int status = mem_msync(VMS_SELF,
+                           (vm_regions_t*)&__current->mm.regions,
+                           (ptr_t)addr,
+                           length,
+                           flags);
 
     return DO_STATUS(status);
 }
\ No newline at end of file
 
     return DO_STATUS(status);
 }
\ No newline at end of file