[PATCH 03/20] arm64/fpsimd: signal: Clear PSTATE.SM when restoring FPSIMD frame only
Will Deacon
will at kernel.org
Wed May 7 05:46:45 PDT 2025
On Tue, May 06, 2025 at 04:25:06PM +0100, Mark Rutland wrote:
> On systems with SVE and/or SME, the kernel will always create SVE and
> FPSIMD signal frames when delivering a signal, but a user can manipulate
> signal frames such that a signal return only observes an FPSIMD signal
> frame. When this happens, restore_fpsimd_context() will restore state
> such that fp_type==FP_STATE_FPSIMD, but will leave PSTATE.SM as-is.
>
> It is possible for a user to set PSTATE.SM between syscall entry and
> execution of the sigreturn logic (e.g. via ptrace), and consequently the
> sigreturn may result in the task having PSTATE.SM==1 and
> fp_type==FP_STATE_FPSIMD.
>
> For various reasons it is not legitimate for a task to be in a state
> where PSTATE.SM==1 and fp_type==FP_STATE_FPSIMD. Portions of the user
> ABI are written with the requirement that streaming SVE state is always
> presented in SVE format rather than FPSIMD format, and as there is no
> mechanism to permit access to only the FPSIMD subset of streaming SVE
> state, streaming SVE state must always be saved and restored in SVE
> format.
>
> Fix restore_fpsimd_context() to clear PSTATE.SM when restoring an FPSIMD
> signal frame without an SVE signal frame. This matches the current
> behaviour when an SVE signal frame is present, but the SVE signal frame
> has no register payload (e.g. as is the case on SME-only systems which
> lack SVE).
>
> This change should have no effect for applications which do not alter
> signal frames (i.e. almost all applications). I do not expect
> non-{malicious,buggy} applications to hide the SVE signal frame, but
> I've chosen to clear PSTATE.SM rather than mandating the presence of an
> SVE signal frame in case there is some legacy (non-SME) usage that I am
> not currently aware of.
>
> For context, the SME handling was originally introduced in commit:
>
> 85ed24dad290 ("arm64/sme: Implement streaming SVE signal handling")
>
> ... and subsequently updated/fixed to handle SME-only systems in commits:
>
> 7dde62f0687c ("arm64/signal: Always accept SVE signal frames on SME only systems")
> f26cd7372160 ("arm64/signal: Always allocate SVE signal frames on SME only systems")
>
> Fixes: 85ed24dad290 ("arm64/sme: Implement streaming SVE signal handling")
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Marc Zyngier <maz at kernel.org>
> Cc: Mark Brown <broonie at kernel.org>
> Cc: Will Deacon <will at kernel.org>
> ---
> arch/arm64/kernel/signal.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
> index 48d3c0129dade..fdce1b856f498 100644
> --- a/arch/arm64/kernel/signal.c
> +++ b/arch/arm64/kernel/signal.c
> @@ -280,6 +280,7 @@ static int restore_fpsimd_context(struct user_ctxs *user)
> __get_user_error(fpsimd.fpcr, &(user->fpsimd->fpcr), err);
>
> clear_thread_flag(TIF_SVE);
> + current->thread.svcr &= ~SVCR_SM_MASK;
> current->thread.fp_type = FP_STATE_FPSIMD;
Hmm, I think we're preemptible here so do we need some compiler barriers
to make sure that the context-switching code doesn't see these fields in
an inconsistent state?
Will
More information about the linux-arm-kernel
mailing list