Commit dfe09ae0 authored by Al Viro's avatar Al Viro
Browse files

alpha: switch to generic fork/vfork/clone



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 87f1ca8f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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

+11 −31
Original line number Diff line number Diff line
@@ -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
+0 −25
Original line number Diff line number Diff line
@@ -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..
 */
+3 −3
Original line number Diff line number Diff line
@@ -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 */