Commit 8d917e0a authored by Marc Zyngier's avatar Marc Zyngier
Browse files

KVM: arm64: Force GICv3 trap activation when no irqchip is configured on VHE



On a VHE system, no GICv3 traps get configured when no irqchip is
present. This is not quite matching the "no GICv3" semantics that
we want to present.

Force such traps to be configured in this case.

Reviewed-by: default avatarOliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240827152517.3909653-4-maz@kernel.org


Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 5739a961
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -922,10 +922,13 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)

void kvm_vgic_load(struct kvm_vcpu *vcpu)
{
	if (unlikely(!vgic_initialized(vcpu->kvm)))
	if (unlikely(!irqchip_in_kernel(vcpu->kvm) || !vgic_initialized(vcpu->kvm))) {
		if (has_vhe() && static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
			__vgic_v3_activate_traps(&vcpu->arch.vgic_cpu.vgic_v3);
		return;
	}

	if (kvm_vgic_global_state.type == VGIC_V2)
	if (!static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
		vgic_v2_load(vcpu);
	else
		vgic_v3_load(vcpu);
@@ -933,10 +936,13 @@ void kvm_vgic_load(struct kvm_vcpu *vcpu)

void kvm_vgic_put(struct kvm_vcpu *vcpu)
{
	if (unlikely(!vgic_initialized(vcpu->kvm)))
	if (unlikely(!irqchip_in_kernel(vcpu->kvm) || !vgic_initialized(vcpu->kvm))) {
		if (has_vhe() && static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
			__vgic_v3_deactivate_traps(&vcpu->arch.vgic_cpu.vgic_v3);
		return;
	}

	if (kvm_vgic_global_state.type == VGIC_V2)
	if (!static_branch_unlikely(&kvm_vgic_global_state.gicv3_cpuif))
		vgic_v2_put(vcpu);
	else
		vgic_v3_put(vcpu);