KVM: PIC: call ack notifiers for irqs that are dropped form irr
After commit 242ec97c358256 PIT interrupts are no longer delivered after PIC reset. It happens because PIT injects interrupt only if previous one was acked, but since on PIC reset it is dropped from irr it will never be delivered and hence acknowledged. Fix that by calling ack notifier on PIC reset. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
bdc0077af5
commit
aea218f3cb
@ -316,6 +316,11 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
|
||||
addr &= 1;
|
||||
if (addr == 0) {
|
||||
if (val & 0x10) {
|
||||
u8 edge_irr = s->irr & ~s->elcr;
|
||||
int i;
|
||||
bool found;
|
||||
struct kvm_vcpu *vcpu;
|
||||
|
||||
s->init4 = val & 1;
|
||||
s->last_irr = 0;
|
||||
s->irr &= s->elcr;
|
||||
@ -333,6 +338,18 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
|
||||
if (val & 0x08)
|
||||
pr_pic_unimpl(
|
||||
"level sensitive irq not supported");
|
||||
|
||||
kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
|
||||
if (kvm_apic_accept_pic_intr(vcpu)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (found)
|
||||
for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
|
||||
if (edge_irr & (1 << irq))
|
||||
pic_clear_isr(s, irq);
|
||||
} else if (val & 0x08) {
|
||||
if (val & 0x04)
|
||||
s->poll = 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user