forked from Minki/linux
ARC: wireup clone3 syscall
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
7980dff398
commit
bd71c453db
@ -28,6 +28,7 @@ config ARC
|
|||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
|
select HAVE_COPY_THREAD_TLS
|
||||||
select HAVE_DEBUG_STACKOVERFLOW
|
select HAVE_DEBUG_STACKOVERFLOW
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
int sys_clone_wrapper(int, int, int, int, int);
|
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_cacheflush(uint32_t, uint32_t uint32_t);
|
||||||
int sys_arc_settls(void *);
|
int sys_arc_settls(void *);
|
||||||
int sys_arc_gettls(void);
|
int sys_arc_gettls(void);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define __ARCH_WANT_SET_GET_RLIMIT
|
#define __ARCH_WANT_SET_GET_RLIMIT
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
#define __ARCH_WANT_SYS_CLONE3
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||||
|
@ -35,6 +35,18 @@ ENTRY(sys_clone_wrapper)
|
|||||||
b .Lret_from_system_call
|
b .Lret_from_system_call
|
||||||
END(sys_clone_wrapper)
|
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)
|
ENTRY(ret_from_fork)
|
||||||
; when the forked child comes here from the __switch_to function
|
; when the forked child comes here from the __switch_to function
|
||||||
; r0 has the last task pointer.
|
; r0 has the last task pointer.
|
||||||
|
@ -171,9 +171,8 @@ asmlinkage void ret_from_fork(void);
|
|||||||
* | user_r25 |
|
* | user_r25 |
|
||||||
* ------------------ <===== END of PAGE
|
* ------------------ <===== END of PAGE
|
||||||
*/
|
*/
|
||||||
int copy_thread(unsigned long clone_flags,
|
int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
|
||||||
unsigned long usp, unsigned long kthread_arg,
|
unsigned long kthread_arg, struct task_struct *p, unsigned long tls)
|
||||||
struct task_struct *p)
|
|
||||||
{
|
{
|
||||||
struct pt_regs *c_regs; /* child's pt_regs */
|
struct pt_regs *c_regs; /* child's pt_regs */
|
||||||
unsigned long *childksp; /* to unwind out of __switch_to() */
|
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
|
* set task's userland tls data ptr from 4th arg
|
||||||
* clone C-lib call is difft from clone sys-call
|
* 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 {
|
} else {
|
||||||
/* Normal fork case: set parent's TLS ptr in child */
|
/* Normal fork case: set parent's TLS ptr in child */
|
||||||
task_thread_info(p)->thr_ptr =
|
task_thread_info(p)->thr_ptr =
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <asm/syscalls.h>
|
#include <asm/syscalls.h>
|
||||||
|
|
||||||
#define sys_clone sys_clone_wrapper
|
#define sys_clone sys_clone_wrapper
|
||||||
|
#define sys_clone3 sys_clone3_wrapper
|
||||||
|
|
||||||
#undef __SYSCALL
|
#undef __SYSCALL
|
||||||
#define __SYSCALL(nr, call) [nr] = (call),
|
#define __SYSCALL(nr, call) [nr] = (call),
|
||||||
|
Loading…
Reference in New Issue
Block a user