FAILED: patch "[PATCH] KVM: arm/arm64: vgic-v2: Handle SGI bits in GICD_I{S,C}PENDR0" failed to apply to 4.14-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 82e40f558de566fdee214bec68096bbd5e64a6a4 Mon Sep 17 00:00:00 2001
From: Marc Zyngier <[email protected]>
Date: Wed, 28 Aug 2019 11:10:16 +0100
Subject: [PATCH] KVM: arm/arm64: vgic-v2: Handle SGI bits in GICD_I{S,C}PENDR0
as WI
A guest is not allowed to inject a SGI (or clear its pending state) by writing to GICD_ISPENDR0 (resp. GICD_ICPENDR0), as these bits are defined as WI (as per ARM IHI 0048B 4.3.7 and 4.3.8).
Make sure we correctly emulate the architecture.
virt/kvm/arm/vgic/vgic-mmio.c +18 -0
@@ -195,6 +195,12 @@ static void vgic_hw_irq_spending(struct kvm_vcpu *vcpu, struct vgic_irq *irq,vgic_irq_set_phys_active (irq, true); } +static bool is_vgic_v2_sgi (struct kvm_vcpu *vcpu,struct vgic_irq *irq) +{ +return (vgic_irq_is_sgi (irq->intid) && + vcpu->kvm->arch.vgic.vgic_model ==KVM_DEV_TYPE_ARM_VGIC_V2 ); +} +void vgic_mmio_write_spending (struct kvm_vcpu *vcpu,gpa_t addr,unsigned int len,unsigned long val)
@@ -207,6 +213,12 @@ void vgic_mmio_write_spending(struct kvm_vcpu *vcpu,for_each_set_bit (i, &val, len *8 ) {struct vgic_irq *irq =vgic_get_irq (vcpu->kvm, vcpu, intid + i); +/* GICD_ISPENDR0 SGI bits are WI */ +if (is_vgic_v2_sgi (vcpu, irq)) { +vgic_put_irq (vcpu->kvm, irq); +continue ; + } +raw_spin_lock_irqsave (&irq->irq_lock, flags);if (irq->hw)vgic_hw_irq_spending (vcpu, irq, is_uaccess);
@@ -254,6 +266,12 @@ void vgic_mmio_write_cpending(struct kvm_vcpu *vcpu,for_each_set_bit (i, &val, len *8 ) {struct vgic_irq *irq =vgic_get_irq (vcpu->kvm, vcpu, intid + i); +/* GICD_ICPENDR0 SGI bits are WI */ +if (is_vgic_v2_sgi (vcpu, irq)) { +vgic_put_irq (vcpu->kvm, irq); +continue ; + } +raw_spin_lock_irqsave (&irq->irq_lock, flags);if (irq->hw)
virt/kvm/arm/vgic/vgic-v2.c +4 -1
@@ -184,7 +184,10 @@ void vgic_v2_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)if (vgic_irq_is_sgi (irq->intid)) {u32 src =ffs (irq->source); -BUG_ON (!src); +if (WARN_RATELIMIT (!src,"No SGI source for INTID %d\n" , + irq->intid)) +return ; + val |= (src -1 ) <<GICH_LR_PHYSID_CPUID_SHIFT ; irq->source &= ~(1 << (src -1 ));if (irq->source) {
virt/kvm/arm/vgic/vgic-v3.c +4 -1
@@ -167,7 +167,10 @@ void vgic_v3_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr) model == KVM_DEV_TYPE_ARM_VGIC_V2) {u32 src =ffs (irq->source); -BUG_ON (!src); +if (WARN_RATELIMIT (!src,"No SGI source for INTID %d\n" , + irq->intid)) +return ; + val |= (src -1 ) <<GICH_LR_PHYSID_CPUID_SHIFT ; irq->source &= ~(1 << (src -1 ));if (irq->source) {