Re: [PATCH v4 1/2] arm64: Apply overrides to CPU local capabilities
From: Catalin Marinas
Date: Wed Aug 26 2026 - 09:50:46 EST
On Tue, Aug 25, 2026 at 05:42:18PM +0100, Fuad Tabba wrote:
> From: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
>
> If an override has been applied, make sure we apply that for the
> secondary CPUs too, to limit the features.
>
> Signed-off-by: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
> Link: https://lore.kernel.org/all/afc5bd00-28ca-413b-b047-ee53589c285d@xxxxxxx/
> Cc: stable@xxxxxxxxxxxxxxx
> [Fuad: whitespace and comment fixes]
> Signed-off-by: Fuad Tabba <fuad.tabba@xxxxxxxxx>
For completeness, we should add:
Fixes: b3341ae0efa2 ("arm64: cpufeature: Use IDreg override in __read_sysreg_by_encoding()")
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index 9a22df0c5120f..88b15b5ef2f7f 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -1232,10 +1232,43 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
> init_cpu_ftr_reg(SYS_GMID_EL1, info->reg_gmid);
> }
>
> +/*
> + * Sanitise the register fields to clamp the values to the overrides that
> + * have been applied.
> + */
> +static u64 override_cpu_ftr_reg(struct arm64_ftr_reg *reg, u64 val)
> +{
> + const struct arm64_ftr_bits *ftrp;
> +
> + if (!reg || !reg->override->mask)
> + return val;
> +
> + for (ftrp = reg->ftr_bits; ftrp->width; ftrp++) {
> + u64 ftr_mask = arm64_ftr_mask(ftrp);
> + s64 ftr_val, ftr_ovr, ftr_safe;
> +
> + /* Skip the fields not overridden */
> + if ((ftr_mask & reg->override->mask) != ftr_mask)
> + continue;
> +
> + ftr_val = arm64_ftr_value(ftrp, val);
> + ftr_ovr = arm64_ftr_value(ftrp, reg->override->val);
> + ftr_safe = arm64_ftr_safe_value(ftrp, ftr_ovr, ftr_val);
> +
> + if (ftr_safe != ftr_val)
> + val = arm64_ftr_set_value(ftrp, val, ftr_safe);
> + }
> +
> + return val;
> +}
> +
> static void update_cpu_ftr_reg(struct arm64_ftr_reg *reg, u64 new)
> {
> const struct arm64_ftr_bits *ftrp;
>
> + /* Apply the overrides */
> + new = override_cpu_ftr_reg(reg, new);
Not sure we need this. The init value has already been clamped, made
safe, so it won't change the result.
Otherwise:
Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx>