summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Martin2017-10-31 16:51:11 +0100
committerWill Deacon2017-11-03 16:24:18 +0100
commit1bd3f93641ec710015fcb3badca07dacd58c91d3 (patch)
treea31ad7c9c719074a2e230a8cfdd694858aa7acf2
parentarm64/sve: Probe SVE capabilities and usable vector lengths (diff)
downloadkernel-qcow2-linux-1bd3f93641ec710015fcb3badca07dacd58c91d3.tar.gz
kernel-qcow2-linux-1bd3f93641ec710015fcb3badca07dacd58c91d3.tar.xz
kernel-qcow2-linux-1bd3f93641ec710015fcb3badca07dacd58c91d3.zip
arm64/sve: Preserve SVE registers around kernel-mode NEON use
Kernel-mode NEON will corrupt the SVE vector registers, due to the way they alias the FPSIMD vector registers in the hardware. This patch ensures that any live SVE register content for the task is saved by kernel_neon_begin(). The data will be restored in the usual way on return to userspace. Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--arch/arm64/kernel/fpsimd.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 715398e91d65..741fbbfa1265 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -886,8 +886,10 @@ void kernel_neon_begin(void)
__this_cpu_write(kernel_neon_busy, true);
/* Save unsaved task fpsimd state, if any: */
- if (current->mm && !test_and_set_thread_flag(TIF_FOREIGN_FPSTATE))
- fpsimd_save_state(&current->thread.fpsimd_state);
+ if (current->mm) {
+ task_fpsimd_save();
+ set_thread_flag(TIF_FOREIGN_FPSTATE);
+ }
/* Invalidate any task state remaining in the fpsimd regs: */
__this_cpu_write(fpsimd_last_state, NULL);