Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Catalin Marinas:
"More SVE/SME fixes for ptrace() and for the (potentially future) case
where SME is implemented in hardware without SVE support"

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
arm64/fpsimd: Sync and zero pad FPSIMD state for streaming SVE
arm64/fpsimd: Sync FPSIMD state with SVE for SME only systems
arm64/ptrace: Don't enable SVE when setting streaming SVE
arm64/ptrace: Flush FP state when setting ZT0
arm64/fpsimd: Clear SME state in the target task when setting the VL

+12 -7
+5 -4
arch/arm64/kernel/fpsimd.c
··· 679 679 void *sst = task->thread.sve_state; 680 680 struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state; 681 681 682 - if (!system_supports_sve()) 682 + if (!system_supports_sve() && !system_supports_sme()) 683 683 return; 684 684 685 685 vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread)); ··· 705 705 unsigned int i; 706 706 __uint128_t const *p; 707 707 708 - if (!system_supports_sve()) 708 + if (!system_supports_sve() && !system_supports_sme()) 709 709 return; 710 710 711 711 vl = thread_get_cur_vl(&task->thread); ··· 835 835 void *sst = task->thread.sve_state; 836 836 struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state; 837 837 838 - if (!test_tsk_thread_flag(task, TIF_SVE)) 838 + if (!test_tsk_thread_flag(task, TIF_SVE) && 839 + !thread_sm_enabled(&task->thread)) 839 840 return; 840 841 841 842 vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread)); ··· 910 909 */ 911 910 task->thread.svcr &= ~(SVCR_SM_MASK | 912 911 SVCR_ZA_MASK); 913 - clear_thread_flag(TIF_SME); 912 + clear_tsk_thread_flag(task, TIF_SME); 914 913 free_sme = true; 915 914 } 916 915 }
+7 -3
arch/arm64/kernel/ptrace.c
··· 932 932 /* 933 933 * Ensure target->thread.sve_state is up to date with target's 934 934 * FPSIMD regs, so that a short copyin leaves trailing 935 - * registers unmodified. Always enable SVE even if going into 936 - * streaming mode. 935 + * registers unmodified. Only enable SVE if we are 936 + * configuring normal SVE, a system with streaming SVE may not 937 + * have normal SVE. 937 938 */ 938 939 fpsimd_sync_to_sve(target); 939 - set_tsk_thread_flag(target, TIF_SVE); 940 + if (type == ARM64_VEC_SVE) 941 + set_tsk_thread_flag(target, TIF_SVE); 940 942 target->thread.fp_type = FP_STATE_SVE; 941 943 942 944 BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header)); ··· 1181 1179 0, ZT_SIG_REG_BYTES); 1182 1180 if (ret == 0) 1183 1181 target->thread.svcr |= SVCR_ZA_MASK; 1182 + 1183 + fpsimd_flush_task_state(target); 1184 1184 1185 1185 return ret; 1186 1186 }