diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-21 16:52:56 -0400 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-11-28 22:36:46 -0500 | 
| commit | 92bbe6cdfdeeaf9ac2a240b1829bab219e7e91d0 (patch) | |
| tree | 01f0fcd9307bbf09850fcc82baaec879f8313bfc | |
| parent | 27d892fb27f492921cfd6df15ab4153f1badbb46 (diff) | |
| download | olio-linux-3.10-92bbe6cdfdeeaf9ac2a240b1829bab219e7e91d0.tar.xz olio-linux-3.10-92bbe6cdfdeeaf9ac2a240b1829bab219e7e91d0.zip  | |
m32r: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | arch/m32r/include/asm/unistd.h | 3 | ||||
| -rw-r--r-- | arch/m32r/kernel/process.c | 46 | 
2 files changed, 7 insertions, 42 deletions
diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index b27bdcbc7c2..d9e7351af2a 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h @@ -353,6 +353,9 @@  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK  #define __IGNORE_lchown  #define __IGNORE_setuid diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c index 62c713f5694..c37e9a9a8f2 100644 --- a/arch/m32r/kernel/process.c +++ b/arch/m32r/kernel/process.c @@ -192,7 +192,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  }  int copy_thread(unsigned long clone_flags, unsigned long spu, -	unsigned long arg, struct task_struct *tsk, struct pt_regs *regs) +	unsigned long arg, struct task_struct *tsk, struct pt_regs *unused)  {  	struct pt_regs *childregs = task_pt_regs(tsk);  	extern void ret_from_fork(void); @@ -206,8 +206,9 @@ int copy_thread(unsigned long clone_flags, unsigned long spu,  		tsk->thread.lr = (unsigned long)ret_from_kernel_thread;  	} else {  		/* Copy registers */ -		*childregs = *regs; -		childregs->spu = spu; +		*childregs = *current_pt_regs(); +		if (spu) +			childregs->spu = spu;  		childregs->r0 = 0;	/* Child gets zero as return value */  		tsk->thread.lr = (unsigned long)ret_from_fork;  	} @@ -216,45 +217,6 @@ int copy_thread(unsigned long clone_flags, unsigned long spu,  	return 0;  } -asmlinkage int sys_fork(void) -{ -#ifdef CONFIG_MMU -	struct pt_regs *regs = current_pt_regs(); -	return do_fork(SIGCHLD, regs->spu, regs, 0, NULL, NULL); -#else -	return -EINVAL; -#endif /* CONFIG_MMU */ -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidptr, -			 unsigned long child_tidptr) -{ -	struct pt_regs *regs = current_pt_regs(); -	if (!newsp) -		newsp = regs->spu; - -	return do_fork(clone_flags, newsp, regs, 0, -		       (int __user *)parent_tidptr, (int __user *)child_tidptr); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -asmlinkage int sys_vfork(void) -{ -	struct pt_regs *regs = current_pt_regs(); -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->spu, regs, 0, -			NULL, NULL); -} -  /*   * These bracket the sleeping functions..   */  |