diff options
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic/vgic-mmio.c b/virt/kvm/arm/vgic/vgic-mmio.c index 3ba7278fb533..44efc2ff863f 100644 --- a/virt/kvm/arm/vgic/vgic-mmio.c +++ b/virt/kvm/arm/vgic/vgic-mmio.c | |||
@@ -113,6 +113,22 @@ void vgic_mmio_write_senable(struct kvm_vcpu *vcpu, | |||
113 | struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); | 113 | struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); |
114 | 114 | ||
115 | raw_spin_lock_irqsave(&irq->irq_lock, flags); | 115 | raw_spin_lock_irqsave(&irq->irq_lock, flags); |
116 | if (vgic_irq_is_mapped_level(irq)) { | ||
117 | bool was_high = irq->line_level; | ||
118 | |||
119 | /* | ||
120 | * We need to update the state of the interrupt because | ||
121 | * the guest might have changed the state of the device | ||
122 | * while the interrupt was disabled at the VGIC level. | ||
123 | */ | ||
124 | irq->line_level = vgic_get_phys_line_level(irq); | ||
125 | /* | ||
126 | * Deactivate the physical interrupt so the GIC will let | ||
127 | * us know when it is asserted again. | ||
128 | */ | ||
129 | if (!irq->active && was_high && !irq->line_level) | ||
130 | vgic_irq_set_phys_active(irq, false); | ||
131 | } | ||
116 | irq->enabled = true; | 132 | irq->enabled = true; |
117 | vgic_queue_irq_unlock(vcpu->kvm, irq, flags); | 133 | vgic_queue_irq_unlock(vcpu->kvm, irq, flags); |
118 | 134 | ||