]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/fpsimd: ptrace: Save task state before generating SVE header
authorMark Rutland <mark.rutland@arm.com>
Thu, 8 May 2025 13:26:36 +0000 (14:26 +0100)
committerWill Deacon <will@kernel.org>
Thu, 8 May 2025 14:29:11 +0000 (15:29 +0100)
As sve_init_header_from_task() consumes the saved value of PSTATE.SM and
the saved fp_type, both must be saved before the header is generated.

When generating a coredump for the current task, sve_get_common() calls
sve_init_header_from_task() before saving the task's state. Consequently
the header may be bogus, and the contents of the regset may be
misleading.

Fix this by saving the task's state before generting the header.

Fixes: e12310a0d30f ("arm64/sme: Implement ptrace support for streaming mode SVE registers")
Fixes: b017a0cea627 ("arm64/ptrace: Use saved floating point state type to determine SVE layout")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: David Spickett <david.spickett@arm.com>
Cc: Luis Machado <luis.machado@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20250508132644.1395904-17-mark.rutland@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/ptrace.c

index bdba106a4cf294ce92b8c50cd00d6d608c4ab278..67f3843de51f58d7d0e288ae33dd9aec34252bab 100644 (file)
@@ -820,15 +820,15 @@ static int sve_get_common(struct task_struct *target,
        unsigned int vq;
        unsigned long start, end;
 
+       if (target == current)
+               fpsimd_preserve_current_state();
+
        /* Header */
        sve_init_header_from_task(&header, target, type);
        vq = sve_vq_from_vl(header.vl);
 
        membuf_write(&to, &header, sizeof(header));
 
-       if (target == current)
-               fpsimd_preserve_current_state();
-
        BUILD_BUG_ON(SVE_PT_FPSIMD_OFFSET != sizeof(header));
        BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));