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 7826e227e4d09003ffb230c1596143f74539d607..eb3a4664ced2f745ed24f2b165b7629ed58fe32b 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 c245de65c61b91a697005ca3200e4632bb9fc337..f62a994ef1263c1d9bea762371f7b797d5225cd3 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 a4dc79ba030fab68ec004ead9ae84d3b1c70bd23..e9705bcc96f968b803313523d9db863743f1dc3b 100644 (file)
@@ -234,31 +234,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 2ac6b45c3e0005d542a084bfabcc652b4747f75e..4284ec798ec94c89ebe0e4b05e1eb2d1c6dbb0ed 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 */