Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: wireup clone3 syscall

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>

+19 -4
+1
arch/arc/Kconfig
··· 28 28 select GENERIC_SMP_IDLE_THREAD 29 29 select HAVE_ARCH_KGDB 30 30 select HAVE_ARCH_TRACEHOOK 31 + select HAVE_COPY_THREAD_TLS 31 32 select HAVE_DEBUG_STACKOVERFLOW 32 33 select HAVE_DEBUG_KMEMLEAK 33 34 select HAVE_FUTEX_CMPXCHG if FUTEX
+1
arch/arc/include/asm/syscalls.h
··· 11 11 #include <linux/types.h> 12 12 13 13 int sys_clone_wrapper(int, int, int, int, int); 14 + int sys_clone3_wrapper(void *, size_t); 14 15 int sys_cacheflush(uint32_t, uint32_t uint32_t); 15 16 int sys_arc_settls(void *); 16 17 int sys_arc_gettls(void);
+1
arch/arc/include/uapi/asm/unistd.h
··· 21 21 #define __ARCH_WANT_SET_GET_RLIMIT 22 22 #define __ARCH_WANT_SYS_EXECVE 23 23 #define __ARCH_WANT_SYS_CLONE 24 + #define __ARCH_WANT_SYS_CLONE3 24 25 #define __ARCH_WANT_SYS_VFORK 25 26 #define __ARCH_WANT_SYS_FORK 26 27 #define __ARCH_WANT_TIME32_SYSCALLS
+12
arch/arc/kernel/entry.S
··· 35 35 b .Lret_from_system_call 36 36 END(sys_clone_wrapper) 37 37 38 + ENTRY(sys_clone3_wrapper) 39 + SAVE_CALLEE_SAVED_USER 40 + bl @sys_clone3 41 + DISCARD_CALLEE_SAVED_USER 42 + 43 + GET_CURR_THR_INFO_FLAGS r10 44 + btst r10, TIF_SYSCALL_TRACE 45 + bnz tracesys_exit 46 + 47 + b .Lret_from_system_call 48 + END(sys_clone3_wrapper) 49 + 38 50 ENTRY(ret_from_fork) 39 51 ; when the forked child comes here from the __switch_to function 40 52 ; r0 has the last task pointer.
+3 -4
arch/arc/kernel/process.c
··· 171 171 * | user_r25 | 172 172 * ------------------ <===== END of PAGE 173 173 */ 174 - int copy_thread(unsigned long clone_flags, 175 - unsigned long usp, unsigned long kthread_arg, 176 - struct task_struct *p) 174 + int copy_thread_tls(unsigned long clone_flags, unsigned long usp, 175 + unsigned long kthread_arg, struct task_struct *p, unsigned long tls) 177 176 { 178 177 struct pt_regs *c_regs; /* child's pt_regs */ 179 178 unsigned long *childksp; /* to unwind out of __switch_to() */ ··· 230 231 * set task's userland tls data ptr from 4th arg 231 232 * clone C-lib call is difft from clone sys-call 232 233 */ 233 - task_thread_info(p)->thr_ptr = regs->r3; 234 + task_thread_info(p)->thr_ptr = tls; 234 235 } else { 235 236 /* Normal fork case: set parent's TLS ptr in child */ 236 237 task_thread_info(p)->thr_ptr =
+1
arch/arc/kernel/sys.c
··· 7 7 #include <asm/syscalls.h> 8 8 9 9 #define sys_clone sys_clone_wrapper 10 + #define sys_clone3 sys_clone3_wrapper 10 11 11 12 #undef __SYSCALL 12 13 #define __SYSCALL(nr, call) [nr] = (call),