FRED provides %cr2 in the the stack frame, avoiding the need to read %cr2
manually.
Rename do_page_fault() to handle_PF(), and update it to take cr2, still named
addr for consistency.
Introduce a new handle_PF_IDT() which reads %cr2 and conditionally re-enables
interrupts.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
v2:
* New
---
xen/arch/x86/traps.c | 26 ++++++++++++++------------
xen/arch/x86/x86_64/entry.S | 2 +-
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 3fd0f5709a52..d42973660db0 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1670,21 +1670,10 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
return 0;
}
-void asmlinkage do_page_fault(struct cpu_user_regs *regs)
+static void handle_PF(struct cpu_user_regs *regs, unsigned long addr /* cr2 */)
{
- unsigned long addr;
unsigned int error_code;
- addr = read_cr2();
-
- /*
- * Don't re-enable interrupts if we were running an IRQ-off region when
- * we hit the page fault, or we'll break that code.
- */
- ASSERT(!local_irq_is_enabled());
- if ( regs->flags & X86_EFLAGS_IF )
- local_irq_enable();
-
/* fixup_page_fault() might change regs->error_code, so cache it here. */
error_code = regs->error_code;
@@ -1745,6 +1734,19 @@ void asmlinkage do_page_fault(struct cpu_user_regs *regs)
pv_inject_page_fault(regs->error_code, addr);
}
+/*
+ * When using IDT delivery, it is our responsibility to read %cr2.
+ */
+void asmlinkage handle_PF_IDT(struct cpu_user_regs *regs)
+{
+ unsigned long addr = read_cr2();
+
+ if ( regs->flags & X86_EFLAGS_IF )
+ local_irq_enable();
+
+ handle_PF(regs, addr);
+}
+
/*
* Early #PF handler to print CR2, error code, and stack.
*
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index 789687488c5f..c02245ac064c 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -871,7 +871,7 @@ handle_exception_saved:
* reading %cr2. Otherwise a page fault in the nested interrupt handler
* would corrupt %cr2.
*/
- DISPATCH(X86_EXC_PF, do_page_fault)
+ DISPATCH(X86_EXC_PF, handle_PF_IDT)
/* Only re-enable IRQs if they were active before taking the fault */
testb $X86_EFLAGS_IF >> 8, UREGS_eflags + 1(%rsp)
--
2.39.5