ARC: wireup clone3 syscall
authorVineet Gupta <vgupta@synopsys.com>
Thu, 16 Jan 2020 00:08:12 +0000 (16:08 -0800)
committerVineet Gupta <vgupta@synopsys.com>
Thu, 16 Jan 2020 00:08:12 +0000 (16:08 -0800)
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/Kconfig
arch/arc/include/asm/syscalls.h
arch/arc/include/uapi/asm/unistd.h
arch/arc/kernel/entry.S
arch/arc/kernel/process.c
arch/arc/kernel/sys.c

index 26108ea..c4409ea 100644 (file)
@@ -28,6 +28,7 @@ config ARC
        select GENERIC_SMP_IDLE_THREAD
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_TRACEHOOK
+       select HAVE_COPY_THREAD_TLS
        select HAVE_DEBUG_STACKOVERFLOW
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_FUTEX_CMPXCHG if FUTEX
index 7ddba13..c3f4714 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/types.h>
 
 int sys_clone_wrapper(int, int, int, int, int);
+int sys_clone3_wrapper(void *, size_t);
 int sys_cacheflush(uint32_t, uint32_t uint32_t);
 int sys_arc_settls(void *);
 int sys_arc_gettls(void);
index 5eafa11..fa2713a 100644 (file)
@@ -21,6 +21,7 @@
 #define __ARCH_WANT_SET_GET_RLIMIT
 #define __ARCH_WANT_SYS_EXECVE
 #define __ARCH_WANT_SYS_CLONE
+#define __ARCH_WANT_SYS_CLONE3
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_TIME32_SYSCALLS
index 72be012..7e5109d 100644 (file)
@@ -35,6 +35,18 @@ ENTRY(sys_clone_wrapper)
        b .Lret_from_system_call
 END(sys_clone_wrapper)
 
+ENTRY(sys_clone3_wrapper)
+       SAVE_CALLEE_SAVED_USER
+       bl  @sys_clone3
+       DISCARD_CALLEE_SAVED_USER
+
+       GET_CURR_THR_INFO_FLAGS   r10
+       btst r10, TIF_SYSCALL_TRACE
+       bnz  tracesys_exit
+
+       b .Lret_from_system_call
+END(sys_clone3_wrapper)
+
 ENTRY(ret_from_fork)
        ; when the forked child comes here from the __switch_to function
        ; r0 has the last task pointer.
index e1889ce..bfd4cbe 100644 (file)
@@ -171,9 +171,8 @@ asmlinkage void ret_from_fork(void);
  * |    user_r25    |
  * ------------------  <===== END of PAGE
  */
-int copy_thread(unsigned long clone_flags,
-               unsigned long usp, unsigned long kthread_arg,
-               struct task_struct *p)
+int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
+       unsigned long kthread_arg, struct task_struct *p, unsigned long tls)
 {
        struct pt_regs *c_regs;        /* child's pt_regs */
        unsigned long *childksp;       /* to unwind out of __switch_to() */
@@ -231,7 +230,7 @@ int copy_thread(unsigned long clone_flags,
                 * set task's userland tls data ptr from 4th arg
                 * clone C-lib call is difft from clone sys-call
                 */
-               task_thread_info(p)->thr_ptr = regs->r3;
+               task_thread_info(p)->thr_ptr = tls;
        } else {
                /* Normal fork case: set parent's TLS ptr in child */
                task_thread_info(p)->thr_ptr =
index fddecc7..1069446 100644 (file)
@@ -7,6 +7,7 @@
 #include <asm/syscalls.h>
 
 #define sys_clone      sys_clone_wrapper
+#define sys_clone3     sys_clone3_wrapper
 
 #undef __SYSCALL
 #define __SYSCALL(nr, call) [nr] = (call),