• Andy Lutomirski's avatar
    x86/entry/64: Add missing irqflags tracing to native_load_gs_index() · ca37e57b
    Andy Lutomirski authored
    Running this code with IRQs enabled (where dummy_lock is a spinlock):
    
    static void check_load_gs_index(void)
    {
    	/* This will fail. */
    	load_gs_index(0xffff);
    
    	spin_lock(&dummy_lock);
    	spin_unlock(&dummy_lock);
    }
    
    Will generate a lockdep warning.  The issue is that the actual write
    to %gs would cause an exception with IRQs disabled, and the exception
    handler would, as an inadvertent side effect, update irqflag tracing
    to reflect the IRQs-off status.  native_load_gs_index() would then
    turn IRQs back on and return with irqflag tracing still thinking that
    IRQs were off.  The dummy lock-and-unlock causes lockdep to notice the
    error and warn.
    
    Fix it by adding the missing tracing.
    
    Apparently nothing did this in a context where it mattered.  I haven't
    tried to find a code path that would actually exhibit the warning if
    appropriately nasty user code were running.
    
    I suspect that the security impact of this bug is very, very low --
    production systems don't run with lockdep enabled, and the warning is
    mostly harmless anyway.
    
    Found during a quick audit of the entry code to try to track down an
    unrelated bug that Ingo found in some still-in-development code.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bpetkov@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/e1aeb0e6ba8dd430ec36c8a35e63b429698b4132.1511411918.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    ca37e57b
entry_64.S 44.1 KB