Commit 85f7c390 authored by Richard Henderson's avatar Richard Henderson

[ALPHA] Update clone syscall for child_tid argument.

parent 14751427
...@@ -688,12 +688,13 @@ __kernel_execve: ...@@ -688,12 +688,13 @@ __kernel_execve:
.ent sys_fork .ent sys_fork
sys_fork: sys_fork:
.prologue 0 .prologue 0
mov $sp, $19 mov $sp, $21
bsr $1, do_switch_stack bsr $1, do_switch_stack
/* A fork is the same as clone(SIGCHLD, 0); */
bis $31, SIGCHLD, $16 bis $31, SIGCHLD, $16
mov $31, $17 mov $31, $17
mov $31, $18 mov $31, $18
mov $31, $19
mov $31, $20
jsr $26, alpha_clone jsr $26, alpha_clone
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
ret ret
...@@ -704,10 +705,9 @@ sys_fork: ...@@ -704,10 +705,9 @@ sys_fork:
.ent sys_clone .ent sys_clone
sys_clone: sys_clone:
.prologue 0 .prologue 0
mov $sp, $19 mov $sp, $21
bsr $1, do_switch_stack bsr $1, do_switch_stack
/* $16, $17, $18, $19 come from the user; $19 is used later /* $16, $17, $18, $19, $20 come from the user. */
via pt_regs->r19. */
jsr $26, alpha_clone jsr $26, alpha_clone
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
ret ret
...@@ -718,8 +718,8 @@ sys_clone: ...@@ -718,8 +718,8 @@ sys_clone:
.ent sys_vfork .ent sys_vfork
sys_vfork: sys_vfork:
.prologue 0 .prologue 0
bsr $1, do_switch_stack
mov $sp, $16 mov $sp, $16
bsr $1, do_switch_stack
jsr $26, alpha_vfork jsr $26, alpha_vfork
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
ret ret
......
...@@ -235,24 +235,25 @@ release_thread(struct task_struct *dead_task) ...@@ -235,24 +235,25 @@ release_thread(struct task_struct *dead_task)
* with parameters (SIGCHLD, 0). * with parameters (SIGCHLD, 0).
*/ */
int int
alpha_clone(unsigned long clone_flags, unsigned long usp, int *user_tid, alpha_clone(unsigned long clone_flags, unsigned long usp, int *parent_tid,
struct pt_regs *regs) int *child_tid, unsigned long tls_value, struct pt_regs *regs)
{ {
struct task_struct *p; struct task_struct *p;
if (!usp) if (!usp)
usp = rdusp(); 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; return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
int int
alpha_vfork(struct switch_stack * swstack) alpha_vfork(struct pt_regs *regs)
{ {
struct task_struct *p; struct task_struct *p;
p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), 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; return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
...@@ -306,7 +307,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp, ...@@ -306,7 +307,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
required for proper operation in the case of a threaded required for proper operation in the case of a threaded
application calling fork. */ application calling fork. */
if (clone_flags & CLONE_SETTLS) if (clone_flags & CLONE_SETTLS)
childti->pcb.unique = regs->r19; childti->pcb.unique = regs->r20;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment