From: Andrew Cooper Date: Thu, 15 Mar 2018 16:15:45 +0000 (+0000) Subject: xen/x86: Implement enable_nmis() in C X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7e9b3599f5daa585ded5be84c8d4767d0f0bc2da;p=people%2Fdariof%2Fxen.git 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 Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index f4e1b805fb..f6ba31c4e2 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 01bc89f46c..db9988ab33 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -498,7 +498,23 @@ 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, %[tmp] \n\t" + "push %[ss] \n\t" + "push %[tmp] \n\t" + "pushf \n\t" + "push %[cs] \n\t" + "lea 1f(%%rip), %[tmp] \n\t" + "push %[tmp] \n\t" + "iretq; 1: \n\t" + : [tmp] "=&r" (tmp) + : [ss] "i" (__HYPERVISOR_DS), + [cs] "i" (__HYPERVISOR_CS) ); +} void sysenter_entry(void); void sysenter_eflags_saved(void);