Re: [PATCH v3 03/17] arm64: Turn kaslr_feature_override into a generic SW feature override

Shaoqin Huang
2023-06-14T07:28:04Z

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;
> }

--
Shaoqin