[PATCH v8 5/6] smccc/kvm_guest: Enable errata based on implementation CPUs
Marc Zyngier
maz at kernel.org
Mon Aug 31 01:02:20 PDT 2026
On Mon, 31 Aug 2026 05:46:19 +0100,
Khushit Shah <khushit.shah at nutanix.com> wrote:
>
>
>
> > On 21 Feb 2025, at 7:32 PM, Shameer Kolothum <shameerali.kolothum.thodi at huawei.com> wrote:
> >
> > Retrieve any migration target implementation CPUs using the hypercall
> > and enable associated errata.
> >
> > Reviewed-by: Cornelia Huck <cohuck at redhat.com>
> > Reviewed-by: Sebastian Ott <sebott at redhat.com>
> > Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi at huawei.com>
> > ---
> > arch/arm64/include/asm/cputype.h | 7 ++++
> > arch/arm64/include/asm/hypervisor.h | 1 +
> > arch/arm64/kernel/cpu_errata.c | 45 +++++++++++++++++---
> > arch/arm64/kernel/cpufeature.c | 2 +
> > drivers/firmware/smccc/kvm_guest.c | 64 +++++++++++++++++++++++++++++
> > 5 files changed, 114 insertions(+), 5 deletions(-)
> >
> > diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
> > index ccb4a155d118..cc2d58141be1 100644
> > --- a/arch/arm64/include/asm/cputype.h
> > +++ b/arch/arm64/include/asm/cputype.h
> > @@ -276,6 +276,13 @@ static inline bool midr_is_cpu_model_range(u32 midr, u32 model, u32 rv_min,
> > return _model == model && rv >= rv_min && rv <= rv_max;
> > }
> >
> > +struct target_impl_cpu {
> > + u64 midr;
> > + u64 revidr;
> > + u64 aidr;
> > +};
> > +
> > +bool cpu_errata_set_target_impl(u64 num, void *impl_cpus);
> > bool is_midr_in_range_list(struct midr_range const *ranges);
> >
> > static inline u64 __attribute_const__ read_cpuid_mpidr(void)
> > diff --git a/arch/arm64/include/asm/hypervisor.h b/arch/arm64/include/asm/hypervisor.h
> > index 409e239834d1..a12fd897c877 100644
> > --- a/arch/arm64/include/asm/hypervisor.h
> > +++ b/arch/arm64/include/asm/hypervisor.h
> > @@ -6,6 +6,7 @@
> >
> > void kvm_init_hyp_services(void);
> > bool kvm_arm_hyp_service_available(u32 func_id);
> > +void kvm_arm_target_impl_cpu_init(void);
> >
> > #ifdef CONFIG_ARM_PKVM_GUEST
> > void pkvm_init_hyp_services(void);
> > diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
> > index 1f51cf6378c5..66869d81c3d5 100644
> > --- a/arch/arm64/kernel/cpu_errata.c
> > +++ b/arch/arm64/kernel/cpu_errata.c
> > @@ -14,10 +14,34 @@
> > #include <asm/kvm_asm.h>
> > #include <asm/smp_plat.h>
> >
> > +static u64 target_impl_cpu_num;
> > +static struct target_impl_cpu *target_impl_cpus;
> > +
> > +bool cpu_errata_set_target_impl(u64 num, void *impl_cpus)
> > +{
> > + if (target_impl_cpu_num || !num || !impl_cpus)
> > + return false;
> > +
> > + target_impl_cpu_num = num;
> > + target_impl_cpus = impl_cpus;
> > + return true;
> > +}
> > +
> > static inline bool is_midr_in_range(struct midr_range const *range)
> > {
> > - return midr_is_cpu_model_range(read_cpuid_id(), range->model,
> > - range->rv_min, range->rv_max);
> > + int i;
> > +
> > + if (!target_impl_cpu_num)
> > + return midr_is_cpu_model_range(read_cpuid_id(), range->model,
> > + range->rv_min, range->rv_max);
> > +
> > + for (i = 0; i < target_impl_cpu_num; i++) {
> > + if (midr_is_cpu_model_range(target_impl_cpus[i].midr,
> > + range->model,
> > + range->rv_min, range->rv_max))
> > + return true;
> > + }
> > + return false;
> > }
> >
> > bool is_midr_in_range_list(struct midr_range const *ranges)
> > @@ -47,9 +71,20 @@ __is_affected_midr_range(const struct arm64_cpu_capabilities *entry,
> > static bool __maybe_unused
> > is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
> > {
> > - WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
> > - return __is_affected_midr_range(entry, read_cpuid_id(),
> > - read_cpuid(REVIDR_EL1));
> > + int i;
> > +
> > + if (!target_impl_cpu_num) {
> > + WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
> > + return __is_affected_midr_range(entry, read_cpuid_id(),
> > + read_cpuid(REVIDR_EL1));
> > + }
> > +
> > + for (i = 0; i < target_impl_cpu_num; i++) {
> > + if (__is_affected_midr_range(entry, target_impl_cpus[i].midr,
> > + target_impl_cpus[i].midr))
> Typo? Shouldn't the second arg be target_impl_cpus[i].revidr?
Most probably. Please send a fix.
M.
--
Jazz isn't dead. It just smells funny.
More information about the linux-arm-kernel
mailing list