alpha: simplify fork and friends

* no need to restore everything from switch_stack when we only need $26
* no need to pass current_pt_regs() manually, we can just as easily
calculate it in alpha_clone/alpha_vfork ($8 + constant)
* interpretation of zero usp as "use the parent's" is simpler in copy_thread();
let fork and vfork just pass 0.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-10-18 01:11:58 -04:00
Родитель 2b067fc9dd
Коммит e0e431aa45
2 изменённых файлов: 14 добавлений и 19 удалений

Просмотреть файл

@ -617,7 +617,6 @@ ret_from_kernel_thread:
.ent sys_fork
sys_fork:
.prologue 0
mov $sp, $21
bsr $1, do_switch_stack
bis $31, SIGCHLD, $16
mov $31, $17
@ -625,7 +624,9 @@ sys_fork:
mov $31, $19
mov $31, $20
jsr $26, alpha_clone
bsr $1, undo_switch_stack
fork_out:
ldq $26, 56($sp)
lda $sp, SWITCH_STACK_SIZE($sp)
ret
.end sys_fork
@ -634,12 +635,10 @@ sys_fork:
.ent sys_clone
sys_clone:
.prologue 0
mov $sp, $21
bsr $1, do_switch_stack
/* $16, $17, $18, $19, $20 come from the user. */
jsr $26, alpha_clone
bsr $1, undo_switch_stack
ret
lda $26, fork_out
jsr $31, alpha_clone
.end sys_clone
.align 4
@ -647,11 +646,9 @@ sys_clone:
.ent sys_vfork
sys_vfork:
.prologue 0
mov $sp, $16
bsr $1, do_switch_stack
jsr $26, alpha_vfork
bsr $1, undo_switch_stack
ret
lda $26, fork_out
jsr $31, alpha_vfork
.end sys_vfork
.align 4

Просмотреть файл

@ -246,19 +246,17 @@ release_thread(struct task_struct *dead_task)
int
alpha_clone(unsigned long clone_flags, unsigned long usp,
int __user *parent_tid, int __user *child_tid,
unsigned long tls_value, struct pt_regs *regs)
unsigned long tls_value)
{
if (!usp)
usp = rdusp();
return do_fork(clone_flags, usp, regs, 0, parent_tid, child_tid);
return do_fork(clone_flags, usp, current_pt_regs(), 0,
parent_tid, child_tid);
}
int
alpha_vfork(struct pt_regs *regs)
alpha_vfork(void)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(),
regs, 0, NULL, NULL);
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,
current_pt_regs(), 0, NULL, NULL);
}
/*
@ -301,7 +299,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
stack = ((struct switch_stack *) regs) - 1;
*childstack = *stack;
childstack->r26 = (unsigned long) ret_from_fork;
childti->pcb.usp = usp;
childti->pcb.usp = usp ?: rdusp();
childti->pcb.ksp = (unsigned long) childstack;
childti->pcb.flags = 1; /* set FEN, clear everything else */