Add map virt to phys helper
authorJack Miller <jack@codezen.org>
Sun, 27 Mar 2016 00:27:49 +0000 (19:27 -0500)
committerJack Miller <jack@codezen.org>
Sun, 27 Mar 2016 00:27:49 +0000 (19:27 -0500)
include/map.h
mm/map.c

index 993d8b6..47a3e0c 100644 (file)
@@ -12,5 +12,8 @@ void unmap_pages(u64 virtual, u64 num_pages);
 
 #define map_page(v, p)                 map_pages(v, p, 1)
 #define map_page_nocache(v, p) map_pages_nocache(v, p, 1)
+#define unmap_page(v)                  unmap_pages(v, 1)
+
+u64 map_virt_to_phys(u64 virtual);
 
 void map_page_summarize(u64 virtual);
index 9c3daa6..fd06076 100644 (file)
--- a/mm/map.c
+++ b/mm/map.c
@@ -213,9 +213,27 @@ int map_pages_nocache(u64 virtual, u64 physical, u64 num_pages)
        return ret;
 }
 
-void map_page_summarize(u64 virtual)
+u64 map_virt_to_phys(u64 virtual)
 {
+       u64 *pml4e = (u64 *) PML4E_ADDR(virtual);
+       u64 *pdpe = (u64 *) PDPE_ADDR(virtual);
+       u64 *pde = (u64 *) PDE_ADDR(virtual);
        u64 *pte = (u64 *) PTE_ADDR(virtual);
 
-       printk("M: 0x%lx -> 0x%lx\n", virtual, *pte);
+       if(!(*pml4e & PF_P))
+               return 0;
+       if(!(*pdpe & PF_P))
+               return 0;
+       if(!(*pde & PF_P))
+               return 0;
+       if(!(*pte & PF_P))
+               return 0;
+       return PAGE_ALIGN(*pte);
+}
+
+void map_page_summarize(u64 virtual)
+{
+       u64 phys = map_virt_to_phys(virtual);
+
+       printk("M: 0x%lx -> 0x%lx\n", virtual, phys);
 }