[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: tolerate running on EFI runtime services page tables in map_domain_page()
commit e65436ba36be8f1b735573d8fc9af7d8a053ba5f Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Oct 27 16:43:12 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Oct 27 16:43:12 2014 +0100 x86: tolerate running on EFI runtime services page tables in map_domain_page() In the event of a #PF while in an EFI runtime service function we otherwise can't dump the page tables, making the analysis of the problem more cumbersome. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/domain_page.c | 6 +++++- xen/arch/x86/efi/stub.c | 6 ++++++ xen/common/efi/runtime.c | 5 +++++ xen/include/xen/efi.h | 1 + 4 files changed, 17 insertions(+), 1 deletions(-) diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c index 3903952..158a164 100644 --- a/xen/arch/x86/domain_page.c +++ b/xen/arch/x86/domain_page.c @@ -7,6 +7,7 @@ */ #include <xen/domain_page.h> +#include <xen/efi.h> #include <xen/mm.h> #include <xen/perfc.h> #include <xen/pfn.h> @@ -37,11 +38,14 @@ static inline struct vcpu *mapcache_current_vcpu(void) */ if ( unlikely(pagetable_is_null(v->arch.guest_table)) && is_pv_vcpu(v) ) { + unsigned long cr3; + /* If we really are idling, perform lazy context switch now. */ if ( (v = idle_vcpu[smp_processor_id()]) == current ) sync_local_execstate(); /* We must now be running on the idle page table. */ - ASSERT(read_cr3() == __pa(idle_pg_table)); + ASSERT((cr3 = read_cr3()) == __pa(idle_pg_table) || + (efi_enabled && cr3 == efi_rs_page_table())); } return v; diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c index 8916a2e..b8f49f8 100644 --- a/xen/arch/x86/efi/stub.c +++ b/xen/arch/x86/efi/stub.c @@ -9,6 +9,12 @@ const bool_t efi_enabled = 0; void __init efi_init_memory(void) { } +paddr_t efi_rs_page_table(void) +{ + BUG(); + return 0; +} + unsigned long efi_get_time(void) { BUG(); diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c index 1c43d10..553ff91 100644 --- a/xen/common/efi/runtime.c +++ b/xen/common/efi/runtime.c @@ -98,6 +98,11 @@ void efi_rs_leave(unsigned long cr3) stts(); } +paddr_t efi_rs_page_table(void) +{ + return virt_to_maddr(efi_l4_pgtable); +} + unsigned long efi_get_time(void) { EFI_TIME time; diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h index 8a2b788..5e02724 100644 --- a/xen/include/xen/efi.h +++ b/xen/include/xen/efi.h @@ -28,6 +28,7 @@ struct xenpf_efi_runtime_call; struct compat_pf_efi_runtime_call; void efi_init_memory(void); +paddr_t efi_rs_page_table(void); unsigned long efi_get_time(void); void efi_halt_system(void); void efi_reset_system(bool_t warm); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |