summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-10-21 16:52:56 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-11-28 22:36:46 -0500
commit92bbe6cdfdeeaf9ac2a240b1829bab219e7e91d0 (patch)
tree01f0fcd9307bbf09850fcc82baaec879f8313bfc
parent27d892fb27f492921cfd6df15ab4153f1badbb46 (diff)
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.h3
-rw-r--r--arch/m32r/kernel/process.c46
2 files changed, 7 insertions, 42 deletions
diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h
index b27bdcbc7c2c..d9e7351af2a4 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 62c713f5694a..c37e9a9a8f27 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..
*/