• Steven Rostedt's avatar
    x86: Allow NMIs to hit breakpoints in i386 · ccd49c23
    Steven Rostedt authored
    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: default avatarSteven Rostedt <rostedt@goodmis.org>
    ccd49c23
nmi.c 13.9 KB