]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
KVM: x86: Call mask notifiers from pic
authorGleb Natapov <gleb@redhat.com>
Thu, 15 Jul 2010 09:24:37 +0000 (12:24 +0300)
committerAvi Kivity <avi@redhat.com>
Mon, 2 Aug 2010 03:40:52 +0000 (06:40 +0300)
If pit delivers interrupt while pic is masking it OS will never do EOI
and ack notifier will not be called so when pit will be unmasked no pit
interrupts will be delivered any more. Calling mask notifiers solves this
issue.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/i8259.c

index 819b748a33f9ff84c7660425cb1d3b28bf6cd404..8d10c063d7f207451b087a11a8d7bf0c888f3695 100644 (file)
@@ -363,10 +363,20 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
                }
        } else
                switch (s->init_state) {
-               case 0:         /* normal mode */
+               case 0: { /* normal mode */
+                       u8 imr_diff = s->imr ^ val,
+                               off = (s == &s->pics_state->pics[0]) ? 0 : 8;
                        s->imr = val;
+                       for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
+                               if (imr_diff & (1 << irq))
+                                       kvm_fire_mask_notifiers(
+                                               s->pics_state->kvm,
+                                               SELECT_PIC(irq + off),
+                                               irq + off,
+                                               !!(s->imr & (1 << irq)));
                        pic_update_irq(s->pics_state);
                        break;
+               }
                case 1:
                        s->irq_base = val & 0xf8;
                        s->init_state = 2;