Message ID | 20230609162200.2024064-4-maz@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: Allow using VHE in the nVHE hypervisor | expand |
On Fri, Jun 09, 2023 at 05:21:46PM +0100, Marc Zyngier wrote: > diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c > index 370ab84fd06e..8c93b6198bf5 100644 > --- a/arch/arm64/kernel/idreg-override.c > +++ b/arch/arm64/kernel/idreg-override.c > @@ -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" }, > }; I think structuring it as a sw feature makes more sense and I don't think it breaks anything (as long as people only used "nokaslr"). Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> As a side note, I was wondering if we should add a SW_FIELD macro to define width of 1 for such fields (and probably the field extraction functions need some tweaking) so that we define ARM64_SW_FEATURE_OVERRIDE_* in increments of 1 rather than 4. Anyway, that's something to worry if we get too many such software features.
On 6/10/23 00:21, Marc Zyngier wrote: > 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: Shaoqin Huang <shahuang@redhat.com> > --- > arch/arm64/include/asm/cpufeature.h | 4 ++++ > arch/arm64/kernel/cpufeature.c | 2 ++ > arch/arm64/kernel/idreg-override.c | 16 ++++++---------- > arch/arm64/kernel/kaslr.c | 6 +++--- > 4 files changed, 15 insertions(+), 13 deletions(-) > > diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h > index 6bf013fb110d..bc1009890180 100644 > --- a/arch/arm64/include/asm/cpufeature.h > +++ b/arch/arm64/include/asm/cpufeature.h > @@ -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); > > diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c > index 7d7128c65161..2d2b7bb5fa0c 100644 > --- a/arch/arm64/kernel/cpufeature.c > +++ b/arch/arm64/kernel/cpufeature.c > @@ -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; > diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c > index 370ab84fd06e..8c93b6198bf5 100644 > --- a/arch/arm64/kernel/idreg-override.c > +++ b/arch/arm64/kernel/idreg-override.c > @@ -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) > diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c > index e7477f21a4c9..5d4ce7f5f157 100644 > --- a/arch/arm64/kernel/kaslr.c > +++ b/arch/arm64/kernel/kaslr.c > @@ -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; > }
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index 6bf013fb110d..bc1009890180 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h @@ -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); diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 7d7128c65161..2d2b7bb5fa0c 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -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; diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c index 370ab84fd06e..8c93b6198bf5 100644 --- a/arch/arm64/kernel/idreg-override.c +++ b/arch/arm64/kernel/idreg-override.c @@ -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) diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c index e7477f21a4c9..5d4ce7f5f157 100644 --- a/arch/arm64/kernel/kaslr.c +++ b/arch/arm64/kernel/kaslr.c @@ -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; }
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> --- arch/arm64/include/asm/cpufeature.h | 4 ++++ arch/arm64/kernel/cpufeature.c | 2 ++ arch/arm64/kernel/idreg-override.c | 16 ++++++---------- arch/arm64/kernel/kaslr.c | 6 +++--- 4 files changed, 15 insertions(+), 13 deletions(-)