lkml.org 
[lkml]   [2020]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 62/78] xtensa: Implement copy_thread_tls
    Date
    From: Amanieu d'Antras <amanieu@gmail.com>

    commit c346b94f8c5d1b7d637522c908209de93305a8eb upstream.

    This is required for clone3 which passes the TLS value through a
    struct rather than a register.

    Signed-off-by: Amanieu d'Antras <amanieu@gmail.com>
    Cc: linux-xtensa@linux-xtensa.org
    Cc: <stable@vger.kernel.org> # 5.3.x
    Link: https://lore.kernel.org/r/20200102172413.654385-7-amanieu@gmail.com
    Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/xtensa/Kconfig | 1 +
    arch/xtensa/kernel/process.c | 8 ++++----
    2 files changed, 5 insertions(+), 4 deletions(-)

    --- a/arch/xtensa/Kconfig
    +++ b/arch/xtensa/Kconfig
    @@ -22,6 +22,7 @@ config XTENSA
    select HAVE_ARCH_JUMP_LABEL
    select HAVE_ARCH_KASAN if MMU
    select HAVE_ARCH_TRACEHOOK
    + select HAVE_COPY_THREAD_TLS
    select HAVE_DEBUG_KMEMLEAK
    select HAVE_DMA_CONTIGUOUS
    select HAVE_EXIT_THREAD
    --- a/arch/xtensa/kernel/process.c
    +++ b/arch/xtensa/kernel/process.c
    @@ -202,8 +202,9 @@ int arch_dup_task_struct(struct task_str
    * involved. Much simpler to just not copy those live frames across.
    */

    -int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
    - unsigned long thread_fn_arg, struct task_struct *p)
    +int copy_thread_tls(unsigned long clone_flags, unsigned long usp_thread_fn,
    + unsigned long thread_fn_arg, struct task_struct *p,
    + unsigned long tls)
    {
    struct pt_regs *childregs = task_pt_regs(p);

    @@ -264,9 +265,8 @@ int copy_thread(unsigned long clone_flag
    &regs->areg[XCHAL_NUM_AREGS - len/4], len);
    }

    - /* The thread pointer is passed in the '4th argument' (= a5) */
    if (clone_flags & CLONE_SETTLS)
    - childregs->threadptr = childregs->areg[5];
    + childregs->threadptr = tls;
    } else {
    p->thread.ra = MAKE_RA_FOR_CALL(
    (unsigned long)ret_from_kernel_thread, 1);

    \
     
     \ /
      Last update: 2020-01-14 11:07    [W:4.313 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site