diff options
author | Andy Lutomirski <luto@amacapital.net> | 2015-02-26 17:40:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-04 16:50:53 -0500 |
commit | 1e3fbb8a1d814f35e2e689cf87714d38d9f3564d (patch) | |
tree | a16fcdfd5d18f59b9ddec985e78c45101444ad96 | |
parent | d441c1f2b73ec742c2e55be804ebc6fee130c77f (diff) |
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>
Link: http://lkml.kernel.org/r/4710be56d76ef994ddf59087aad98c000fbab9a4.1424989793.git.luto@amacapital.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/entry_64.S | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index bc1527889c40..622ce4254893 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -550,11 +550,14 @@ ENTRY(ret_from_fork) | |||
550 | testl $3,CS(%rsp) # from kernel_thread? | 550 | testl $3,CS(%rsp) # from kernel_thread? |
551 | jz 1f | 551 | jz 1f |
552 | 552 | ||
553 | testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET | 553 | /* |
554 | jnz int_ret_from_sys_call | 554 | * By the time we get here, we have no idea whether our pt_regs, |
555 | 555 | * ti flags, and ti status came from the 64-bit SYSCALL fast path, | |
556 | RESTORE_TOP_OF_STACK %rdi | 556 | * the slow path, or one of the ia32entry paths. |
557 | jmp ret_from_sys_call # go to the SYSRET fastpath | 557 | * Use int_ret_from_sys_call to return, since it can safely handle |
558 | * all of the above. | ||
559 | */ | ||
560 | jmp int_ret_from_sys_call | ||
558 | 561 | ||
559 | 1: | 562 | 1: |
560 | movq %rbp, %rdi | 563 | movq %rbp, %rdi |