Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 312401
b: refs/heads/master
c: 7fbb98c
h: refs/heads/master
i:
  312399: 754be7f
v: v3
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jun 7, 2012
1 parent f432712 commit 801ab68
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c767a54ba0657e52e6edaa97cbe0b0a8bf1c1655
refs/heads/master: 7fbb98c5cb07563d3ee08714073a8e5452a96be2
20 changes: 20 additions & 0 deletions trunk/arch/x86/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -1758,10 +1758,30 @@ end_repeat_nmi:
*/
call save_paranoid
DEFAULT_FRAME 0

/*
* Save off the CR2 register. If we take a page fault in the NMI then
* it could corrupt the CR2 value. If the NMI preempts a page fault
* handler before it was able to read the CR2 register, and then the
* NMI itself takes a page fault, the page fault that was preempted
* will read the information from the NMI page fault and not the
* origin fault. Save it off and restore it if it changes.
* Use the r12 callee-saved register.
*/
movq %cr2, %r12

/* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */
movq %rsp,%rdi
movq $-1,%rsi
call do_nmi

/* Did the NMI take a page fault? Restore cr2 if it did */
movq %cr2, %rcx
cmpq %rcx, %r12
je 1f
movq %r12, %cr2
1:

testl %ebx,%ebx /* swapgs needed? */
jnz nmi_restore
nmi_swapgs:
Expand Down

0 comments on commit 801ab68

Please sign in to comment.