[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.