diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-10-07 09:24:24 (GMT) |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-10-07 09:24:24 (GMT) |
commit | 25a9a924c0c8723ced99179eb639e8c5372a2557 (patch) | |
tree | 83170168d50b9703486327b5b3a0bfb1d8da9b2b /arch/x86/entry | |
parent | 0b101e62afe626ecae60173f92f1e0ec72151653 (diff) | |
parent | a0eeb8dd34f21fddfe85b37832b5f3d02ee6e34b (diff) | |
download | linux-25a9a924c0c8723ced99179eb639e8c5372a2557.tar.xz |
Merge branch 'linus' into x86/asm, to pick up fixes before applying new changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/entry')
-rw-r--r-- | arch/x86/entry/entry_64.S | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index d303318..055a01d 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -1128,7 +1128,18 @@ END(error_exit) /* Runs on exception stack */ ENTRY(nmi) + /* + * Fix up the exception frame if we're on Xen. + * PARAVIRT_ADJUST_EXCEPTION_FRAME is guaranteed to push at most + * one value to the stack on native, so it may clobber the rdx + * scratch slot, but it won't clobber any of the important + * slots past it. + * + * Xen is a different story, because the Xen frame itself overlaps + * the "NMI executing" variable. + */ PARAVIRT_ADJUST_EXCEPTION_FRAME + /* * We allow breakpoints in NMIs. If a breakpoint occurs, then * the iretq it performs will take us out of NMI context. @@ -1179,9 +1190,12 @@ ENTRY(nmi) * we don't want to enable interrupts, because then we'll end * up in an awkward situation in which IRQs are on but NMIs * are off. + * + * We also must not push anything to the stack before switching + * stacks lest we corrupt the "NMI executing" variable. */ - SWAPGS + SWAPGS_UNSAFE_STACK cld movq %rsp, %rdx movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp |