feat: msync(2)
[lunaix-os.git] / lunaix-os / kernel / mm / vmm.c
index fe3d65cc46b7ca40ec4eacb232772754dbceba8d..8f67bd2d8237ad53d80a5ddd48f98f4b38e762b1 100644 (file)
@@ -3,6 +3,9 @@
 #include <lunaix/mm/pmm.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/spike.h>
+#include <lunaix/syslog.h>
+
+LOG_MODULE("VMM")
 
 void
 vmm_init()
@@ -54,6 +57,9 @@ vmm_set_mapping(uintptr_t mnt,
         l1pt->entry[l1_inx] =
           NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa);
 
+        // make sure our new l2 table is visible to CPU
+        cpu_invplg(l2pt);
+
         memset((void*)l2pt, 0, PG_SIZE);
     } else {
         x86_pte_t pte = l2pt->entry[l2_inx];
@@ -62,7 +68,7 @@ vmm_set_mapping(uintptr_t mnt,
         }
     }
 
-    if (mnt == PD_REFERENCED) {
+    if (mnt == VMS_SELF) {
         cpu_invplg(va);
     }
 
@@ -79,8 +85,8 @@ vmm_del_mapping(uintptr_t mnt, uintptr_t va)
 {
     assert(((uintptr_t)va & 0xFFFU) == 0);
 
-    uint32_t l1_index = L1_INDEX(va);
-    uint32_t l2_index = L2_INDEX(va);
+    u32_t l1_index = L1_INDEX(va);
+    u32_t l2_index = L2_INDEX(va);
 
     // prevent unmap of recursive mapping region
     if (l1_index == 1023) {
@@ -107,15 +113,21 @@ vmm_del_mapping(uintptr_t mnt, uintptr_t va)
 int
 vmm_lookup(uintptr_t va, v_mapping* mapping)
 {
-    uint32_t l1_index = L1_INDEX(va);
-    uint32_t l2_index = L2_INDEX(va);
+    return vmm_lookupat(VMS_SELF, va, mapping);
+}
 
-    x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR;
+int
+vmm_lookupat(ptr_t mnt, uintptr_t va, v_mapping* mapping)
+{
+    u32_t l1_index = L1_INDEX(va);
+    u32_t l2_index = L2_INDEX(va);
+
+    x86_page_table* l1pt = (x86_page_table*)(mnt | 1023 << 12);
     x86_pte_t l1pte = l1pt->entry[l1_index];
 
     if (l1pte) {
         x86_pte_t* l2pte =
-          &((x86_page_table*)L2_VADDR(l1_index))->entry[l2_index];
+          &((x86_page_table*)(mnt | (l1_index << 12)))->entry[l2_index];
         if (l2pte) {
             mapping->flags = PG_ENTRY_FLAGS(*l2pte);
             mapping->pa = PG_ENTRY_ADDR(*l2pte);
@@ -128,6 +140,44 @@ vmm_lookup(uintptr_t va, v_mapping* mapping)
     return 0;
 }
 
+void*
+vmm_v2p(void* va)
+{
+    u32_t l1_index = L1_INDEX(va);
+    u32_t l2_index = L2_INDEX(va);
+
+    x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR;
+    x86_pte_t l1pte = l1pt->entry[l1_index];
+
+    if (l1pte) {
+        x86_pte_t* l2pte =
+          &((x86_page_table*)L2_VADDR(l1_index))->entry[l2_index];
+        if (l2pte) {
+            return PG_ENTRY_ADDR(*l2pte) | ((uintptr_t)va & 0xfff);
+        }
+    }
+    return 0;
+}
+
+void*
+vmm_v2pat(ptr_t mnt, void* va)
+{
+    u32_t l1_index = L1_INDEX(va);
+    u32_t l2_index = L2_INDEX(va);
+
+    x86_page_table* l1pt = (x86_page_table*)(mnt | 1023 << 12);
+    x86_pte_t l1pte = l1pt->entry[l1_index];
+
+    if (l1pte) {
+        x86_pte_t* l2pte =
+          &((x86_page_table*)(mnt | (l1_index << 12)))->entry[l2_index];
+        if (l2pte) {
+            return PG_ENTRY_ADDR(*l2pte) | ((uintptr_t)va & 0xfff);
+        }
+    }
+    return 0;
+}
+
 void*
 vmm_mount_pd(uintptr_t mnt, void* pde)
 {