x86/EFI: keep EFI runtime services top level page tables up-to-date
authorJan Beulich <jbeulich@suse.com>
Tue, 19 May 2015 09:35:30 +0000 (11:35 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 19 May 2015 09:39:09 +0000 (11:39 +0200)
Updates to idle_pg_table[] need to be mirrored into the page tables
used for invoking EFI runtime services.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/efi/runtime.h
xen/arch/x86/efi/stub.c
xen/arch/x86/mm.c
xen/include/asm-x86/page.h

index 0eb2fb93fe2284c1319f965e32681d9161e46f04..d9eb8f5c270f62426ea6d57270dfafffd4872775 100644 (file)
@@ -1,5 +1,12 @@
+#include <asm/atomic.h>
 #include <asm/mc146818rtc.h>
 
 #ifndef COMPAT
 l4_pgentry_t *__read_mostly efi_l4_pgtable;
+
+void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e)
+{
+    if ( efi_l4_pgtable )
+        l4e_write(efi_l4_pgtable + l4idx, l4e);
+}
 #endif
index b8f49f873de960010e109d863ca0b382689af2dd..627009f43069dc7924329062d9289a5e02281223 100644 (file)
@@ -2,6 +2,7 @@
 #include <xen/errno.h>
 #include <xen/init.h>
 #include <xen/lib.h>
+#include <asm/page.h>
 
 #ifndef efi_enabled
 const bool_t efi_enabled = 0;
@@ -9,6 +10,8 @@ const bool_t efi_enabled = 0;
 
 void __init efi_init_memory(void) { }
 
+void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { }
+
 paddr_t efi_rs_page_table(void)
 {
     BUG();
index 034de227930e8718bee7c60d8f967191125ad911..5fe08dff2a9088d06bd3ca06dc2dedf69a2a45fb 100644 (file)
@@ -5311,7 +5311,10 @@ static l3_pgentry_t *virt_to_xen_l3e(unsigned long v)
             spin_lock(&map_pgdir_lock);
         if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) )
         {
-            l4e_write(pl4e, l4e_from_paddr(__pa(pl3e), __PAGE_HYPERVISOR));
+            l4_pgentry_t l4e = l4e_from_paddr(__pa(pl3e), __PAGE_HYPERVISOR);
+
+            l4e_write(pl4e, l4e);
+            efi_update_l4_pgtable(l4_table_offset(v), l4e);
             pl3e = NULL;
         }
         if ( locking )
index 8977a76cc6268e17b13979dde0a150b804cbaef4..27c2ae7226120df35e4d5baa6e69c3e8678367d7 100644 (file)
@@ -288,6 +288,7 @@ extern l2_pgentry_t l2_identmap[4*L2_PAGETABLE_ENTRIES];
 extern l1_pgentry_t l1_identmap[L1_PAGETABLE_ENTRIES],
     l1_fixmap[L1_PAGETABLE_ENTRIES];
 void paging_init(void);
+void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t);
 #endif /* !defined(__ASSEMBLY__) */
 
 #define _PAGE_NONE     _AC(0x000,U)