[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen/x86: Implement enable_nmis() in C
I don't recall why I chose to implement this in assembly to begin with, but it can happily live in a static inline instead, and only has two callers. Doing so reduces the quantity of code in .text.entry. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- Looking at the disassembly, this change causes machine_kexec to avoid spilling any registers onto the stack. This patch is intended as to simplify "x86/XPTI: reduce .text.entry" by not having enable_nmis to worry about at all. --- xen/arch/x86/x86_64/entry.S | 16 ---------------- xen/include/asm-x86/processor.h | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index f4e1b80..f6ba31c 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -854,22 +854,6 @@ ENTRY(machine_check) movl $TRAP_machine_check,4(%rsp) jmp handle_ist_exception -/* Enable NMIs. No special register assumptions. Only %rax is not preserved. */ -ENTRY(enable_nmis) - movq %rsp, %rax /* Grab RSP before pushing */ - - /* Set up stack frame */ - pushq $0 /* SS */ - pushq %rax /* RSP */ - pushfq /* RFLAGS */ - pushq $__HYPERVISOR_CS /* CS */ - leaq 1f(%rip),%rax - pushq %rax /* RIP */ - - iretq /* Disable the hardware NMI latch */ -1: - retq - /* No op trap handler. Required for kexec crash path. */ GLOBAL(trap_nop) iretq diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index 01bc89f..2cfd2c3 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -498,7 +498,22 @@ DECLARE_TRAP_HANDLER(entry_int82); #undef DECLARE_TRAP_HANDLER void trap_nop(void); -void enable_nmis(void); + +static inline void enable_nmis(void) +{ + unsigned long tmp; + + asm volatile ( "mov %%rsp, %[sp] \n\t" + "push %[ss] \n\t" + "push %[sp] \n\t" + "pushf \n\t" + "push %[cs] \n\t" + "lea 1f(%%rip), %[ip] \n\t" + "push %[ip] \n\t" + "iretq; 1: \n\t" + : [sp] "=r" (tmp), [ip] "=r" (tmp) + : [ss] "i" (__HYPERVISOR_DS), [cs] "i" (__HYPERVISOR_CS) ); +} void sysenter_entry(void); void sysenter_eflags_saved(void); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |