linux/arch/x86/ia32
Andy Lutomirski 4214a16b02 x86/asm/entry/64/compat: Use SYSRETL to return from compat mode SYSENTER
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: Andy 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.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2015-04-03 09:14:00 +02:00
..
audit.c x86: hook up execveat system call 2014-12-13 12:42:51 -08:00
ia32_aout.c assorted conversions to %p[dD] 2014-11-19 13:01:20 -05:00
ia32_signal.c x86/asm/entry: Fix execve() and sigreturn() syscalls to always return via IRET 2015-03-23 08:52:46 +01:00
ia32entry.S x86/asm/entry/64/compat: Use SYSRETL to return from compat mode SYSENTER 2015-04-03 09:14:00 +02:00
Makefile x86/compat: Merge native and compat 32-bit syscall tables 2015-03-04 06:16:21 +01:00
sys_ia32.c x86/compat: Remove sys32_vm86_warning 2015-03-04 06:16:21 +01:00