Skip to content

Commit 956421f

Browse files
amlutoIngo Molnar
authored and
Ingo Molnar
committed
x86/asm/entry/64: Remove a bogus 'ret_from_fork' optimization
'ret_from_fork' checks TIF_IA32 to determine whether 'pt_regs' and the related state make sense for 'ret_from_sys_call'. This is entirely the wrong check. TS_COMPAT would make a little more sense, but there's really no point in keeping this optimization at all. This fixes a return to the wrong user CS if we came from int 0x80 in a 64-bit task. Signed-off-by: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: <stable@vger.kernel.org> Link: http://lkml.kernel.org/r/4710be56d76ef994ddf59087aad98c000fbab9a4.1424989793.git.luto@amacapital.net [ Backported from tip:x86/asm. ] Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent be482d6 commit 956421f

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

Diff for: arch/x86/kernel/entry_64.S

+8-5
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,14 @@ ENTRY(ret_from_fork)
269269
testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread?
270270
jz 1f
271271

272-
testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET
273-
jnz int_ret_from_sys_call
274-
275-
RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
276-
jmp ret_from_sys_call # go to the SYSRET fastpath
272+
/*
273+
* By the time we get here, we have no idea whether our pt_regs,
274+
* ti flags, and ti status came from the 64-bit SYSCALL fast path,
275+
* the slow path, or one of the ia32entry paths.
276+
* Use int_ret_from_sys_call to return, since it can safely handle
277+
* all of the above.
278+
*/
279+
jmp int_ret_from_sys_call
277280

278281
1:
279282
subq $REST_SKIP, %rsp # leave space for volatiles

0 commit comments

Comments
 (0)