From dfe09ae0e5fe40679af05b1ba810d469844c97b3 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 26 Oct 2012 09:54:47 -0400 Subject: alpha: switch to generic fork/vfork/clone Signed-off-by: Al Viro --- arch/alpha/include/asm/unistd.h | 3 +++ arch/alpha/kernel/entry.S | 42 +++++++++++------------------------------ arch/alpha/kernel/process.c | 25 ------------------------ arch/alpha/kernel/systbls.S | 6 +++--- 4 files changed, 17 insertions(+), 59 deletions(-) (limited to 'arch/alpha') 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 @@ -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.. */ 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 */ -- cgit v1.2.3