]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
csky: Implement copy_thread_tls
authorGuo Ren <guoren@linux.alibaba.com>
Wed, 12 Feb 2020 02:24:52 +0000 (10:24 +0800)
committerGuo Ren <guoren@linux.alibaba.com>
Fri, 21 Feb 2020 07:43:25 +0000 (15:43 +0800)
This is required for clone3 which passes the TLS value through a
struct rather than a register.

Cc: Amanieu d'Antras <amanieu@gmail.com>
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
arch/csky/Kconfig
arch/csky/kernel/process.c

index 72b2999a889a46386d32f4a38ae29c63fc3ed1d5..047427f71d835a6022023c7d69e7a42864d9caac 100644 (file)
@@ -36,6 +36,7 @@ config CSKY
        select GX6605S_TIMER if CPU_CK610
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_AUDITSYSCALL
+       select HAVE_COPY_THREAD_TLS
        select HAVE_DYNAMIC_FTRACE
        select HAVE_FUNCTION_TRACER
        select HAVE_FUNCTION_GRAPH_TRACER
index 5349cd8c0f30986e89ab85367f51610c9e315b77..f7b231ca269a0dbc2b5fd76dbffcb5429fb01c6d 100644 (file)
@@ -40,10 +40,11 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
        return sw->r15;
 }
 
-int copy_thread(unsigned long clone_flags,
+int copy_thread_tls(unsigned long clone_flags,
                unsigned long usp,
                unsigned long kthread_arg,
-               struct task_struct *p)
+               struct task_struct *p,
+               unsigned long tls)
 {
        struct switch_stack *childstack;
        struct pt_regs *childregs = task_pt_regs(p);
@@ -70,7 +71,7 @@ int copy_thread(unsigned long clone_flags,
                        childregs->usp = usp;
                if (clone_flags & CLONE_SETTLS)
                        task_thread_info(p)->tp_value = childregs->tls
-                                                     = childregs->regs[0];
+                                                     = tls;
 
                childregs->a0 = 0;
                childstack->r15 = (unsigned long) ret_from_fork;