Skip to content

Commit 99255a2

Browse files
brooniegregkh
authored andcommitted
arm64/ptrace: Don't enable SVE when setting streaming SVE
commit 045aecd upstream. Systems which implement SME without also implementing SVE are architecturally valid but were not initially supported by the kernel, unfortunately we missed one issue in the ptrace code. The SVE register setting code is shared between SVE and streaming mode SVE. When we set full SVE register state we currently enable TIF_SVE unconditionally, in the case where streaming SVE is being configured on a system that supports vanilla SVE this is not an issue since we always initialise enough state for both vector lengths but on a system which only support SME it will result in us attempting to restore the SVE vector length after having set streaming SVE registers. Fix this by making the enabling of SVE conditional on setting SVE vector state. If we set streaming SVE state and SVE was not already enabled this will result in a SVE access trap on next use of normal SVE, this will cause us to flush our register state but this is fine since the only way to trigger a SVE access trap would be to exit streaming mode which will cause the in register state to be flushed anyway. Fixes: e12310a ("arm64/sme: Implement ptrace support for streaming mode SVE registers") Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20230803-arm64-fix-ptrace-ssve-no-sve-v1-1-49df214bfb3e@kernel.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> [Fix up backport -- broonie] Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent c2fdf82 commit 99255a2

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

arch/arm64/kernel/ptrace.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -937,11 +937,13 @@ static int sve_set_common(struct task_struct *target,
937937
/*
938938
* Ensure target->thread.sve_state is up to date with target's
939939
* FPSIMD regs, so that a short copyin leaves trailing
940-
* registers unmodified. Always enable SVE even if going into
941-
* streaming mode.
940+
* registers unmodified. Only enable SVE if we are
941+
* configuring normal SVE, a system with streaming SVE may not
942+
* have normal SVE.
942943
*/
943944
fpsimd_sync_to_sve(target);
944-
set_tsk_thread_flag(target, TIF_SVE);
945+
if (type == ARM64_VEC_SVE)
946+
set_tsk_thread_flag(target, TIF_SVE);
945947

946948
BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));
947949
start = SVE_PT_SVE_OFFSET;

0 commit comments

Comments
 (0)