From db83975f0fcd30370392ed288a7bd2420624ed4e Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 19 May 2015 11:35:30 +0200 Subject: [PATCH] x86/EFI: keep EFI runtime services top level page tables up-to-date Updates to idle_pg_table[] need to be mirrored into the page tables used for invoking EFI runtime services. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/efi/runtime.h | 7 +++++++ xen/arch/x86/efi/stub.c | 3 +++ xen/arch/x86/mm.c | 5 ++++- xen/include/asm-x86/page.h | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/efi/runtime.h b/xen/arch/x86/efi/runtime.h index 0eb2fb93fe..d9eb8f5c27 100644 --- a/xen/arch/x86/efi/runtime.h +++ b/xen/arch/x86/efi/runtime.h @@ -1,5 +1,12 @@ +#include #include #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 diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c index b8f49f873d..627009f430 100644 --- a/xen/arch/x86/efi/stub.c +++ b/xen/arch/x86/efi/stub.c @@ -2,6 +2,7 @@ #include #include #include +#include #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(); diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 034de22793..5fe08dff2a 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -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 ) diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index 8977a76cc6..27c2ae7226 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -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) -- 2.30.2