h8300: switch to generic fork/vfork/clone
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 27 Oct 2012 04:07:24 +0000 (00:07 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 29 Nov 2012 03:46:54 +0000 (22:46 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/h8300/include/asm/unistd.h
arch/h8300/kernel/process.c
arch/h8300/kernel/syscalls.S

index 07afcfaec9951317b30491383787ec3158965b15..c2c2f5c7d6bf3515d8d13ee821a34269e1105ddc 100644 (file)
 #define __ARCH_WANT_SYS_RT_SIGACTION
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_EXECVE
 #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
 
 /*
  * "Conditional" syscalls
index 2a45718cc5e8e062ef880df8afcdcd6cf9e79295..b0fb4054aee527165305c39bb4d104c174ee2a86 100644 (file)
@@ -127,40 +127,9 @@ void flush_thread(void)
 {
 }
 
 {
 }
 
-/*
- * "h8300_fork()".. By the time we get here, the
- * non-volatile registers have also been saved on the
- * stack. We do some ugly pointer stuff here.. (see
- * also copy_thread)
- */
-
-asmlinkage int h8300_fork(struct pt_regs *regs)
-{
-       return -EINVAL;
-}
-
-asmlinkage int h8300_vfork(struct pt_regs *regs)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL);
-}
-
-asmlinkage int h8300_clone(struct pt_regs *regs)
-{
-       unsigned long clone_flags;
-       unsigned long newsp;
-
-       /* syscall2 puts clone_flags in er1 and usp in er2 */
-       clone_flags = regs->er1;
-       newsp = regs->er2;
-       if (!newsp)
-               newsp  = rdusp();
-       return do_fork(clone_flags, newsp, regs, 0, NULL, NULL);
-
-}
-
 int copy_thread(unsigned long clone_flags,
                 unsigned long usp, unsigned long topstk,
 int copy_thread(unsigned long clone_flags,
                 unsigned long usp, unsigned long topstk,
-                struct task_struct * p, struct pt_regs * regs)
+                struct task_struct * p, struct pt_regs *unused)
 {
        struct pt_regs * childregs;
 
 {
        struct pt_regs * childregs;
 
@@ -173,11 +142,10 @@ int copy_thread(unsigned long clone_flags,
                childregs->er5 = usp; /* fn */
                p->thread.ksp = (unsigned long)childregs;
        }
                childregs->er5 = usp; /* fn */
                p->thread.ksp = (unsigned long)childregs;
        }
-       *childregs = *regs;
+       *childregs = *current_pt_regs();
        childregs->retpc = (unsigned long) ret_from_fork;
        childregs->er0 = 0;
        childregs->retpc = (unsigned long) ret_from_fork;
        childregs->er0 = 0;
-
-       p->thread.usp = usp;
+       p->thread.usp = usp ?: rdusp();
        p->thread.ksp = (unsigned long)childregs;
 
        return 0;
        p->thread.ksp = (unsigned long)childregs;
 
        return 0;
index 9d77e715a2edcfd6865ce75d601834d07aae1094..b74dd0ade58dcc655b19b445780976a9acc18377 100644 (file)
@@ -340,21 +340,12 @@ SYMBOL_NAME_LABEL(sys_call_table)
        bra     SYMBOL_NAME(syscall_trampoline):8
        .endm
 
        bra     SYMBOL_NAME(syscall_trampoline):8
        .endm
 
-SYMBOL_NAME_LABEL(sys_clone)   
-       call_sp h8300_clone
-       
 SYMBOL_NAME_LABEL(sys_sigreturn)
        call_sp do_sigreturn
 
 SYMBOL_NAME_LABEL(sys_rt_sigreturn)
        call_sp do_rt_sigreturn
 
 SYMBOL_NAME_LABEL(sys_sigreturn)
        call_sp do_sigreturn
 
 SYMBOL_NAME_LABEL(sys_rt_sigreturn)
        call_sp do_rt_sigreturn
 
-SYMBOL_NAME_LABEL(sys_fork)
-       call_sp h8300_fork
-
-SYMBOL_NAME_LABEL(sys_vfork)
-       call_sp h8300_vfork
-
 SYMBOL_NAME_LABEL(syscall_trampoline)
        mov.l   sp,er0
        jmp     @er6
 SYMBOL_NAME_LABEL(syscall_trampoline)
        mov.l   sp,er0
        jmp     @er6