in kernel/process.c [108:129]
int copy_thread(unsigned long clone_flags, unsigned long usp,
unsigned long topstk, struct task_struct *p, unsigned long tls)
{
struct pt_regs *childregs;
childregs = (struct pt_regs *) (THREAD_SIZE + task_stack_page(p)) - 1;
if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {
memset(childregs, 0, sizeof(struct pt_regs));
childregs->retpc = (unsigned long) ret_from_kernel_thread;
childregs->er4 = topstk; /* arg */
childregs->er5 = usp; /* fn */
} else {
*childregs = *current_pt_regs();
childregs->er0 = 0;
childregs->retpc = (unsigned long) ret_from_fork;
p->thread.usp = usp ?: rdusp();
}
p->thread.ksp = (unsigned long)childregs;
return 0;
}