summaryrefslogtreecommitdiffstats
path: root/sys/arm/arm/swtch-v6.S
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
committerRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
commitcb642130dfc50717bb970a104c44aa7690930a38 (patch)
treec67f108534217a209198c6b201949ecc73acaba3 /sys/arm/arm/swtch-v6.S
parent5dd7ab172435dc99e1abc1f7d73fd5e720050bbc (diff)
parentcd04fbc5e631c6b3e80a14eb7044c3be35fba2d2 (diff)
downloadFreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.zip
FreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.tar.gz
Merge remote-tracking branch 'origin/stable/11' into devel-11
Diffstat (limited to 'sys/arm/arm/swtch-v6.S')
-rw-r--r--sys/arm/arm/swtch-v6.S12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/arm/arm/swtch-v6.S b/sys/arm/arm/swtch-v6.S
index d63661a..8bbaac9 100644
--- a/sys/arm/arm/swtch-v6.S
+++ b/sys/arm/arm/swtch-v6.S
@@ -291,6 +291,8 @@ ENTRY(cpu_switch)
ldr r3, [r0, #(TD_PCB)]
add r3, #(PCB_R4)
stmia r3, {r4-r12, sp, lr, pc}
+ mrc CP15_TPIDRURW(r4)
+ str r4, [r3, #(PCB_TPIDRURW - PCB_R4)]
#ifdef INVARIANTS
cmp r1, #0 /* new thread? */
@@ -437,9 +439,6 @@ sw1:
cmp r3, r6
beq 1b
#endif
- /* Set the new tls */
- ldr r0, [r11, #(TD_MD + MD_TP)]
- mcr CP15_TPIDRURO(r0) /* write tls thread reg 2 */
/* We have a new curthread now so make a note it */
str r11, [r8, #PC_CURTHREAD]
@@ -452,7 +451,14 @@ sw1:
* Restore all saved registers and return. Note that some saved
* registers can be changed when either cpu_fork(), cpu_copy_thread(),
* cpu_fork_kthread_handler(), or makectx() was called.
+ *
+ * The value of TPIDRURW is also written into TPIDRURO, as
+ * userspace still uses TPIDRURO, modifying it through
+ * sysarch(ARM_SET_TP, addr).
*/
+ ldr r3, [r7, #PCB_TPIDRURW]
+ mcr CP15_TPIDRURW(r3) /* write tls thread reg 2 */
+ mcr CP15_TPIDRURO(r3) /* write tls thread reg 3 */
add r3, r7, #PCB_R4
ldmia r3, {r4-r12, sp, pc}
OpenPOWER on IntegriCloud