]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Zero ID_AA64PFR0_EL1.GIC when no GICv3 is presented to the guest
authorMarc Zyngier <maz@kernel.org>
Tue, 27 Aug 2024 15:25:11 +0000 (16:25 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 27 Aug 2024 17:32:55 +0000 (18:32 +0100)
In order to be consistent, we shouldn't advertise a GICv3 when none
is actually usable by the guest.

Wipe the feature when these conditions apply, and allow the field
to be written from userspace.

This now allows us to rewrite the kvm_has_gicv3 helper() in terms
of kvm_has_feat(), given that it is always evaluated at runtime.

Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240827152517.3909653-6-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/sys_regs.c
arch/arm64/kvm/vgic/vgic.h

index bc2d54da38279d333bdc9e8acf1c8a211f2fac4a..e9d8e916e3af498443a7e82127b893e74a30fab5 100644 (file)
@@ -2365,7 +2365,6 @@ static const struct sys_reg_desc sys_reg_descs[] = {
                   ID_AA64PFR0_EL1_MPAM |
                   ID_AA64PFR0_EL1_SVE |
                   ID_AA64PFR0_EL1_RAS |
-                  ID_AA64PFR0_EL1_GIC |
                   ID_AA64PFR0_EL1_AdvSIMD |
                   ID_AA64PFR0_EL1_FP), },
        ID_SANITISED(ID_AA64PFR1_EL1),
@@ -4634,6 +4633,13 @@ int kvm_finalize_sys_regs(struct kvm_vcpu *vcpu)
 
        guard(mutex)(&kvm->arch.config_lock);
 
+       if (!(static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif) &&
+             irqchip_in_kernel(kvm) &&
+             kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3)) {
+               kvm->arch.id_regs[IDREG_IDX(SYS_ID_AA64PFR0_EL1)] &= ~ID_AA64PFR0_EL1_GIC_MASK;
+               kvm->arch.id_regs[IDREG_IDX(SYS_ID_PFR1_EL1)] &= ~ID_PFR1_EL1_GIC_MASK;
+       }
+
        if (vcpu_has_nv(vcpu)) {
                int ret = kvm_init_nv_sysregs(kvm);
                if (ret)
index c72c38b442340fdb6eac2a7936e04e4258b1091e..f2486b4d9f95667338e58c20b0327348574509fc 100644 (file)
@@ -350,9 +350,7 @@ void vcpu_set_ich_hcr(struct kvm_vcpu *vcpu);
 
 static inline bool kvm_has_gicv3(struct kvm *kvm)
 {
-       return (static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif) &&
-               irqchip_in_kernel(kvm) &&
-               kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3);
+       return kvm_has_feat(kvm, ID_AA64PFR0_EL1, GIC, IMP);
 }
 
 #endif