Re: [PATCH 1/3] x86_64, entry: Remove a bogus ret_from_fork optimization

2015-02-24 Thread Ingo Molnar

* Andy Lutomirski  wrote:

> 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 

Acked-by: Ingo Molnar 

Thanks,

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/3] x86_64, entry: Remove a bogus ret_from_fork optimization

2015-02-24 Thread Andy Lutomirski
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 
---
 arch/x86/kernel/entry_64.S | 13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 9ebaf63ba182..4ee9a2315f80 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -334,11 +334,14 @@ ENTRY(ret_from_fork)
testl $3, CS-ARGOFFSET(%rsp)# from kernel_thread?
jz   1f
 
-   testl $_TIF_IA32, TI_flags(%rcx)# 32-bit compat task needs IRET
-   jnz  int_ret_from_sys_call
-
-   RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
-   jmp ret_from_sys_call   # go to the SYSRET fastpath
+   /*
+* By the time we get here, we have no idea whether our pt_regs,
+* ti flags, and ti status came from the 64-bit SYSCALL fast path,
+* the slow path, or one of the ia32entry paths.
+* Use int_ret_from_sys_call to return, since it can safely handle
+* all of the above.
+*/
+   jmp  int_ret_from_sys_call
 
 1:
subq $REST_SKIP, %rsp   # leave space for volatiles
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/