diff options
| author | Richard Henderson <rth@dorothy.sfbay.redhat.com> | 2002-11-21 02:56:50 -0800 |
|---|---|---|
| committer | Richard Henderson <rth@dorothy.sfbay.redhat.com> | 2002-11-21 02:56:50 -0800 |
| commit | 85f7c390fc6df56dc17e7d163cabcc2011a9a151 (patch) | |
| tree | 438b424887072fd8842b5291f6a8e6b8688fc1c3 | |
| parent | 1475142701e197c106683cb2140f48ce5a6b109d (diff) | |
[ALPHA] Update clone syscall for child_tid argument.
| -rw-r--r-- | arch/alpha/kernel/entry.S | 12 | ||||
| -rw-r--r-- | arch/alpha/kernel/process.c | 13 |
2 files changed, 13 insertions, 12 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 1fa8e7e945ad..c21786dfff32 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -688,12 +688,13 @@ __kernel_execve: .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 @@ -704,10 +705,9 @@ sys_fork: .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 @@ -718,8 +718,8 @@ sys_clone: .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 diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 2e727ba90f74..196a016657ed 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -235,24 +235,25 @@ release_thread(struct task_struct *dead_task) * 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; } @@ -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 application calling fork. */ if (clone_flags & CLONE_SETTLS) - childti->pcb.unique = regs->r19; + childti->pcb.unique = regs->r20; return 0; } |
