Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:GA
xen.481
544e6810-x86-tolerate-running-on-EFI-rt-pgts-in...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 544e6810-x86-tolerate-running-on-EFI-rt-pgts-in-map_domain_page.patch of Package xen.481
# Commit e65436ba36be8f1b735573d8fc9af7d8a053ba5f # Date 2014-10-27 16:43:12 +0100 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> 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@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> --- 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_curr */ 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; --- a/xen/arch/x86/efi/runtime.c +++ b/xen/arch/x86/efi/runtime.c @@ -93,6 +93,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; --- 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(); --- 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);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor