]> xenbits.xensource.com Git - people/liuw/xen.git/commitdiff
x86_64/mm: properly map and unmap page tables in m2p_mapped
authorWei Liu <wei.liu2@citrix.com>
Tue, 5 Feb 2019 12:56:41 +0000 (12:56 +0000)
committerWei Liu <wei.liu2@citrix.com>
Tue, 5 Feb 2019 17:30:03 +0000 (17:30 +0000)
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
xen/arch/x86/x86_64/mm.c

index 800e6f62ccf0a8bce8300f64b1ba2108d1db2f27..df9cf2d0e05e700d738f2330fdb10cf2b74d84d2 100644 (file)
@@ -130,28 +130,36 @@ static int m2p_mapped(unsigned long spfn)
 {
     unsigned long va;
     l3_pgentry_t *l3_ro_mpt;
-    l2_pgentry_t *l2_ro_mpt;
+    l2_pgentry_t *l2_ro_mpt = NULL;
+    int rc = M2P_NO_MAPPED;
 
     va = RO_MPT_VIRT_START + spfn * sizeof(*machine_to_phys_mapping);
-    l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(va)]);
+    l3_ro_mpt = map_xen_pagetable_new(
+        l4e_get_mfn(idle_pg_table[l4_table_offset(va)]));
 
     switch ( l3e_get_flags(l3_ro_mpt[l3_table_offset(va)]) &
              (_PAGE_PRESENT |_PAGE_PSE))
     {
         case _PAGE_PSE|_PAGE_PRESENT:
-            return M2P_1G_MAPPED;
+            rc = M2P_1G_MAPPED;
+            goto out;
         /* Check for next level */
         case _PAGE_PRESENT:
             break;
         default:
-            return M2P_NO_MAPPED;
+            rc = M2P_NO_MAPPED;
+            goto out;
     }
-    l2_ro_mpt = l3e_to_l2e(l3_ro_mpt[l3_table_offset(va)]);
+    l2_ro_mpt = map_xen_pagetable_new(
+        l3e_get_mfn(l3_ro_mpt[l3_table_offset(va)]));
 
     if (l2e_get_flags(l2_ro_mpt[l2_table_offset(va)]) & _PAGE_PRESENT)
-        return M2P_2M_MAPPED;
+        rc = M2P_2M_MAPPED;
 
-    return M2P_NO_MAPPED;
+ out:
+    unmap_xen_pagetable_new(l2_ro_mpt);
+    unmap_xen_pagetable_new(l3_ro_mpt);
+    return rc;
 }
 
 static int share_hotadd_m2p_table(struct mem_hotadd_info *info)