mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
6227a40f67
commit
7e9b3599f5
2 files changed
+17
-17
No files matched your search
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||