• Andy Lutomirski's avatar
    x86/asm/entry/64/compat: Use SYSRETL to return from compat mode SYSENTER · 4214a16b
    Andy Lutomirski authored
    SYSEXIT is scary on 64-bit kernels -- SYSEXIT must be invoked
    with usergs and IRQs on.  That means that we rely on STI to
    correctly mask interrupts for one instruction.  This is okay by
    itself, but the semantics with respect to NMIs are unclear.
    
    Avoid the whole issue by using SYSRETL instead.  For background,
    Intel CPUs don't allow SYSCALL from compat mode, but they do
    allow SYSRETL back to compat mode.  Go figure.
    
    To avoid doing too much at once, this doesn't revamp the calling
    convention.  We still return with EBP, EDX, and ECX on the user
    stack.
    
    Oddly this seems to be 30 cycles or so faster.  Avoiding POPFQ
    and STI will account for under half of that, I think, so my best
    guess is that Intel just optimizes SYSRET much better than
    SYSEXIT.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Denys Vlasenko <vda.linux@googlemail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/57a0bf1b5230b2716a64ebe48e9bc1110f7ab433.1428019097.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    4214a16b
ia32entry.S 16.6 KB