History

x86/nmi/64: Fix a paravirt stack-clobbering bug in the NMI code

The NMI entry code that switches to the normal kernel stack needs to be very careful not to clobber any extra stack slots on the NMI stack. The code is fine under the assumption that SWAPGS is just a normal instruction, but that assumption isn't really true. Use SWAPGS_UNSAFE_STACK instead. This is part of a fix for some random crashes that Sasha saw.

Andy Lutomirski committed 11 years ago

Commit 83c133c1 parent fc57a7c1 file · +4 −1Browse files

Unified · Split

arch/x86/entry/entry_64.S+4−1
@@ -1190,9 +1190,12 @@ ENTRY(nmi) · 1189 unmodified lines
1190 * we don't want to enable interrupts, because then we'll end1190 * we don't want to enable interrupts, because then we'll end
1191 * up in an awkward situation in which IRQs are on but NMIs1191 * up in an awkward situation in which IRQs are on but NMIs
1192 * are off.1192 * are off.
1193 *
1194 * We also must not push anything to the stack before switching
1195 * stacks lest we corrupt the "NMI executing" variable.
1193 */1196 */
1194 1197
1195 SWAPGS1198 SWAPGS_UNSAFE_STACK
1196 cld1199 cld
1197 movq %rsp, %rdx1200 movq %rsp, %rdx
1198 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp1201 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t