|
[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 |