mn10300: switch to generic fork/vfork/clone
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 21 Oct 2012 20:43:13 +0000 (16:43 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 29 Nov 2012 03:47:24 +0000 (22:47 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/mn10300/include/asm/unistd.h
arch/mn10300/kernel/process.c

index 9711d51..cabf8ba 100644 (file)
@@ -44,6 +44,9 @@
 #define __ARCH_WANT_SYS_RT_SIGACTION
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_EXECVE
+#define __ARCH_WANT_SYS_FORK
+#define __ARCH_WANT_SYS_VFORK
+#define __ARCH_WANT_SYS_CLONE
 
 /*
  * "Conditional" syscalls
index d0c671b..5e0ef39 100644 (file)
@@ -206,7 +206,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  */
 int copy_thread(unsigned long clone_flags,
                unsigned long c_usp, unsigned long ustk_size,
-               struct task_struct *p, struct pt_regs *kregs)
+               struct task_struct *p, struct pt_regs *unused)
 {
        struct thread_info *ti = task_thread_info(p);
        struct pt_regs *c_regs;
@@ -227,7 +227,7 @@ int copy_thread(unsigned long clone_flags,
        p->thread.wchan = p->thread.pc;
        p->thread.usp   = c_usp;
 
-       if (unlikely(!kregs)) {
+       if (unlikely(p->flags & PF_KTHREAD)) {
                memset(c_regs, 0, sizeof(struct pt_regs));
                c_regs->a0 = c_usp; /* function */
                c_regs->d0 = ustk_size; /* argument */
@@ -236,8 +236,9 @@ int copy_thread(unsigned long clone_flags,
                p->thread.pc    = (unsigned long) ret_from_kernel_thread;
                return 0;
        }
-       *c_regs = *kregs;
-       c_regs->sp = c_usp;
+       *c_regs = *current_pt_regs();
+       if (c_usp)
+               c_regs->sp = c_usp;
        c_regs->epsw &= ~EPSW_FE; /* my FPU */
 
        /* the new TLS pointer is passed in as arg #5 to sys_clone() */
@@ -249,30 +250,6 @@ int copy_thread(unsigned long clone_flags,
        return 0;
 }
 
-/*
- * clone a process
- * - tlsptr is retrieved by copy_thread() from current_frame()->d3
- */
-asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp,
-                         int __user *parent_tidptr, int __user *child_tidptr,
-                         int __user *tlsptr)
-{
-       return do_fork(clone_flags, newsp ?: current_frame()->sp,
-                      current_frame(), 0, parent_tidptr, child_tidptr);
-}
-
-asmlinkage long sys_fork(void)
-{
-       return do_fork(SIGCHLD, current_frame()->sp,
-                      current_frame(), 0, NULL, NULL);
-}
-
-asmlinkage long sys_vfork(void)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, current_frame()->sp,
-                      current_frame(), 0, NULL, NULL);
-}
-
 unsigned long get_wchan(struct task_struct *p)
 {
        return p->thread.wchan;