Pārlūkot izejas kodu

KVM: x86: Call mask notifiers from pic

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>
Gleb Natapov 15 gadi atpakaļ
vecāks
revīzija
9195c4da26
1 mainītis faili ar 11 papildinājumiem un 1 dzēšanām
  1. 11 1
      arch/x86/kvm/i8259.c

+ 11 - 1
arch/x86/kvm/i8259.c

@@ -363,10 +363,20 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
 		}
 		}
 	} else
 	} else
 		switch (s->init_state) {
 		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;
 			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);
 			pic_update_irq(s->pics_state);
 			break;
 			break;
+		}
 		case 1:
 		case 1:
 			s->irq_base = val & 0xf8;
 			s->irq_base = val & 0xf8;
 			s->init_state = 2;
 			s->init_state = 2;