bfin: switch to generic vfork, get rid of pointless wrappers
Al Viro [Wed, 14 Nov 2012 04:47:37 +0000 (23:47 -0500)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

arch/blackfin/include/asm/unistd.h
arch/blackfin/kernel/entry.S
arch/blackfin/kernel/process.c
arch/blackfin/kernel/signal.c
arch/blackfin/mach-common/entry.S

index b4ec1bb..460514a 100644 (file)
 #define __ARCH_WANT_SYS_RT_SIGACTION
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_EXECVE
+#define __ARCH_WANT_SYS_VFORK
 
 /*
  * "Conditional" syscalls
index 78f4f63..4071265 100644 (file)
@@ -57,36 +57,3 @@ ENTRY(_ret_from_fork)
        RESTORE_CONTEXT
        rti;
 ENDPROC(_ret_from_fork)
-
-ENTRY(_sys_vfork)
-       r0 = sp;
-       r0 += 24;
-       [--sp] = rets;
-       SP += -12;
-       pseudo_long_call _bfin_vfork, p2;
-       SP += 12;
-       rets = [sp++];
-       rts;
-ENDPROC(_sys_vfork)
-
-ENTRY(_sys_clone)
-       r0 = sp;
-       r0 += 24;
-       [--sp] = rets;
-       SP += -12;
-       pseudo_long_call _bfin_clone, p2;
-       SP += 12;
-       rets = [sp++];
-       rts;
-ENDPROC(_sys_clone)
-
-ENTRY(_sys_rt_sigreturn)
-       r0 = sp;
-       r0 += 24;
-       [--sp] = rets;
-       SP += -12;
-       pseudo_long_call _do_rt_sigreturn, p2;
-       SP += 12;
-       rets = [sp++];
-       rts;
-ENDPROC(_sys_rt_sigreturn)
index da8df0e..e5ae8fc 100644 (file)
@@ -127,28 +127,13 @@ void flush_thread(void)
 {
 }
 
-asmlinkage int bfin_vfork(struct pt_regs *regs)
+asmlinkage int bfin_clone(unsigned long clone_flags, unsigned long newsp)
 {
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL,
-                      NULL);
-}
-
-asmlinkage int bfin_clone(struct pt_regs *regs)
-{
-       unsigned long clone_flags;
-       unsigned long newsp;
-
 #ifdef __ARCH_SYNC_CORE_DCACHE
        if (current->nr_cpus_allowed == num_possible_cpus())
                set_cpus_allowed_ptr(current, cpumask_of(smp_processor_id()));
 #endif
-
-       /* syscall2 puts clone_flags in r0 and usp in r1 */
-       clone_flags = regs->r0;
-       newsp = regs->r1;
-       if (!newsp)
-               newsp = rdusp();
-       else
+       if (newsp)
                newsp -= 12;
        return do_fork(clone_flags, newsp, regs, 0, NULL, NULL);
 }
@@ -174,7 +159,7 @@ copy_thread(unsigned long clone_flags,
        } else {
                *childregs = *regs;
                childregs->r0 = 0;
-               p->thread.usp = usp;
+               p->thread.usp = usp ? : rdusp();
                v[0] = v[1] = 0;
        }
 
index 6ed20a1..84b4be0 100644 (file)
@@ -82,9 +82,9 @@ rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *p
        return err;
 }
 
-asmlinkage int do_rt_sigreturn(unsigned long __unused)
+asmlinkage int sys_rt_sigreturn(void)
 {
-       struct pt_regs *regs = (struct pt_regs *)__unused;
+       struct pt_regs *regs = current_pt_regs();
        unsigned long usp = rdusp();
        struct rt_sigframe *frame = (struct rt_sigframe *)(usp);
        sigset_t set;
index 4a38c68..86b5a09 100644 (file)
@@ -1431,7 +1431,7 @@ ENTRY(_sys_call_table)
        .long _sys_ni_syscall   /* old sys_ipc */
        .long _sys_fsync
        .long _sys_ni_syscall   /* old sys_sigreturn */
-       .long _sys_clone                /* 120 */
+       .long _bfin_clone               /* 120 */
        .long _sys_setdomainname
        .long _sys_newuname
        .long _sys_ni_syscall   /* old sys_modify_ldt */