arm64: Add helpers to probe local CPU for PAC and BTI support
authorArd Biesheuvel <ardb@kernel.org>
Wed, 14 Feb 2024 12:28:59 +0000 (13:28 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 16 Feb 2024 12:42:31 +0000 (12:42 +0000)
Add some helpers that will be used by the early kernel mapping code to
check feature support on the local CPU. This permits the early kernel
mapping to be created with the right attributes, removing the need for
tearing it down and recreating it.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-58-ardb+git@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/cpufeature.h

index 03c34242bfc75858f2d86520d4bee43bfcc9530a..e3edae1825f37497dc4860a7ead444866f79647e 100644 (file)
@@ -963,6 +963,38 @@ static inline bool kaslr_disabled_cmdline(void)
 u32 get_kvm_ipa_limit(void);
 void dump_cpu_features(void);
 
+static inline bool cpu_has_bti(void)
+{
+       if (!IS_ENABLED(CONFIG_ARM64_BTI))
+               return false;
+
+       return arm64_apply_feature_override(read_cpuid(ID_AA64PFR1_EL1),
+                                           ID_AA64PFR1_EL1_BT_SHIFT, 4,
+                                           &id_aa64pfr1_override);
+}
+
+static inline bool cpu_has_pac(void)
+{
+       u64 isar1, isar2;
+
+       if (!IS_ENABLED(CONFIG_ARM64_PTR_AUTH))
+               return false;
+
+       isar1 = read_cpuid(ID_AA64ISAR1_EL1);
+       isar2 = read_cpuid(ID_AA64ISAR2_EL1);
+
+       if (arm64_apply_feature_override(isar1, ID_AA64ISAR1_EL1_APA_SHIFT, 4,
+                                        &id_aa64isar1_override))
+               return true;
+
+       if (arm64_apply_feature_override(isar1, ID_AA64ISAR1_EL1_API_SHIFT, 4,
+                                        &id_aa64isar1_override))
+               return true;
+
+       return arm64_apply_feature_override(isar2, ID_AA64ISAR2_EL1_APA3_SHIFT, 4,
+                                           &id_aa64isar2_override);
+}
+
 #endif /* __ASSEMBLY__ */
 
 #endif