summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kernel/entry_64.S1
-rw-r--r--arch/powerpc/kernel/process.c4
2 files changed, 2 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 8fdb05146ca..e9a906c2723 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -373,6 +373,7 @@ _GLOBAL(ret_from_fork)
_GLOBAL(ret_from_kernel_thread)
bl .schedule_tail
REST_NVGPRS(r1)
+ ld r14, 0(r14)
mtlr r14
mr r3,r15
blrl
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 7fc70f29edb..8c600c3f661 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -749,12 +749,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
struct thread_info *ti = (void *)task_stack_page(p);
memset(childregs, 0, sizeof(struct pt_regs));
childregs->gpr[1] = sp + sizeof(struct pt_regs);
+ childregs->gpr[14] = usp; /* function */
#ifdef CONFIG_PPC64
- childregs->gpr[14] = *(unsigned long *)usp;
clear_tsk_thread_flag(p, TIF_32BIT);
childregs->softe = 1;
-#else
- childregs->gpr[14] = usp; /* function */
#endif
childregs->gpr[15] = arg;
p->thread.regs = NULL; /* no user register state */