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>
This commit is contained in:
parent
2e0f2478ea
commit
1bd3f93641
|
@ -886,8 +886,10 @@ void kernel_neon_begin(void)
|
||||||
__this_cpu_write(kernel_neon_busy, true);
|
__this_cpu_write(kernel_neon_busy, true);
|
||||||
|
|
||||||
/* Save unsaved task fpsimd state, if any: */
|
/* Save unsaved task fpsimd state, if any: */
|
||||||
if (current->mm && !test_and_set_thread_flag(TIF_FOREIGN_FPSTATE))
|
if (current->mm) {
|
||||||
fpsimd_save_state(¤t->thread.fpsimd_state);
|
task_fpsimd_save();
|
||||||
|
set_thread_flag(TIF_FOREIGN_FPSTATE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Invalidate any task state remaining in the fpsimd regs: */
|
/* Invalidate any task state remaining in the fpsimd regs: */
|
||||||
__this_cpu_write(fpsimd_last_state, NULL);
|
__this_cpu_write(fpsimd_last_state, NULL);
|
||||||
|
|
Loading…
Reference in New Issue