.ent sys_fork
sys_fork:
.prologue 0
- mov $sp, $19
+ mov $sp, $21
bsr $1, do_switch_stack
- /* A fork is the same as clone(SIGCHLD, 0); */
bis $31, SIGCHLD, $16
mov $31, $17
mov $31, $18
+ mov $31, $19
+ mov $31, $20
jsr $26, alpha_clone
bsr $1, undo_switch_stack
ret
.ent sys_clone
sys_clone:
.prologue 0
- mov $sp, $19
+ mov $sp, $21
bsr $1, do_switch_stack
- /* $16, $17, $18, $19 come from the user; $19 is used later
- via pt_regs->r19. */
+ /* $16, $17, $18, $19, $20 come from the user. */
jsr $26, alpha_clone
bsr $1, undo_switch_stack
ret
.ent sys_vfork
sys_vfork:
.prologue 0
- bsr $1, do_switch_stack
mov $sp, $16
+ bsr $1, do_switch_stack
jsr $26, alpha_vfork
bsr $1, undo_switch_stack
ret
* with parameters (SIGCHLD, 0).
*/
int
-alpha_clone(unsigned long clone_flags, unsigned long usp, int *user_tid,
- struct pt_regs *regs)
+alpha_clone(unsigned long clone_flags, unsigned long usp, int *parent_tid,
+ int *child_tid, unsigned long tls_value, struct pt_regs *regs)
{
struct task_struct *p;
if (!usp)
usp = rdusp();
- p = do_fork(clone_flags & ~CLONE_IDLETASK, usp, regs, 0, user_tid);
+ p = do_fork(clone_flags & ~CLONE_IDLETASK, usp, regs, 0,
+ parent_tid, child_tid);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
}
int
-alpha_vfork(struct switch_stack * swstack)
+alpha_vfork(struct pt_regs *regs)
{
struct task_struct *p;
p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(),
- (struct pt_regs *) (swstack+1), 0, NULL);
+ regs, 0, NULL, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
}
required for proper operation in the case of a threaded
application calling fork. */
if (clone_flags & CLONE_SETTLS)
- childti->pcb.unique = regs->r19;
+ childti->pcb.unique = regs->r20;
return 0;
}