lkml.org 
[lkml]   [2015]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 072/172] x86/asm/entry/64: Remove a bogus 'ret_from_fork' optimization
    Date
    From: Andy Lutomirski <luto@amacapital.net>

    3.4.108-rc1 review patch. If anyone has any objections, please let me know.

    ------------------


    commit 956421fbb74c3a6261903f3836c0740187cf038b upstream.

    '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
    [ Backported from tip:x86/asm. ]
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Zefan Li <lizefan@huawei.com>
    ---
    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 45f9c70..8b49131 100644
    --- a/arch/x86/kernel/entry_64.S
    +++ b/arch/x86/kernel/entry_64.S
    @@ -414,11 +414,14 @@ ENTRY(ret_from_fork)
    testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread?
    jz retint_restore_args

    - 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

    CFI_ENDPROC
    END(ret_from_fork)
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-16 11:41    [W:4.123 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site