aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/i8259.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index de704995b819..71e3eeeccae8 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -195,13 +195,19 @@ int kvm_pic_read_irq(struct kvm *kvm)
195 195
196void kvm_pic_reset(struct kvm_kpic_state *s) 196void kvm_pic_reset(struct kvm_kpic_state *s)
197{ 197{
198 int irq; 198 int irq, irqbase;
199 struct kvm *kvm = s->pics_state->irq_request_opaque; 199 struct kvm *kvm = s->pics_state->irq_request_opaque;
200 struct kvm_vcpu *vcpu0 = kvm->vcpus[0];
200 201
201 for (irq = 0; irq < PIC_NUM_PINS; irq++) { 202 if (s == &s->pics_state->pics[0])
202 if (!(s->imr & (1 << irq)) && (s->irr & (1 << irq) || 203 irqbase = 0;
203 s->isr & (1 << irq))) 204 else
204 kvm_notify_acked_irq(kvm, irq); 205 irqbase = 8;
206
207 for (irq = 0; irq < PIC_NUM_PINS/2; irq++) {
208 if (vcpu0 && kvm_apic_accept_pic_intr(vcpu0))
209 if (s->irr & (1 << irq) || s->isr & (1 << irq))
210 kvm_notify_acked_irq(kvm, irq+irqbase);
205 } 211 }
206 s->last_irr = 0; 212 s->last_irr = 0;
207 s->irr = 0; 213 s->irr = 0;