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@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
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
#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);