x86: Don't clobber top of pt_regs in nested NMI
authorSalman Qazi <sqazi@google.com>
Tue, 2 Oct 2012 00:29:25 +0000 (17:29 -0700)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 2 Nov 2012 15:29:36 +0000 (11:29 -0400)
commit28696f434fef0efa97534b59986ad33b9c4df7f8
tree2b91ecd62ee6c82d727584b2753fa09c4094b1c6
parent269833bd5a0f4443873da358b71675a890b47c3c
x86: Don't clobber top of pt_regs in nested NMI

The nested NMI modifies the place (instruction, flags and stack)
that the first NMI will iret to.  However, the copy of registers
modified is exactly the one that is the part of pt_regs in
the first NMI.  This can change the behaviour of the first NMI.

In particular, Google's arch_trigger_all_cpu_backtrace handler
also prints regions of memory surrounding addresses appearing in
registers.  This results in handled exceptions, after which nested NMIs
start coming in.  These nested NMIs change the value of registers
in pt_regs.  This can cause the original NMI handler to produce
incorrect output.

We solve this problem by interchanging the position of the preserved
copy of the iret registers ("saved") and the copy subject to being
trampled by nested NMI ("copied").

Link: http://lkml.kernel.org/r/20121002002919.27236.14388.stgit@dungbeetle.mtv.corp.google.com
Signed-off-by: Salman Qazi <sqazi@google.com>
[ Added a needed CFI_ADJUST_CFA_OFFSET ]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
arch/x86/kernel/entry_64.S
This page took 0.026238 seconds and 5 git commands to generate.