]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/fpsimd: Avoid clobbering kernel FPSIMD state with SMSTOP
authorMark Rutland <mark.rutland@arm.com>
Wed, 9 Apr 2025 16:40:04 +0000 (17:40 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 9 Apr 2025 17:06:31 +0000 (18:06 +0100)
On system with SME, a thread's kernel FPSIMD state may be erroneously
clobbered during a context switch immediately after that state is
restored. Systems without SME are unaffected.

If the CPU happens to be in streaming SVE mode before a context switch
to a thread with kernel FPSIMD state, fpsimd_thread_switch() will
restore the kernel FPSIMD state using fpsimd_load_kernel_state() while
the CPU is still in streaming SVE mode. When fpsimd_thread_switch()
subsequently calls fpsimd_flush_cpu_state(), this will execute an
SMSTOP, causing an exit from streaming SVE mode. The exit from
streaming SVE mode will cause the hardware to reset a number of
FPSIMD/SVE/SME registers, clobbering the FPSIMD state.

Fix this by calling fpsimd_flush_cpu_state() before restoring the kernel
FPSIMD state.

Fixes: e92bee9f861b ("arm64/fpsimd: Avoid erroneous elide of user state reload")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Will Deacon <will@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250409164010.3480271-8-mark.rutland@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/fpsimd.c

index b19736f354a71f41df67025bc9a40520eb9fa4d0..4a0b0bb3a3fadf54a2ba0ab80a037cf0190c6190 100644 (file)
@@ -1550,8 +1550,8 @@ void fpsimd_thread_switch(struct task_struct *next)
                fpsimd_save_user_state();
 
        if (test_tsk_thread_flag(next, TIF_KERNEL_FPSTATE)) {
-               fpsimd_load_kernel_state(next);
                fpsimd_flush_cpu_state();
+               fpsimd_load_kernel_state(next);
        } else {
                /*
                 * Fix up TIF_FOREIGN_FPSTATE to correctly describe next's