struct pt_regs *regs,
unsigned long stack_size)
{
- unsigned long tid_ptr = 0;
+ unsigned long parent_tid_ptr = 0;
+ unsigned long child_tid_ptr = 0;
struct task_struct *p;
clone_flags &= ~CLONE_IDLETASK;
- if (clone_flags & (CLONE_SETTID | CLONE_CLEARTID))
- tid_ptr = regs->u_regs[UREG_G2];
-
+ if (clone_flags & (CLONE_SETTID | CLONE_CLEARTID)) {
+ parent_tid_ptr = regs->u_regs[UREG_G2];
+ child_tid_ptr = regs->u_regs[UREG_G3];
+ }
p = do_fork(clone_flags, stack_start,
- regs, stack_size, (int *) tid_ptr);
+ regs, stack_size,
+ (int *) parent_tid_ptr,
+ (int *) child_tid_ptr);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
}
#endif
}
- p->user_tid = NULL;
+ p->set_child_tid = p->clear_child_tid = NULL;
/* Calculate offset to stack_frame & pt_regs */
stack_offset = THREAD_SIZE - TRACEREG_SZ;
/* Set the return value for the parent. */
regs->u_regs[UREG_I1] = 0;
- if (!(clone_flags & (CLONE_SETTID | CLONE_CLEARTID)))
- return 0;
-
- if (clone_flags & CLONE_SETTID)
- if (put_user(p->pid, (int *)childregs->u_regs[UREG_G2]))
- return -EFAULT;
-
- if (clone_flags & CLONE_CLEARTID)
- p->user_tid = (int *) childregs->u_regs[UREG_G2];
-
return 0;
}
unsigned long stack_size)
{
struct task_struct *p;
- unsigned long tid_ptr = 0;
+ unsigned long parent_tid_ptr = 0;
+ unsigned long child_tid_ptr = 0;
clone_flags &= ~CLONE_IDLETASK;
if (clone_flags & (CLONE_SETTID | CLONE_CLEARTID)) {
- tid_ptr = regs->u_regs[UREG_G2];
- if (test_thread_flag(TIF_32BIT))
- tid_ptr &= 0xffffffff;
+ parent_tid_ptr = regs->u_regs[UREG_G2];
+ child_tid_ptr = regs->u_regs[UREG_G3];
+ if (test_thread_flag(TIF_32BIT)) {
+ parent_tid_ptr &= 0xffffffff;
+ child_tid_ptr &= 0xffffffff;
+ }
}
p = do_fork(clone_flags, stack_start,
- regs, stack_size, (int *) tid_ptr);
+ regs, stack_size,
+ (int *) parent_tid_ptr,
+ (int *) child_tid_ptr);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
}
p->thread.smp_lock_pc = 0;
#endif
- p->user_tid = NULL;
+ p->set_child_tid = p->clear_child_tid = NULL;
/* Calculate offset to stack_frame & pt_regs */
child_trap_frame = ((char *)t) + (THREAD_SIZE - (TRACEREG_SZ+REGWIN_SZ));