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:
Andrew Cooper committed 2016-12-13 17:23:42 +00:00
1 parent 590a287455
commit d5c251c22b
2 files changed
+8 -11

No files matched your search

+5 -11
View File
@@ -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 )
+3
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.