Skip to content

Commit 0ddc312

Browse files
Marc Zyngieroupton
authored andcommitted
arm64: Turn kaslr_feature_override into a generic SW feature override
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>
1 parent 35230be commit 0ddc312

4 files changed

Lines changed: 15 additions & 13 deletions

File tree

arch/arm64/include/asm/cpufeature.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#define MAX_CPU_FEATURES 128
1616
#define cpu_feature(x) KERNEL_HWCAP_ ## x
1717

18+
#define ARM64_SW_FEATURE_OVERRIDE_NOKASLR 0
19+
1820
#ifndef __ASSEMBLY__
1921

2022
#include <linux/bug.h>
@@ -925,6 +927,8 @@ extern struct arm64_ftr_override id_aa64smfr0_override;
925927
extern struct arm64_ftr_override id_aa64isar1_override;
926928
extern struct arm64_ftr_override id_aa64isar2_override;
927929

930+
extern struct arm64_ftr_override arm64_sw_feature_override;
931+
928932
u32 get_kvm_ipa_limit(void);
929933
void dump_cpu_features(void);
930934

arch/arm64/kernel/cpufeature.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,8 @@ struct arm64_ftr_override __ro_after_init id_aa64smfr0_override;
664664
struct arm64_ftr_override __ro_after_init id_aa64isar1_override;
665665
struct arm64_ftr_override __ro_after_init id_aa64isar2_override;
666666

667+
struct arm64_ftr_override arm64_sw_feature_override;
668+
667669
static const struct __ftr_reg_entry {
668670
u32 sys_id;
669671
struct arm64_ftr_reg *reg;

arch/arm64/kernel/idreg-override.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,11 @@ static const struct ftr_set_desc smfr0 __initconst = {
138138
},
139139
};
140140

141-
extern struct arm64_ftr_override kaslr_feature_override;
142-
143-
static const struct ftr_set_desc kaslr __initconst = {
144-
.name = "kaslr",
145-
#ifdef CONFIG_RANDOMIZE_BASE
146-
.override = &kaslr_feature_override,
147-
#endif
141+
static const struct ftr_set_desc sw_features __initconst = {
142+
.name = "arm64_sw",
143+
.override = &arm64_sw_feature_override,
148144
.fields = {
149-
FIELD("disabled", 0, NULL),
145+
FIELD("nokaslr", ARM64_SW_FEATURE_OVERRIDE_NOKASLR, NULL),
150146
{}
151147
},
152148
};
@@ -158,7 +154,7 @@ static const struct ftr_set_desc * const regs[] __initconst = {
158154
&isar1,
159155
&isar2,
160156
&smfr0,
161-
&kaslr,
157+
&sw_features,
162158
};
163159

164160
static const struct {
@@ -175,7 +171,7 @@ static const struct {
175171
"id_aa64isar1.api=0 id_aa64isar1.apa=0 "
176172
"id_aa64isar2.gpa3=0 id_aa64isar2.apa3=0" },
177173
{ "arm64.nomte", "id_aa64pfr1.mte=0" },
178-
{ "nokaslr", "kaslr.disabled=1" },
174+
{ "nokaslr", "arm64_sw.nokaslr=1" },
179175
};
180176

181177
static int __init parse_nokaslr(char *unused)

arch/arm64/kernel/kaslr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
u64 __ro_after_init module_alloc_base;
2424
u16 __initdata memstart_offset_seed;
2525

26-
struct arm64_ftr_override kaslr_feature_override __initdata;
27-
2826
static int __init kaslr_init(void)
2927
{
3028
u64 module_range;
@@ -36,7 +34,9 @@ static int __init kaslr_init(void)
3634
*/
3735
module_alloc_base = (u64)_etext - MODULES_VSIZE;
3836

39-
if (kaslr_feature_override.val & kaslr_feature_override.mask & 0xf) {
37+
if (cpuid_feature_extract_unsigned_field(arm64_sw_feature_override.val &
38+
arm64_sw_feature_override.mask,
39+
ARM64_SW_FEATURE_OVERRIDE_NOKASLR)) {
4040
pr_info("KASLR disabled on command line\n");
4141
return 0;
4242
}

0 commit comments

Comments
 (0)