aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro2012-10-26 08:54:47 -0500
committerAl Viro2012-11-28 21:44:45 -0600
commitdfe09ae0e5fe40679af05b1ba810d469844c97b3 (patch)
tree0131917cc3c8f7e1cb5126e43064a01d2e1cab1c /arch/alpha
parent87f1ca8fd9f00cc024a141623d042ca4319e12c1 (diff)
downloadam43-linux-kernel-dfe09ae0e5fe40679af05b1ba810d469844c97b3.tar.gz
am43-linux-kernel-dfe09ae0e5fe40679af05b1ba810d469844c97b3.tar.xz
am43-linux-kernel-dfe09ae0e5fe40679af05b1ba810d469844c97b3.zip
alpha: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/alpha')
-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 7826e227e4d..eb3a4664ced 100644
--- a/arch/alpha/include/asm/unistd.h
+++ b/arch/alpha/include/asm/unistd.h
@@ -482,6 +482,9 @@
482#define __ARCH_WANT_SYS_SIGPENDING 482#define __ARCH_WANT_SYS_SIGPENDING
483#define __ARCH_WANT_SYS_RT_SIGSUSPEND 483#define __ARCH_WANT_SYS_RT_SIGSUSPEND
484#define __ARCH_WANT_SYS_EXECVE 484#define __ARCH_WANT_SYS_EXECVE
485#define __ARCH_WANT_SYS_FORK
486#define __ARCH_WANT_SYS_VFORK
487#define __ARCH_WANT_SYS_CLONE
485 488
486/* "Conditional" syscalls. What we want is 489/* "Conditional" syscalls. What we want is
487 490
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index c245de65c61..f62a994ef12 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -612,44 +612,24 @@ ret_from_kernel_thread:
612 * Special system calls. Most of these are special in that they either 612 * Special system calls. Most of these are special in that they either
613 * have to play switch_stack games or in some way use the pt_regs struct. 613 * have to play switch_stack games or in some way use the pt_regs struct.
614 */ 614 */
615
616.macro fork_like name
615 .align 4 617 .align 4
616 .globl sys_fork 618 .globl alpha_\name
617 .ent sys_fork 619 .ent alpha_\name
618sys_fork: 620alpha_\name:
619 .prologue 0 621 .prologue 0
620 bsr $1, do_switch_stack 622 bsr $1, do_switch_stack
621 bis $31, SIGCHLD, $16 623 jsr $26, sys_\name
622 mov $31, $17
623 mov $31, $18
624 mov $31, $19
625 mov $31, $20
626 jsr $26, alpha_clone
627fork_out:
628 ldq $26, 56($sp) 624 ldq $26, 56($sp)
629 lda $sp, SWITCH_STACK_SIZE($sp) 625 lda $sp, SWITCH_STACK_SIZE($sp)
630 ret 626 ret
631.end sys_fork 627.end alpha_\name
632 628.endm
633 .align 4
634 .globl sys_clone
635 .ent sys_clone
636sys_clone:
637 .prologue 0
638 bsr $1, do_switch_stack
639 /* $16, $17, $18, $19, $20 come from the user. */
640 lda $26, fork_out
641 jsr $31, alpha_clone
642.end sys_clone
643 629
644 .align 4 630fork_like fork
645 .globl sys_vfork 631fork_like vfork
646 .ent sys_vfork 632fork_like clone
647sys_vfork:
648 .prologue 0
649 bsr $1, do_switch_stack
650 lda $26, fork_out
651 jsr $31, alpha_vfork
652.end sys_vfork
653 633
654 .align 4 634 .align 4
655 .globl sys_sigreturn 635 .globl sys_sigreturn
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index a4dc79ba030..e9705bcc96f 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -235,31 +235,6 @@ release_thread(struct task_struct *dead_task)
235} 235}
236 236
237/* 237/*
238 * "alpha_clone()".. By the time we get here, the
239 * non-volatile registers have also been saved on the
240 * stack. We do some ugly pointer stuff here.. (see
241 * also copy_thread)
242 *
243 * Notice that "fork()" is implemented in terms of clone,
244 * with parameters (SIGCHLD, 0).
245 */
246int
247alpha_clone(unsigned long clone_flags, unsigned long usp,
248 int __user *parent_tid, int __user *child_tid,
249 unsigned long tls_value)
250{
251 return do_fork(clone_flags, usp, current_pt_regs(), 0,
252 parent_tid, child_tid);
253}
254
255int
256alpha_vfork(void)
257{
258 return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,
259 current_pt_regs(), 0, NULL, NULL);
260}
261
262/*
263 * Copy an alpha thread.. 238 * Copy an alpha thread..
264 */ 239 */
265 240
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S
index 2ac6b45c3e0..4284ec798ec 100644
--- a/arch/alpha/kernel/systbls.S
+++ b/arch/alpha/kernel/systbls.S
@@ -12,7 +12,7 @@
12sys_call_table: 12sys_call_table:
13 .quad alpha_ni_syscall /* 0 */ 13 .quad alpha_ni_syscall /* 0 */
14 .quad sys_exit 14 .quad sys_exit
15 .quad sys_fork 15 .quad alpha_fork
16 .quad sys_read 16 .quad sys_read
17 .quad sys_write 17 .quad sys_write
18 .quad alpha_ni_syscall /* 5 */ 18 .quad alpha_ni_syscall /* 5 */
@@ -76,7 +76,7 @@ sys_call_table:
76 .quad sys_getpgrp 76 .quad sys_getpgrp
77 .quad sys_getpagesize 77 .quad sys_getpagesize
78 .quad alpha_ni_syscall /* 65 */ 78 .quad alpha_ni_syscall /* 65 */
79 .quad sys_vfork 79 .quad alpha_vfork
80 .quad sys_newstat 80 .quad sys_newstat
81 .quad sys_newlstat 81 .quad sys_newlstat
82 .quad alpha_ni_syscall 82 .quad alpha_ni_syscall
@@ -330,7 +330,7 @@ sys_call_table:
330 .quad sys_ni_syscall /* 309: old get_kernel_syms */ 330 .quad sys_ni_syscall /* 309: old get_kernel_syms */
331 .quad sys_syslog /* 310 */ 331 .quad sys_syslog /* 310 */
332 .quad sys_reboot 332 .quad sys_reboot
333 .quad sys_clone 333 .quad alpha_clone
334 .quad sys_uselib 334 .quad sys_uselib
335 .quad sys_mlock 335 .quad sys_mlock
336 .quad sys_munlock /* 315 */ 336 .quad sys_munlock /* 315 */