xen: get rid of paravirt op adjust_exception_frame
Subsystems (4)
Juergen Gross
maintainerPATCH v4 1/1 xen: get rid of paravirt op adjust_exception_frame
When running as Xen pv-guest the exception frame on the stack contains %r11 and %rcx additional to the other data pushed by the processor.
Instead of having a paravirt op being called for each exception type prepend the Xen specific code to each exception entry. When running as Xen pv-guest just use the exception entry with prepended instructions, otherwise use the entry without the Xen specific code.
--- arch/x86/entry/entry_64.S | 23 ++------- arch/x86/entry/entry_64_compat.S | 1 - arch/x86/include/asm/paravirt.h | 5 -- arch/x86/include/asm/paravirt_types.h | 4 -- arch/x86/include/asm/proto.h | 3 ++ arch/x86/include/asm/traps.h | 33 ++++++++++-- arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/paravirt.c | 3 -- arch/x86/xen/enlighten_pv.c | 96 +++++++++++++++++++++++------------ arch/x86/xen/irq.c | 3 -- arch/x86/xen/xen-asm_64.S | 45 ++++++++++++++-- arch/x86/xen/xen-ops.h | 1 - 12 files changed, 140 insertions(+), 78 deletions(-)
arch/x86/entry/entry_64.S +4 -19
@@ -746,7 +746,6 @@ ENTRY(\sym) .endif ASM_CLAC - PARAVIRT_ADJUST_EXCEPTION_FRAME .ifeq \has_error_code pushq $-1 /* ORIG_RAX: no syscall to restart */
@@ -902,7 +901,7 @@ ENTRY(do_softirq_own_stack) END(do_softirq_own_stack) #ifdef CONFIG_XEN -idtentry xen_hypervisor_callback xen_do_hypervisor_callback has_error_code=0 +idtentry hypervisor_callback xen_do_hypervisor_callback has_error_code=0 /* * A note on the "critical region" in our callback handler.
@@ -968,8 +967,6 @@ ENTRY(xen_failsafe_callback) movq 8(%rsp), %r11 addq $0x30, %rsp pushq $0 /* RIP */ - pushq %r11 - pushq %rcx jmp general_protection 1: /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */ movq (%rsp), %rcx
@@ -998,9 +995,8 @@ idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK idtentry stack_segment do_stack_segment has_error_code=1 #ifdef CONFIG_XEN -idtentry xen_debug do_debug has_error_code=0 -idtentry xen_int3 do_int3 has_error_code=0 -idtentry xen_stack_segment do_stack_segment has_error_code=1 +idtentry xendebug do_debug has_error_code=0 +idtentry xenint3 do_int3 has_error_code=0 #endif idtentry general_protection do_general_protection has_error_code=1
@@ -1160,20 +1156,9 @@ ENTRY(error_exit) END(error_exit) /* Runs on exception stack */ +/* XXX: broken on Xen PV */ ENTRY(nmi) /* - * Fix up the exception frame if we're on Xen. - * PARAVIRT_ADJUST_EXCEPTION_FRAME is guaranteed to push at most - * one value to the stack on native, so it may clobber the rdx - * scratch slot, but it won't clobber any of the important - * slots past it. - * - * Xen is a different story, because the Xen frame itself overlaps - * the "NMI executing" variable. - */ - PARAVIRT_ADJUST_EXCEPTION_FRAME - - /* * We allow breakpoints in NMIs. If a breakpoint occurs, then * the iretq it performs will take us out of NMI context. * This means that we can have nested NMIs where the next
arch/x86/entry/entry_64_compat.S +0 -1
@@ -294,7 +294,6 @@ ENTRY(entry_INT80_compat) /* * Interrupts are off on entry. */ - PARAVIRT_ADJUST_EXCEPTION_FRAME ASM_CLAC /* Do this early to minimize exposure */ SWAPGS
arch/x86/include/asm/paravirt.h +0 -5
@@ -960,11 +960,6 @@ extern void default_banner(void);#define GET_CR2_INTO_RAX \ call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2) -#define PARAVIRT_ADJUST_EXCEPTION_FRAME \ - PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_adjust_exception_frame), \ - CLBR_NONE, \ - call PARA_INDIRECT(pv_irq_ops+PV_IRQ_adjust_exception_frame)) -#define USERGS_SYSRET64 \ PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret64), \ CLBR_NONE, \
arch/x86/include/asm/paravirt_types.h +0 -4
@@ -195,10 +195,6 @@ struct pv_irq_ops {void (*safe_halt)(void );void (*halt)(void ); - -#ifdef CONFIG_X86_64 -void (*adjust_exception_frame)(void ); -#endif } __no_randomize_layout;struct pv_mmu_ops {
arch/x86/include/asm/proto.h +3 -0
@@ -24,6 +24,9 @@ void entry_SYSENTER_compat(void);void __end_entry_SYSENTER_compat (void );void entry_SYSCALL_compat (void );void entry_INT80_compat (void ); +#if defined(CONFIG_X86_64 ) && defined(CONFIG_XEN_PV ) +void xen_entry_INT80_compat (void ); +#endif #endif void x86_configure_nx (void );
arch/x86/include/asm/traps.h +30 -3
@@ -13,9 +13,6 @@ asmlinkage void divide_error(void); asmlinkage void debug(void); asmlinkage void nmi(void); asmlinkage void int3(void); -asmlinkage void xen_debug(void); -asmlinkage void xen_int3(void); -asmlinkage void xen_stack_segment(void); asmlinkage void overflow(void); asmlinkage void bounds(void); asmlinkage void invalid_op(void);
@@ -38,6 +35,32 @@ asmlinkage void machine_check(void);#endif /* CONFIG_X86_MCE */ asmlinkage void simd_coprocessor_error(void); +#if defined(CONFIG_X86_64 ) && defined(CONFIG_XEN_PV ) +asmlinkage void xen_divide_error(void); +asmlinkage void xen_xendebug(void); +asmlinkage void xen_xenint3(void); +asmlinkage void xen_nmi(void); +asmlinkage void xen_overflow(void); +asmlinkage void xen_bounds(void); +asmlinkage void xen_invalid_op(void); +asmlinkage void xen_device_not_available(void); +asmlinkage void xen_double_fault(void); +asmlinkage void xen_coprocessor_segment_overrun(void); +asmlinkage void xen_invalid_TSS(void); +asmlinkage void xen_segment_not_present(void); +asmlinkage void xen_stack_segment(void); +asmlinkage void xen_general_protection(void); +asmlinkage void xen_page_fault(void); +asmlinkage void xen_async_page_fault(void); +asmlinkage void xen_spurious_interrupt_bug(void); +asmlinkage void xen_coprocessor_error(void); +asmlinkage void xen_alignment_check(void); +#ifdef CONFIG_X86_MCE +asmlinkage void xen_machine_check(void); +#endif /* CONFIG_X86_MCE */ +asmlinkage void xen_simd_coprocessor_error(void); +#endif +#ifdef CONFIG_TRACING asmlinkage void trace_page_fault(void);#define trace_stack_segment stack_segment
@@ -54,6 +77,10 @@ asmlinkage void trace_page_fault(void);#define trace_alignment_check alignment_check#define trace_simd_coprocessor_error simd_coprocessor_error#define trace_async_page_fault async_page_fault + +#if defined(CONFIG_X86_64 ) && defined(CONFIG_XEN_PV ) +asmlinkage void xen_trace_page_fault(void); +#endif #endif dotraplinkage void do_divide_error(struct pt_regs *, long);
arch/x86/kernel/asm-offsets_64.c +0 -1
@@ -20,7 +20,6 @@ static char syscalls_ia32[] = {int main (void ) {#ifdef CONFIG_PARAVIRT -OFFSET (PV_IRQ_adjust_exception_frame, pv_irq_ops, adjust_exception_frame);OFFSET (PV_CPU_usergs_sysret64, pv_cpu_ops, usergs_sysret64);OFFSET (PV_CPU_swapgs, pv_cpu_ops, swapgs);BLANK ();
arch/x86/kernel/paravirt.c +0 -3
@@ -319,9 +319,6 @@ __visible struct pv_irq_ops pv_irq_ops = { .irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable), .safe_halt = native_safe_halt, .halt = native_halt, -#ifdef CONFIG_X86_64 - .adjust_exception_frame = paravirt_nop, -#endif }; __visible struct pv_cpu_ops pv_cpu_ops = {
arch/x86/xen/enlighten_pv.c +63 -33
109 lines not on this page · raw message
arch/x86/xen/irq.c +0 -3
@@ -123,9 +123,6 @@ static const struct pv_irq_ops xen_irq_ops __initconst = { .safe_halt = xen_safe_halt, .halt = xen_halt, -#ifdef CONFIG_X86_64 - .adjust_exception_frame = xen_adjust_exception_frame, -#endif };void __init xen_init_irq_ops (void )
arch/x86/xen/xen-asm_64.S +40 -5
51 lines not on this page · raw message
arch/x86/xen/xen-ops.h +0 -1
@@ -145,7 +145,6 @@ DECL_ASM(void, xen_restore_fl_direct, unsigned long); __visible void xen_iret(void); __visible void xen_sysret32(void); __visible void xen_sysret64(void); -__visible void xen_adjust_exception_frame(void);extern int xen_panic_handler_init (void );
Signature · 1 line
2.12.3
Quoted 9 lines · Juergen Gross
When running as Xen pv-guest the exception frame on the stack contains %r11 and %rcx additional to the other data pushed by the processor.
Instead of having a paravirt op being called for each exception type prepend the Xen specific code to each exception entry. When running as Xen pv-guest just use the exception entry with prepended instructions, otherwise use the entry without the Xen specific code.
Signed-off-by Juergen Gross <[email protected]>
Quoted 14 lines
--- arch/x86/entry/entry_64.S | 23 ++------- arch/x86/entry/entry_64_compat.S | 1 - arch/x86/include/asm/paravirt.h | 5 -- arch/x86/include/asm/paravirt_types.h | 4 -- arch/x86/include/asm/proto.h | 3 ++ arch/x86/include/asm/traps.h | 33 ++++++++++-- arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/paravirt.c | 3 -- arch/x86/xen/enlighten_pv.c | 96 +++++++++++++++++++++++------------ arch/x86/xen/irq.c | 3 -- arch/x86/xen/xen-asm_64.S | 45 ++++++++++++++-- arch/x86/xen/xen-ops.h | 1 - 12 files changed, 140 insertions(+), 78 deletions(-)
Thanks,
Ingo
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel
Quoted 9 lines · Juergen Gross
When running as Xen pv-guest the exception frame on the stack contains %r11 and %rcx additional to the other data pushed by the processor.
Instead of having a paravirt op being called for each exception type prepend the Xen specific code to each exception entry. When running as Xen pv-guest just use the exception entry with prepended instructions, otherwise use the entry without the Xen specific code.
Signed-off-by Juergen Gross <[email protected]>
Quoted 14 lines
--- arch/x86/entry/entry_64.S | 23 ++------- arch/x86/entry/entry_64_compat.S | 1 - arch/x86/include/asm/paravirt.h | 5 -- arch/x86/include/asm/paravirt_types.h | 4 -- arch/x86/include/asm/proto.h | 3 ++ arch/x86/include/asm/traps.h | 33 ++++++++++-- arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/paravirt.c | 3 -- arch/x86/xen/enlighten_pv.c | 96 +++++++++++++++++++++++------------ arch/x86/xen/irq.c | 3 -- arch/x86/xen/xen-asm_64.S | 45 ++++++++++++++-- arch/x86/xen/xen-ops.h | 1 - 12 files changed, 140 insertions(+), 78 deletions(-)
Thanks,
Ingo
Quoted 9 lines · Juergen Gross
When running as Xen pv-guest the exception frame on the stack contains %r11 and %rcx additional to the other data pushed by the processor.
Instead of having a paravirt op being called for each exception type prepend the Xen specific code to each exception entry. When running as Xen pv-guest just use the exception entry with prepended instructions, otherwise use the entry without the Xen specific code.
Signed-off-by Juergen Gross <[email protected]>
Quoted 14 lines
--- arch/x86/entry/entry_64.S | 23 ++------- arch/x86/entry/entry_64_compat.S | 1 - arch/x86/include/asm/paravirt.h | 5 -- arch/x86/include/asm/paravirt_types.h | 4 -- arch/x86/include/asm/proto.h | 3 ++ arch/x86/include/asm/traps.h | 33 ++++++++++-- arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/paravirt.c | 3 -- arch/x86/xen/enlighten_pv.c | 96 +++++++++++++++++++++++------------ arch/x86/xen/irq.c | 3 -- arch/x86/xen/xen-asm_64.S | 45 ++++++++++++++-- arch/x86/xen/xen-ops.h | 1 - 12 files changed, 140 insertions(+), 78 deletions(-)
Applied to for-linus-4.14.
-boris
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel
Quoted 9 lines · Juergen Gross
When running as Xen pv-guest the exception frame on the stack contains %r11 and %rcx additional to the other data pushed by the processor.
Instead of having a paravirt op being called for each exception type prepend the Xen specific code to each exception entry. When running as Xen pv-guest just use the exception entry with prepended instructions, otherwise use the entry without the Xen specific code.
Signed-off-by Juergen Gross <[email protected]>
Quoted 14 lines
--- arch/x86/entry/entry_64.S | 23 ++------- arch/x86/entry/entry_64_compat.S | 1 - arch/x86/include/asm/paravirt.h | 5 -- arch/x86/include/asm/paravirt_types.h | 4 -- arch/x86/include/asm/proto.h | 3 ++ arch/x86/include/asm/traps.h | 33 ++++++++++-- arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/paravirt.c | 3 -- arch/x86/xen/enlighten_pv.c | 96 +++++++++++++++++++++++------------ arch/x86/xen/irq.c | 3 -- arch/x86/xen/xen-asm_64.S | 45 ++++++++++++++-- arch/x86/xen/xen-ops.h | 1 - 12 files changed, 140 insertions(+), 78 deletions(-)
Applied to for-linus-4.14.
-boris