extern void ret_from_fork(void);
unsigned long sp = (unsigned long)p->thread_info + THREAD_SIZE;
+ p->user_tid = NULL;
+
/* Copy registers */
sp -= sizeof(struct pt_regs);
childregs = (struct pt_regs *) sp;
u32 p6, struct pt_regs *regs)
{
struct task_struct *p;
- int *user_tid = (int *)p3;
+ unsigned long tid_ptr = 0;
+
+ if (clone_flags & (CLONE_SETTID | CLONE_CLEARTID)) {
+ tid_ptr = p3;
+ if (test_thread_flag(TIF_32BIT))
+ tid_ptr &= 0xffffffff;
+ }
if (regs->msr & MSR_FP)
giveup_fpu(current);
p = do_fork(clone_flags & ~CLONE_IDLETASK, regs->gpr[1], regs, 0,
- user_tid);
+ (int *)tid_ptr);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
}