mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/traps: Adjust paged-guest handling in the PV pagefault path
PV guests necessarily can't be external, as Xen must steal address space from
them. Pagefaults for HVM guests are handled by {vmx,svm}_vmexit_handler() and
don't enter the PV fixup_page_fault() path. Therefore, the first call to
paging_fault() is dead, and dropped.
Logdirty mode is now the only paging mode we should ever find a PV guest with,
so add a new predicate and assertion to this fact.
Drop the final reference to paging_mode_external(). It is more accurately now
only for logdirty guests.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
590a287455
commit
d5c251c22b
2 files changed
+8
-11
No files matched your search
+5
-11
@@ -1799,14 +1799,9 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
|
||||
if ( in_irq() || !(regs->eflags & X86_EFLAGS_IF) )
|
||||
return 0;
|
||||
|
||||
/* Faults from external-mode guests are handled by shadow/hap */
|
||||
if ( paging_mode_external(d) && guest_mode(regs) )
|
||||
{
|
||||
int ret = paging_fault(addr, regs);
|
||||
if ( ret == EXCRET_fault_fixed )
|
||||
trace_trap_two_addr(TRC_PV_PAGING_FIXUP, regs->eip, addr);
|
||||
return ret;
|
||||
}
|
||||
/* Logdirty mode is the only expected paging mode for PV guests. */
|
||||
if ( paging_mode_enabled(d) )
|
||||
ASSERT(paging_mode_only_log_dirty(d));
|
||||
|
||||
if ( !(regs->error_code & PFEC_page_present) &&
|
||||
(pagefault_by_memadd(addr, regs)) )
|
||||
@@ -1838,9 +1833,8 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
|
||||
return EXCRET_fault_fixed;
|
||||
}
|
||||
|
||||
/* For non-external shadowed guests, we fix up both their own
|
||||
* pagefaults and Xen's, since they share the pagetables. */
|
||||
if ( paging_mode_enabled(d) && !paging_mode_external(d) )
|
||||
/* Logdirty guests call back into the paging code to update shadows. */
|
||||
if ( paging_mode_log_dirty(d) )
|
||||
{
|
||||
int ret = paging_fault(addr, regs);
|
||||
if ( ret == EXCRET_fault_fixed )
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
#define paging_mode_translate(_d) (!!((_d)->arch.paging.mode & PG_translate))
|
||||
#define paging_mode_external(_d) (!!((_d)->arch.paging.mode & PG_external))
|
||||
|
||||
#define paging_mode_only_log_dirty(_d) \
|
||||
(((_d)->arch.paging.mode & PG_MASK) == PG_log_dirty)
|
||||
|
||||
/* flags used for paging debug */
|
||||
#define PAGING_DEBUG_LOGDIRTY 0
|
||||
|
||||
|
||||