alpha: switch to generic fork/vfork/clone
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 26 Oct 2012 13:54:47 +0000 (09:54 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 29 Nov 2012 03:44:45 +0000 (22:44 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/include/asm/unistd.h
arch/alpha/kernel/entry.S
arch/alpha/kernel/process.c
arch/alpha/kernel/systbls.S

index 7826e22..eb3a466 100644 (file)
 #define __ARCH_WANT_SYS_SIGPENDING
 #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.  What we want is
 
index c245de6..f62a994 100644 (file)
@@ -612,44 +612,24 @@ ret_from_kernel_thread:
  * Special system calls.  Most of these are special in that they either
  * have to play switch_stack games or in some way use the pt_regs struct.
  */
+
+.macro fork_like name
        .align  4
-       .globl  sys_fork
-       .ent    sys_fork
-sys_fork:
+       .globl  alpha_\name
+       .ent    alpha_\name
+alpha_\name:
        .prologue 0
        bsr     $1, do_switch_stack
-       bis     $31, SIGCHLD, $16
-       mov     $31, $17
-       mov     $31, $18
-       mov     $31, $19
-       mov     $31, $20
-       jsr     $26, alpha_clone
-fork_out:
+       jsr     $26, sys_\name
        ldq     $26, 56($sp)
        lda     $sp, SWITCH_STACK_SIZE($sp)
        ret
-.end sys_fork
-
-       .align  4
-       .globl  sys_clone
-       .ent    sys_clone
-sys_clone:
-       .prologue 0
-       bsr     $1, do_switch_stack
-       /* $16, $17, $18, $19, $20 come from the user.  */
-       lda     $26, fork_out
-       jsr     $31, alpha_clone
-.end sys_clone
+.end   alpha_\name
+.endm
 
-       .align  4
-       .globl  sys_vfork
-       .ent    sys_vfork
-sys_vfork:
-       .prologue 0
-       bsr     $1, do_switch_stack
-       lda     $26, fork_out
-       jsr     $31, alpha_vfork
-.end sys_vfork
+fork_like fork
+fork_like vfork
+fork_like clone
 
        .align  4
        .globl  sys_sigreturn
index a4dc79b..e9705bc 100644 (file)
@@ -235,31 +235,6 @@ release_thread(struct task_struct *dead_task)
 }
 
 /*
- * "alpha_clone()".. 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)
- *
- * Notice that "fork()" is implemented in terms of clone,
- * with parameters (SIGCHLD, 0).
- */
-int
-alpha_clone(unsigned long clone_flags, unsigned long usp,
-           int __user *parent_tid, int __user *child_tid,
-           unsigned long tls_value)
-{
-       return do_fork(clone_flags, usp, current_pt_regs(), 0,
-                       parent_tid, child_tid);
-}
-
-int
-alpha_vfork(void)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,
-                      current_pt_regs(), 0, NULL, NULL);
-}
-
-/*
  * Copy an alpha thread..
  */
 
index 2ac6b45..4284ec7 100644 (file)
@@ -12,7 +12,7 @@
 sys_call_table:
        .quad alpha_ni_syscall                  /* 0 */
        .quad sys_exit
-       .quad sys_fork
+       .quad alpha_fork
        .quad sys_read
        .quad sys_write
        .quad alpha_ni_syscall                  /* 5 */
@@ -76,7 +76,7 @@ sys_call_table:
        .quad sys_getpgrp
        .quad sys_getpagesize
        .quad alpha_ni_syscall                  /* 65 */
-       .quad sys_vfork
+       .quad alpha_vfork
        .quad sys_newstat
        .quad sys_newlstat
        .quad alpha_ni_syscall
@@ -330,7 +330,7 @@ sys_call_table:
        .quad sys_ni_syscall                    /* 309: old get_kernel_syms */
        .quad sys_syslog                        /* 310 */
        .quad sys_reboot
-       .quad sys_clone
+       .quad alpha_clone
        .quad sys_uselib
        .quad sys_mlock
        .quad sys_munlock                       /* 315 */