[PATCH v2 05/23] arm64: cpufeature: Check arm64_ftr_regs[] before the first store

Jinjie Ruan ruanjinjie at huawei.com
Fri Oct 9 19:49:30 PDT 2026



在 2026/10/9 18:07, Will Deacon 写道:
> From: Fuad Tabba <fuad.tabba at linux.dev>
> 
> sort_ftr_regs() sorts nothing. It checks that arm64_ftr_regs[] is in
> sys_id order, which the binary search in get_arm64_ftr_reg() relies on,
> and that no register's fields overlap. It runs at the top of

It also checks whether the register field extends beyond 64 bits

> init_cpu_features(), after the boot CPU's __cpuinfo_store_cpu(). A
> subsequent patch makes __cpuinfo_store_cpu() look registers up in the
> table.
> 
> Rename it validate_ftr_regs() and call it from smp_prepare_boot_cpu(),
> ahead of cpuinfo_store_boot_cpu().
> 
> Suggested-by: Will Deacon <will at kernel.org>
> Signed-off-by: Fuad Tabba <fuad.tabba at linux.dev>
> Signed-off-by: Will Deacon <will at kernel.org>
> ---
>  arch/arm64/include/asm/cpu.h   | 1 +
>  arch/arm64/kernel/cpufeature.c | 5 +----
>  arch/arm64/kernel/smp.c        | 2 ++
>  3 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/cpu.h b/arch/arm64/include/asm/cpu.h
> index 3c008821219c..f332fbd8e46d 100644
> --- a/arch/arm64/include/asm/cpu.h
> +++ b/arch/arm64/include/asm/cpu.h
> @@ -75,6 +75,7 @@ DECLARE_PER_CPU(struct cpuinfo_arm64, cpu_data);
>  void cpuinfo_store_cpu(void);
>  void __init cpuinfo_store_boot_cpu(void);
>  
> +void __init validate_ftr_regs(void);
>  void __init init_cpu_features(struct cpuinfo_arm64 *info);
>  void update_cpu_features(int cpu, struct cpuinfo_arm64 *info,
>  				 struct cpuinfo_arm64 *boot);
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index 32102c3912fa..727e1665c987 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -962,7 +962,7 @@ s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
>  	return ret;
>  }
>  
> -static void __init sort_ftr_regs(void)
> +void __init validate_ftr_regs(void)
>  {
>  	unsigned int i;
>  
> @@ -1207,9 +1207,6 @@ bool gmid_el1_accessible(const struct cpuinfo_arm64 *info)
>  
>  void __init init_cpu_features(struct cpuinfo_arm64 *info)
>  {
> -	/* Before we start using the tables, make sure it is sorted */
> -	sort_ftr_regs();
> -
>  	init_cpu_ftr_reg(SYS_CTR_EL0, info->reg_ctr);
>  	init_cpu_ftr_reg(SYS_DCZID_EL0, info->reg_dczid);
>  	init_cpu_ftr_reg(SYS_CNTFRQ_EL0, info->reg_cntfrq);
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index a61dc3016a11..eac217b9ebf1 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -455,6 +455,8 @@ void __init smp_prepare_boot_cpu(void)
>  	 */
>  	set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
>  
> +	/* Check arm64_ftr_regs[] before anything looks registers up in it. */
> +	validate_ftr_regs();

Reviewed-by: Jinjie Ruan <ruanjinjie at huawei.com>

>  	cpuinfo_store_boot_cpu();
>  	setup_boot_cpu_features();
>  

-- 
Best regards,
Jinjie




More information about the linux-arm-kernel mailing list