|
@@ -1114,8 +1114,11 @@ static void setup_ksp_vsid(struct task_struct *p, unsigned long sp)
|
|
|
*/
|
|
|
extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */
|
|
|
|
|
|
+/*
|
|
|
+ * Copy architecture-specific thread state
|
|
|
+ */
|
|
|
int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|
|
- unsigned long arg, struct task_struct *p)
|
|
|
+ unsigned long kthread_arg, struct task_struct *p)
|
|
|
{
|
|
|
struct pt_regs *childregs, *kregs;
|
|
|
extern void ret_from_fork(void);
|
|
@@ -1127,6 +1130,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|
|
sp -= sizeof(struct pt_regs);
|
|
|
childregs = (struct pt_regs *) sp;
|
|
|
if (unlikely(p->flags & PF_KTHREAD)) {
|
|
|
+ /* kernel thread */
|
|
|
struct thread_info *ti = (void *)task_stack_page(p);
|
|
|
memset(childregs, 0, sizeof(struct pt_regs));
|
|
|
childregs->gpr[1] = sp + sizeof(struct pt_regs);
|
|
@@ -1137,11 +1141,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|
|
clear_tsk_thread_flag(p, TIF_32BIT);
|
|
|
childregs->softe = 1;
|
|
|
#endif
|
|
|
- childregs->gpr[15] = arg;
|
|
|
+ childregs->gpr[15] = kthread_arg;
|
|
|
p->thread.regs = NULL; /* no user register state */
|
|
|
ti->flags |= _TIF_RESTOREALL;
|
|
|
f = ret_from_kernel_thread;
|
|
|
} else {
|
|
|
+ /* user thread */
|
|
|
struct pt_regs *regs = current_pt_regs();
|
|
|
CHECK_FULL_REGS(regs);
|
|
|
*childregs = *regs;
|