[PATCH] KVM: arm64: vgic-v3: Restrict SEIS workaround to known broken systems

Ard Biesheuvel ardb at kernel.org
Sat Jan 22 03:14:08 PST 2022


On Sat, 22 Jan 2022 at 11:39, Marc Zyngier <maz at kernel.org> wrote:
>
> Contrary to what df652bcf1136 ("KVM: arm64: vgic-v3: Work around GICv3
> locally generated SErrors") was asserting, there is at least one other
> system out there (Cavium ThunderX2) implementing SEIS, and not in
> an obviously broken way.
>
> So instead of imposing the M1 workaround on an innocent bystander,
> let's limit it to the two known broken Apple implementations.
>
> Fixes: df652bcf1136 ("KVM: arm64: vgic-v3: Work around GICv3 locally generated SErrors")
> Reported-by: Ard Biesheuvel <ardb at kernel.org>
> Signed-off-by: Marc Zyngier <maz at kernel.org>

Thanks for the fix.

Tested-by: Ard Biesheuvel <ardb at kernel.org>
Acked-by: Ard Biesheuvel <ardb at kernel.org>

One nit below.

> ---
>  arch/arm64/kvm/hyp/vgic-v3-sr.c |  3 +++
>  arch/arm64/kvm/vgic/vgic-v3.c   | 17 +++++++++++++++--
>  2 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> index 20db2f281cf2..4fb419f7b8b6 100644
> --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
> +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> @@ -983,6 +983,9 @@ static void __vgic_v3_read_ctlr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
>         val = ((vtr >> 29) & 7) << ICC_CTLR_EL1_PRI_BITS_SHIFT;
>         /* IDbits */
>         val |= ((vtr >> 23) & 7) << ICC_CTLR_EL1_ID_BITS_SHIFT;
> +       /* SEIS */
> +       if (kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK)
> +               val |= BIT(ICC_CTLR_EL1_SEIS_SHIFT);
>         /* A3V */
>         val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT;
>         /* EOImode */
> diff --git a/arch/arm64/kvm/vgic/vgic-v3.c b/arch/arm64/kvm/vgic/vgic-v3.c
> index 78cf674c1230..d34a795f730c 100644
> --- a/arch/arm64/kvm/vgic/vgic-v3.c
> +++ b/arch/arm64/kvm/vgic/vgic-v3.c
> @@ -609,6 +609,18 @@ static int __init early_gicv4_enable(char *buf)
>  }
>  early_param("kvm-arm.vgic_v4_enable", early_gicv4_enable);
>
> +static struct midr_range broken_seis[] = {

Can this be const?

> +       MIDR_ALL_VERSIONS(MIDR_APPLE_M1_ICESTORM),
> +       MIDR_ALL_VERSIONS(MIDR_APPLE_M1_FIRESTORM),
> +       {},
> +};
> +
> +static bool vgic_v3_broken_seis(void)
> +{
> +       return ((kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK) &&
> +               is_midr_in_range_list(read_cpuid_id(), broken_seis));
> +}
> +
>  /**
>   * vgic_v3_probe - probe for a VGICv3 compatible interrupt controller
>   * @info:      pointer to the GIC description
> @@ -676,9 +688,10 @@ int vgic_v3_probe(const struct gic_kvm_info *info)
>                 group1_trap = true;
>         }
>
> -       if (kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK) {
> -               kvm_info("GICv3 with locally generated SEI\n");
> +       if (vgic_v3_broken_seis()) {
> +               kvm_info("GICv3 with broken locally generated SEI\n");
>
> +               kvm_vgic_global_state.ich_vtr_el2 &= ~ICH_VTR_SEIS_MASK;
>                 group0_trap = true;
>                 group1_trap = true;
>                 if (ich_vtr_el2 & ICH_VTR_TDS_MASK)
> --
> 2.34.1
>



More information about the linux-arm-kernel mailing list