aboutsummaryrefslogtreecommitdiffstats
diff options
authorMark Rutland <mark.rutland@arm.com>2025-05-06 17:39:48 +0100
committerMark Rutland <mark.rutland@arm.com>2025-05-08 14:02:52 +0100
commit855996d7571695c3ce3c0114cf2eb9226d228c15 (patch)
tree74a82ccc6a77cce546ec955c83dbc353d849f4f4
parentb56e1013a882f18dc7c95d4d7f73b39a98600421 (diff)
downloadlinux-arm64/fpsimd/sme-fixes.tar.gz
HACK: sanity checkarm64/fpsimd/sme-fixes
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
-rw-r--r--arch/arm64/kernel/fpsimd.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 9c0d1068e7f286..8cf0e0422ad2db 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -343,6 +343,27 @@ void task_set_vl_onexec(struct task_struct *task, enum vec_type type,
* not vector length dependent.
*/
+static void sanity_check_task_fpsimd_state(struct task_struct *task)
+{
+ WARN_ONCE(test_tsk_thread_flag(task, TIF_SVE) && !task->thread.sve_state,
+ "Task %p has TIF_SVE but no sve_state\n", task);
+
+ WARN_ONCE(test_tsk_thread_flag(task, TIF_SME) && !task->thread.sve_state,
+ "Task %p has TIF_SME but no sve_state\n", task);
+
+ WARN_ONCE(test_tsk_thread_flag(task, TIF_SME) && !task->thread.sme_state,
+ "Task %p has TIF_SME but no sme_state\n", task);
+
+ WARN_ONCE(thread_sm_enabled(&task->thread) && task->thread.fp_type == FP_STATE_FPSIMD,
+ "Task %p has PSTATE.SM set in FPSIMD format\n", task);
+
+ WARN_ONCE(thread_sm_enabled(&task->thread) && !test_tsk_thread_flag(task, TIF_SME),
+ "Task %p has PSTATE.SM set without TIF_SME\n", task);
+
+ WARN_ONCE(thread_za_enabled(&task->thread) && !test_tsk_thread_flag(task, TIF_SME),
+ "Task %p has PSTATE.ZA set without TIF_SME\n", task);
+}
+
/*
* Update current's FPSIMD/SVE registers from thread_struct.
*
@@ -359,6 +380,8 @@ static void task_fpsimd_load(void)
WARN_ON(preemptible());
WARN_ON(test_thread_flag(TIF_KERNEL_FPSTATE));
+ sanity_check_task_fpsimd_state(current);
+
if (system_supports_sve() || system_supports_sme()) {
switch (current->thread.fp_type) {
case FP_STATE_FPSIMD: