mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-08-22 00:42:01 +02:00
KVM: arm64: Zero ID_AA64PFR0_EL1.GIC when no GICv3 is presented to the guest
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>
This commit is contained in:
parent
795a0bbaee
commit
5cb57a1aff
|
@ -2365,7 +2365,6 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
||||||
ID_AA64PFR0_EL1_MPAM |
|
ID_AA64PFR0_EL1_MPAM |
|
||||||
ID_AA64PFR0_EL1_SVE |
|
ID_AA64PFR0_EL1_SVE |
|
||||||
ID_AA64PFR0_EL1_RAS |
|
ID_AA64PFR0_EL1_RAS |
|
||||||
ID_AA64PFR0_EL1_GIC |
|
|
||||||
ID_AA64PFR0_EL1_AdvSIMD |
|
ID_AA64PFR0_EL1_AdvSIMD |
|
||||||
ID_AA64PFR0_EL1_FP), },
|
ID_AA64PFR0_EL1_FP), },
|
||||||
ID_SANITISED(ID_AA64PFR1_EL1),
|
ID_SANITISED(ID_AA64PFR1_EL1),
|
||||||
|
@ -4634,6 +4633,13 @@ int kvm_finalize_sys_regs(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
guard(mutex)(&kvm->arch.config_lock);
|
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)) {
|
if (vcpu_has_nv(vcpu)) {
|
||||||
int ret = kvm_init_nv_sysregs(kvm);
|
int ret = kvm_init_nv_sysregs(kvm);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -350,9 +350,7 @@ void vcpu_set_ich_hcr(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
static inline bool kvm_has_gicv3(struct kvm *kvm)
|
static inline bool kvm_has_gicv3(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
return (static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif) &&
|
return kvm_has_feat(kvm, ID_AA64PFR0_EL1, GIC, IMP);
|
||||||
irqchip_in_kernel(kvm) &&
|
|
||||||
kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user