FAILED: patch "[PATCH] arm64: Filter out SME hwcaps when FEAT_SME isn't implemented" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x a75ad2fc76a2ab70817c7eed3163b66ea84ca6ac
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025071235-trowel-void-fe33@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a75ad2fc76a2ab70817c7eed3163b66ea84ca6ac Mon Sep 17 00:00:00 2001
From: Mark Brown <[email protected]>
Date: Fri, 20 Jun 2025 12:28:48 +0100
Subject: [PATCH] arm64: Filter out SME hwcaps when FEAT_SME isn't implemented
We have a number of hwcaps for various SME subfeatures enumerated via ID_AA64SMFR0_EL1. Currently we advertise these without cross checking against the main SME feature, advertised in ID_AA64PFR1_EL1.SME which means that if the two are out of sync userspace can see a confusing situation where SME subfeatures are advertised without the base SME hwcap. This can be readily triggered by using the arm64.nosme override which only masks out ID_AA64PFR1_EL1.SME, and there have also been reports of VMMs which do the same thing.
Fix this as we did previously for SVE in 064737920bdb ("arm64: Filter out SVE hwcaps when FEAT_SVE isn't implemented") by filtering out the SME subfeature hwcaps when FEAT_SME is not present.
arch/arm64/kernel/cpufeature.c +32 -25
@@ -3135,6 +3135,13 @@ static bool has_sve_feature(const struct arm64_cpu_capabilities *cap, int scope) }#endif +#ifdef CONFIG_ARM64_SME +static bool has_sme_feature (const struct arm64_cpu_capabilities *cap,int scope) +{ +return system_supports_sme () &&has_user_cpuid_feature (cap, scope); +} +#endif +static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {HWCAP_CAP (ID_AA64ISAR0_EL1 ,AES ,PMULL ,CAP_HWCAP ,KERNEL_HWCAP_PMULL ),HWCAP_CAP (ID_AA64ISAR0_EL1 ,AES ,AES ,CAP_HWCAP ,KERNEL_HWCAP_AES ),
@@ -3223,31 +3230,31 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = { HWCAP_CAP(ID_AA64ISAR2_EL1, BC, IMP, CAP_HWCAP, KERNEL_HWCAP_HBC),#ifdef CONFIG_ARM64_SME HWCAP_CAP (ID_AA64PFR1_EL1 ,SME ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,FA64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_FA64 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 , LUTv2,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_LUTV2 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 , SMEver, SME2p2,CAP_HWCAP ,KERNEL_HWCAP_SME2P2 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 , SMEver, SME2p1,CAP_HWCAP ,KERNEL_HWCAP_SME2P1 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 , SMEver,SME2 ,CAP_HWCAP ,KERNEL_HWCAP_SME2 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,I16I64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I16I64 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F64F64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F64F64 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,I16I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I16I32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,B16B16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_B16B16 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F16F16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F16F16 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F8F16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F8F16 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F8F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F8F32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,I8I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I8I32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F16F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F16F32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,B16F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_B16F32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,BI32I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_BI32I32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,F32F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F32F32 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,SF8FMA ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8FMA ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,SF8DP4 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8DP4 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,SF8DP2 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8DP2 ), -HWCAP_CAP (ID_AA64SMFR0_EL1 , SBitPerm,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SBITPERM ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,AES ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_AES ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,SFEXPA ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SFEXPA ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,STMOP ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_STMOP ), -HWCAP_CAP (ID_AA64SMFR0_EL1 ,SMOP4 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SMOP4 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,FA64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_FA64 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 , LUTv2,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_LUTV2 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 , SMEver, SME2p2,CAP_HWCAP ,KERNEL_HWCAP_SME2P2 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 , SMEver, SME2p1,CAP_HWCAP ,KERNEL_HWCAP_SME2P1 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 , SMEver,SME2 ,CAP_HWCAP ,KERNEL_HWCAP_SME2 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,I16I64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I16I64 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F64F64 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F64F64 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,I16I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I16I32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,B16B16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_B16B16 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F16F16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F16F16 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F8F16 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F8F16 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F8F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F8F32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,I8I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_I8I32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F16F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F16F32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,B16F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_B16F32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,BI32I32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_BI32I32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,F32F32 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_F32F32 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,SF8FMA ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8FMA ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,SF8DP4 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8DP4 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,SF8DP2 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SF8DP2 ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 , SBitPerm,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SBITPERM ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,AES ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_AES ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,SFEXPA ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SFEXPA ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,STMOP ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_STMOP ), +HWCAP_CAP_MATCH_ID (has_sme_feature,ID_AA64SMFR0_EL1 ,SMOP4 ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_SME_SMOP4 ), #endif /* CONFIG_ARM64_SME */HWCAP_CAP (ID_AA64FPFR0_EL1 ,F8CVT ,IMP ,CAP_HWCAP ,KERNEL_HWCAP_F8CVT ), HWCAP_CAP(ID_AA64FPFR0_EL1, F8FMA, IMP, CAP_HWCAP, KERNEL_HWCAP_F8FMA),