summaryrefslogtreecommitdiff
path: root/arch/x86/include/asm/debugreg.h
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-12-13 21:44:16 (GMT)
committerSteven Rostedt <rostedt@goodmis.org>2011-12-21 20:38:55 (GMT)
commitccd49c2391773ffbf52bb80d75c4a92b16972517 (patch)
tree42137704944da98524e33eff1d1ec1cd9af48d3c /arch/x86/include/asm/debugreg.h
parent228bdaa95fb830e08b6acd1afd4d2c55093cabfa (diff)
downloadlinux-fsl-qoriq-ccd49c2391773ffbf52bb80d75c4a92b16972517.tar.xz
x86: Allow NMIs to hit breakpoints in i386
With i386, NMIs and breakpoints use the current stack and they do not reset the stack pointer to a fix point that might corrupt a previous NMI or breakpoint (as it does in x86_64). But NMIs are still not made to be re-entrant, and need to prevent the case that an NMI hitting a breakpoint (which does an iret), doesn't allow another NMI to run. The fix is to let the NMI be in 3 different states: 1) not running 2) executing 3) latched When no NMI is executing on a given CPU, the state is "not running". When the first NMI comes in, the state is switched to "executing". On exit of that NMI, a cmpxchg is performed to switch the state back to "not running" and if that fails, the NMI is restarted. If a breakpoint is hit and does an iret, which re-enables NMIs, and another NMI comes in before the first NMI finished, it will detect that the state is not in the "not running" state and the current NMI is nested. In this case, the state is switched to "latched" to let the interrupted NMI know to restart the NMI handler, and the nested NMI exits without doing anything. Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: H. Peter Anvin <hpa@linux.intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Paul Turner <pjt@google.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'arch/x86/include/asm/debugreg.h')
0 files changed, 0 insertions, 0 deletions