Commit 18011eac authored by Will Deacon's avatar Will Deacon

arm64: tls: Avoid unconditional zeroing of tpidrro_el0 for native tasks

When unmapping the kernel at EL0, we use tpidrro_el0 as a scratch register
during exception entry from native tasks and subsequently zero it in
the kernel_ventry macro. We can therefore avoid zeroing tpidrro_el0
in the context-switch path for native tasks using the entry trampoline.
Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
Tested-by: default avatarLaura Abbott <labbott@redhat.com>
Tested-by: default avatarShanker Donthineni <shankerd@codeaurora.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent d1777e68
...@@ -370,16 +370,14 @@ void tls_preserve_current_state(void) ...@@ -370,16 +370,14 @@ void tls_preserve_current_state(void)
static void tls_thread_switch(struct task_struct *next) static void tls_thread_switch(struct task_struct *next)
{ {
unsigned long tpidr, tpidrro;
tls_preserve_current_state(); tls_preserve_current_state();
tpidr = *task_user_tls(next); if (is_compat_thread(task_thread_info(next)))
tpidrro = is_compat_thread(task_thread_info(next)) ? write_sysreg(next->thread.tp_value, tpidrro_el0);
next->thread.tp_value : 0; else if (!arm64_kernel_unmapped_at_el0())
write_sysreg(0, tpidrro_el0);
write_sysreg(tpidr, tpidr_el0); write_sysreg(*task_user_tls(next), tpidr_el0);
write_sysreg(tpidrro, tpidrro_el0);
} }
/* Restore the UAO state depending on next's addr_limit */ /* Restore the UAO state depending on next's addr_limit */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment