summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-10-26 09:54:47 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-11-28 22:44:45 -0500
commitdfe09ae0e5fe40679af05b1ba810d469844c97b3 (patch)
tree0131917cc3c8f7e1cb5126e43064a01d2e1cab1c
parent87f1ca8fd9f00cc024a141623d042ca4319e12c1 (diff)
alpha: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/alpha/include/asm/unistd.h3
-rw-r--r--arch/alpha/kernel/entry.S42
-rw-r--r--arch/alpha/kernel/process.c25
-rw-r--r--arch/alpha/kernel/systbls.S6
4 files changed, 17 insertions, 59 deletions
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h
index 7826e227e4d0..eb3a4664ced2 100644
--- a/arch/alpha/include/asm/unistd.h
+++ b/arch/alpha/include/asm/unistd.h
@@ -482,6 +482,9 @@
#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
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index c245de65c61b..f62a994ef126 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -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
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index a4dc79ba030f..e9705bcc96f9 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -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..
*/
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S
index 2ac6b45c3e00..4284ec798ec9 100644
--- a/arch/alpha/kernel/systbls.S
+++ b/arch/alpha/kernel/systbls.S
@@ -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 */