summaryrefslogtreecommitdiffstats
path: root/arch/arc/kernel/process.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2018-10-18 11:13:01 -0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2018-10-18 11:13:01 -0300
commitce6c9da1113ad681bff27a3e376d2017f7f8a59c (patch)
tree922ee99522f8e47e4fa5c735d4ea378dfdb79085 /arch/arc/kernel/process.c
parentd4ae552982de39417d17f823df1f06b1cbc3686c (diff)
parent20e8e72d0fa8e26202932c30d592bade73fdc701 (diff)
downloadtalos-obmc-linux-ce6c9da1113ad681bff27a3e376d2017f7f8a59c.tar.gz
talos-obmc-linux-ce6c9da1113ad681bff27a3e376d2017f7f8a59c.zip
Merge remote-tracking branch 'tip/perf/urgent' into perf/core
To pick up fixes. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'arch/arc/kernel/process.c')
-rw-r--r--arch/arc/kernel/process.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c
index 4674541eba3f..8ce6e7235915 100644
--- a/arch/arc/kernel/process.c
+++ b/arch/arc/kernel/process.c
@@ -241,6 +241,26 @@ int copy_thread(unsigned long clone_flags,
task_thread_info(current)->thr_ptr;
}
+
+ /*
+ * setup usermode thread pointer #1:
+ * when child is picked by scheduler, __switch_to() uses @c_callee to
+ * populate usermode callee regs: this works (despite being in a kernel
+ * function) since special return path for child @ret_from_fork()
+ * ensures those regs are not clobbered all the way to RTIE to usermode
+ */
+ c_callee->r25 = task_thread_info(p)->thr_ptr;
+
+#ifdef CONFIG_ARC_CURR_IN_REG
+ /*
+ * setup usermode thread pointer #2:
+ * however for this special use of r25 in kernel, __switch_to() sets
+ * r25 for kernel needs and only in the final return path is usermode
+ * r25 setup, from pt_regs->user_r25. So set that up as well
+ */
+ c_regs->user_r25 = c_callee->r25;
+#endif
+
return 0;
}
OpenPOWER on IntegriCloud