mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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>
master commit: e65436ba36
master date: 2014-10-27 16:43:12 +0100
This commit is contained in:
1 parent
ca351d0987
commit
4e464bb0c3
4 files changed
+17
-1
No files matched your search
@@ -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>
|
||||
@@ -36,11 +37,14 @@ static inline struct vcpu *mapcache_current_vcpu(void)
|
||||
*/
|
||||
if ( unlikely(pagetable_is_null(v->arch.guest_table)) && !is_hvm_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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||