svn commit: r280402 - head/sys/arm/arm
Ian Lepore
ian at FreeBSD.org
Mon Mar 23 22:42:44 UTC 2015
Author: ian
Date: Mon Mar 23 22:42:42 2015
New Revision: 280402
URL: https://svnweb.freebsd.org/changeset/base/280402
Log:
Do not save/restore the TLS pointer on context switch for armv6. The
pointer cannot be changed directly by userland code on armv6 (it can be on
armv4), so there's no need to save/restore.
Submitted by: Michal Meloun
Modified:
head/sys/arm/arm/swtch.S
head/sys/arm/arm/sys_machdep.c
head/sys/arm/arm/vm_machdep.c
Modified: head/sys/arm/arm/swtch.S
==============================================================================
--- head/sys/arm/arm/swtch.S Mon Mar 23 21:15:07 2015 (r280401)
+++ head/sys/arm/arm/swtch.S Mon Mar 23 22:42:42 2015 (r280402)
@@ -255,7 +255,7 @@ ENTRY(cpu_switch)
mov r4, r0 /* Save the old thread. */
#ifdef ARM_TP_ADDRESS
- /* Store the old tp */
+ /* Store the old tp; userland can change it on armv4. */
ldr r3, =ARM_TP_ADDRESS
ldr r9, [r3]
str r9, [r0, #(TD_MD + MD_TP)]
@@ -272,11 +272,10 @@ ENTRY(cpu_switch)
ldr r9, [r1, #(TD_MD + MD_RAS_END)]
str r9, [r3, #8]
#else
- /* Store the old tp */
- mrc p15, 0, r9, c13, c0, 3
- str r9, [r0, #(TD_MD + MD_TP)]
-
- /* Set the new tp */
+ /*
+ * Set new tp. No need to store the old one first, userland can't
+ * change it directly on armv6.
+ */
ldr r9, [r1, #(TD_MD + MD_TP)]
mcr p15, 0, r9, c13, c0, 3
#endif
Modified: head/sys/arm/arm/sys_machdep.c
==============================================================================
--- head/sys/arm/arm/sys_machdep.c Mon Mar 23 21:15:07 2015 (r280401)
+++ head/sys/arm/arm/sys_machdep.c Mon Mar 23 22:42:42 2015 (r280402)
@@ -84,13 +84,11 @@ static int
arm32_set_tp(struct thread *td, void *args)
{
- if (td != curthread)
- td->td_md.md_tp = (register_t)args;
- else
+ td->td_md.md_tp = (register_t)args;
#ifndef ARM_TP_ADDRESS
- set_tls(args);
+ set_tls(args);
#else
- *(register_t *)ARM_TP_ADDRESS = (register_t)args;
+ *(register_t *)ARM_TP_ADDRESS = (register_t)args;
#endif
return (0);
}
@@ -99,13 +97,10 @@ static int
arm32_get_tp(struct thread *td, void *args)
{
- if (td != curthread)
- td->td_retval[0] = td->td_md.md_tp;
- else
#ifndef ARM_TP_ADDRESS
- td->td_retval[0] = (register_t)get_tls();
+ td->td_retval[0] = td->td_md.md_tp;
#else
- td->td_retval[0] = *(register_t *)ARM_TP_ADDRESS;
+ td->td_retval[0] = *(register_t *)ARM_TP_ADDRESS;
#endif
return (0);
}
Modified: head/sys/arm/arm/vm_machdep.c
==============================================================================
--- head/sys/arm/arm/vm_machdep.c Mon Mar 23 21:15:07 2015 (r280401)
+++ head/sys/arm/arm/vm_machdep.c Mon Mar 23 22:42:42 2015 (r280402)
@@ -145,7 +145,7 @@ cpu_fork(register struct thread *td1, re
#ifdef ARM_TP_ADDRESS
td2->td_md.md_tp = *(register_t *)ARM_TP_ADDRESS;
#else
- td2->td_md.md_tp = (register_t) get_tls();
+ td2->td_md.md_tp = td1->td_md.md_tp;
#endif
}
@@ -274,7 +274,7 @@ cpu_set_user_tls(struct thread *td, void
#ifdef ARM_TP_ADDRESS
*(register_t *)ARM_TP_ADDRESS = (register_t)tls_base;
#else
- set_tls((void *)tls_base);
+ set_tls(tls_base);
#endif
critical_exit();
}
More information about the svn-src-head
mailing list