diff options
-rw-r--r-- | arch/x86/kvm/i8259.c | 16 |
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 | ||
196 | void kvm_pic_reset(struct kvm_kpic_state *s) | 196 | void 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; |