diff options
author | Mark Rutland <mark.rutland@arm.com> | 2025-05-06 17:39:48 +0100 |
---|---|---|
committer | Mark Rutland <mark.rutland@arm.com> | 2025-05-08 14:02:52 +0100 |
commit | 855996d7571695c3ce3c0114cf2eb9226d228c15 (patch) | |
tree | 74a82ccc6a77cce546ec955c83dbc353d849f4f4 | |
parent | b56e1013a882f18dc7c95d4d7f73b39a98600421 (diff) | |
download | linux-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.c | 23 |
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: |