arm64: Turn kaslr_feature_override into a generic SW feature override
authorMarc Zyngier <maz@kernel.org>
Fri, 9 Jun 2023 16:21:46 +0000 (17:21 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 12 Jun 2023 23:17:23 +0000 (23:17 +0000)
Disabling KASLR from the command line is implemented as a feature
override. Repaint it slightly so that it can further be used as
more generic infrastructure for SW override purposes.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20230609162200.2024064-4-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/cpufeature.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/idreg-override.c
arch/arm64/kernel/kaslr.c

index 6bf013f..bc10098 100644 (file)
@@ -15,6 +15,8 @@
 #define MAX_CPU_FEATURES       128
 #define cpu_feature(x)         KERNEL_HWCAP_ ## x
 
+#define ARM64_SW_FEATURE_OVERRIDE_NOKASLR      0
+
 #ifndef __ASSEMBLY__
 
 #include <linux/bug.h>
@@ -925,6 +927,8 @@ extern struct arm64_ftr_override id_aa64smfr0_override;
 extern struct arm64_ftr_override id_aa64isar1_override;
 extern struct arm64_ftr_override id_aa64isar2_override;
 
+extern struct arm64_ftr_override arm64_sw_feature_override;
+
 u32 get_kvm_ipa_limit(void);
 void dump_cpu_features(void);
 
index 7d7128c..2d2b7bb 100644 (file)
@@ -664,6 +664,8 @@ struct arm64_ftr_override __ro_after_init id_aa64smfr0_override;
 struct arm64_ftr_override __ro_after_init id_aa64isar1_override;
 struct arm64_ftr_override __ro_after_init id_aa64isar2_override;
 
+struct arm64_ftr_override arm64_sw_feature_override;
+
 static const struct __ftr_reg_entry {
        u32                     sys_id;
        struct arm64_ftr_reg    *reg;
index 370ab84..8c93b61 100644 (file)
@@ -138,15 +138,11 @@ static const struct ftr_set_desc smfr0 __initconst = {
        },
 };
 
-extern struct arm64_ftr_override kaslr_feature_override;
-
-static const struct ftr_set_desc kaslr __initconst = {
-       .name           = "kaslr",
-#ifdef CONFIG_RANDOMIZE_BASE
-       .override       = &kaslr_feature_override,
-#endif
+static const struct ftr_set_desc sw_features __initconst = {
+       .name           = "arm64_sw",
+       .override       = &arm64_sw_feature_override,
        .fields         = {
-               FIELD("disabled", 0, NULL),
+               FIELD("nokaslr", ARM64_SW_FEATURE_OVERRIDE_NOKASLR, NULL),
                {}
        },
 };
@@ -158,7 +154,7 @@ static const struct ftr_set_desc * const regs[] __initconst = {
        &isar1,
        &isar2,
        &smfr0,
-       &kaslr,
+       &sw_features,
 };
 
 static const struct {
@@ -175,7 +171,7 @@ static const struct {
          "id_aa64isar1.api=0 id_aa64isar1.apa=0 "
          "id_aa64isar2.gpa3=0 id_aa64isar2.apa3=0"        },
        { "arm64.nomte",                "id_aa64pfr1.mte=0" },
-       { "nokaslr",                    "kaslr.disabled=1" },
+       { "nokaslr",                    "arm64_sw.nokaslr=1" },
 };
 
 static int __init parse_nokaslr(char *unused)
index e7477f2..5d4ce7f 100644 (file)
@@ -23,8 +23,6 @@
 u64 __ro_after_init module_alloc_base;
 u16 __initdata memstart_offset_seed;
 
-struct arm64_ftr_override kaslr_feature_override __initdata;
-
 static int __init kaslr_init(void)
 {
        u64 module_range;
@@ -36,7 +34,9 @@ static int __init kaslr_init(void)
         */
        module_alloc_base = (u64)_etext - MODULES_VSIZE;
 
-       if (kaslr_feature_override.val & kaslr_feature_override.mask & 0xf) {
+       if (cpuid_feature_extract_unsigned_field(arm64_sw_feature_override.val &
+                                                arm64_sw_feature_override.mask,
+                                                ARM64_SW_FEATURE_OVERRIDE_NOKASLR)) {
                pr_info("KASLR disabled on command line\n");
                return 0;
        }