]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
arm64/sve: Preserve SVE registers around kernel-mode NEON use
authorDave Martin <Dave.Martin@arm.com>
Tue, 31 Oct 2017 15:51:11 +0000 (15:51 +0000)
committerWill Deacon <will.deacon@arm.com>
Fri, 3 Nov 2017 15:24:18 +0000 (15:24 +0000)
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>
arch/arm64/kernel/fpsimd.c

index 715398e91d65e450d77be163e8d4153678911baf..741fbbfa1265be19dec98b0c9871d1731d810e08 100644 (file)
@@ -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);