• Andy Lutomirski's avatar
    x86/nmi/64: Reorder nested NMI checks · 4e79de2a
    Andy Lutomirski authored
    commit a27507ca upstream.
    
    Check the repeat_nmi .. end_repeat_nmi special case first.  The
    next patch will rework the RSP check and, as a side effect, the
    RSP check will no longer detect repeat_nmi .. end_repeat_nmi, so
    we'll need this ordering of the checks.
    
    Note: this is more subtle than it appears.  The check for
    repeat_nmi .. end_repeat_nmi jumps straight out of the NMI code
    instead of adjusting the "iret" frame to force a repeat.  This
    is necessary, because the code between repeat_nmi and
    end_repeat_nmi sets "NMI executing" and then writes to the
    "iret" frame itself.  If a nested NMI comes in and modifies the
    "iret" frame while repeat_nmi is also modifying it, we'll end up
    with garbage.  The old code got this right, as does the new
    code, but the new code is a bit more explicit.
    
    If we were to move the check right after the "NMI executing"
    check, then we'd get it wrong and have random crashes.
    
    ( Because the "NMI executing" check would jump to the code that would
      modify the "iret" frame without checking if the interrupted NMI was
      currently modifying it. )
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Reviewed-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Cc: Borislav Petkov <bp@suse.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    [bwh: Backported to 4.0: adjust filename, spacing]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    [ luis: backported to 3.16: Used Ben's backport to 4.0 ]
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    4e79de2a
entry_64.S 45.9 KB