Commit 38a61b6b authored by Al Viro's avatar Al Viro
Browse files

arm: switch to generic fork/vfork/clone



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1d4b4b29
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ config ARM
	select SYS_SUPPORTS_APM_EMULATION
	select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
	select MODULES_USE_ELF_REL
	select CLONE_BACKWARDS
	help
	  The ARM series is a line of low-power-consumption RISC chip designs
	  licensed by ARM Ltd and targeted at embedded applications and
+3 −0
Original line number Diff line number Diff line
@@ -42,6 +42,9 @@
#define __ARCH_WANT_SYS_SOCKETCALL
#endif
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE

/*
 * "Conditional" syscalls
+3 −3
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
 */
/* 0 */		CALL(sys_restart_syscall)
		CALL(sys_exit)
		CALL(sys_fork_wrapper)
		CALL(sys_fork)
		CALL(sys_read)
		CALL(sys_write)
/* 5 */		CALL(sys_open)
@@ -129,7 +129,7 @@
		CALL(OBSOLETE(ABI(sys_ipc, sys_oabi_ipc)))
		CALL(sys_fsync)
		CALL(sys_sigreturn_wrapper)
/* 120 */	CALL(sys_clone_wrapper)
/* 120 */	CALL(sys_clone)
		CALL(sys_setdomainname)
		CALL(sys_newuname)
		CALL(sys_ni_syscall)		/* modify_ldt */
@@ -199,7 +199,7 @@
		CALL(sys_sendfile)
		CALL(sys_ni_syscall)		/* getpmsg */
		CALL(sys_ni_syscall)		/* putpmsg */
/* 190 */	CALL(sys_vfork_wrapper)
/* 190 */	CALL(sys_vfork)
		CALL(sys_getrlimit)
		CALL(sys_mmap2)
		CALL(ABI(sys_truncate64, sys_oabi_truncate64))
+0 −16
Original line number Diff line number Diff line
@@ -510,22 +510,6 @@ sys_syscall:
		b	sys_ni_syscall
ENDPROC(sys_syscall)

sys_fork_wrapper:
		add	r0, sp, #S_OFF
		b	sys_fork
ENDPROC(sys_fork_wrapper)

sys_vfork_wrapper:
		add	r0, sp, #S_OFF
		b	sys_vfork
ENDPROC(sys_vfork_wrapper)

sys_clone_wrapper:
		add	ip, sp, #S_OFF
		str	ip, [sp, #4]
		b	sys_clone
ENDPROC(sys_clone_wrapper)

sys_sigreturn_wrapper:
		add	r0, sp, #S_OFF
		mov	why, #0		@ prevent syscall restart handling
+6 −5
Original line number Diff line number Diff line
@@ -376,16 +376,17 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");

int
copy_thread(unsigned long clone_flags, unsigned long stack_start,
	    unsigned long stk_sz, struct task_struct *p, struct pt_regs *regs)
	    unsigned long stk_sz, struct task_struct *p, struct pt_regs *unused)
{
	struct thread_info *thread = task_thread_info(p);
	struct pt_regs *childregs = task_pt_regs(p);

	memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save));

	if (likely(regs)) {
		*childregs = *regs;
	if (likely(!(p->flags & PF_KTHREAD))) {
		*childregs = *current_pt_regs();
		childregs->ARM_r0 = 0;
		if (stack_start)
			childregs->ARM_sp = stack_start;
	} else {
		memset(childregs, 0, sizeof(struct pt_regs));
@@ -399,7 +400,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
	clear_ptrace_hw_breakpoint(p);

	if (clone_flags & CLONE_SETTLS)
		thread->tp_value = regs->ARM_r3;
		thread->tp_value = childregs->ARM_r3;

	thread_notify(THREAD_NOTIFY_COPY, thread);

Loading