Merge branch 'master' into sata-ahci-dev
[lunaix-os.git] / lunaix-os / kernel / mm / vmm.c
index 40e3724d5266a157d878dc5c3e74c08df08e451a..6e134fd0e2ec4da15a1590fe0ccb971cde1a3d8e 100644 (file)
@@ -51,7 +51,9 @@ vmm_set_mapping(uintptr_t mnt,
         }
 
         // This must be writable
-        l1pt->entry[l1_inx] = NEW_L1_ENTRY(attr | PG_WRITE, new_l1pt_pa);
+        l1pt->entry[l1_inx] =
+          NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa);
+
         memset((void*)l2pt, 0, PG_SIZE);
     } else {
         x86_pte_t pte = l2pt->entry[l2_inx];
@@ -126,6 +128,25 @@ vmm_lookup(uintptr_t va, v_mapping* mapping)
     return 0;
 }
 
+void*
+vmm_v2p(void* va)
+{
+    uint32_t l1_index = L1_INDEX(va);
+    uint32_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_mount_pd(uintptr_t mnt, void* pde)
 {