Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79c727d4 authored by Gleb Natapov's avatar Gleb Natapov Committed by Avi Kivity
Browse files

KVM: Call pic_clear_isr() on pic reset to reuse logic there



Also move call of ack notifiers after pic state change.

Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 851ba692
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -225,22 +225,11 @@ int kvm_pic_read_irq(struct kvm *kvm)

void kvm_pic_reset(struct kvm_kpic_state *s)
{
	int irq, irqbase, n;
	int irq;
	struct kvm *kvm = s->pics_state->irq_request_opaque;
	struct kvm_vcpu *vcpu0 = kvm->bsp_vcpu;
	u8 irr = s->irr, isr = s->imr;

	if (s == &s->pics_state->pics[0])
		irqbase = 0;
	else
		irqbase = 8;

	for (irq = 0; irq < PIC_NUM_PINS/2; irq++) {
		if (vcpu0 && kvm_apic_accept_pic_intr(vcpu0))
			if (s->irr & (1 << irq) || s->isr & (1 << irq)) {
				n = irq + irqbase;
				kvm_notify_acked_irq(kvm, SELECT_PIC(n), n);
			}
	}
	s->last_irr = 0;
	s->irr = 0;
	s->imr = 0;
@@ -256,6 +245,13 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
	s->rotate_on_auto_eoi = 0;
	s->special_fully_nested_mode = 0;
	s->init4 = 0;

	for (irq = 0; irq < PIC_NUM_PINS/2; irq++) {
		if (vcpu0 && kvm_apic_accept_pic_intr(vcpu0))
			if (irr & (1 << irq) || isr & (1 << irq)) {
				pic_clear_isr(s, irq);
			}
	}
}

static void pic_ioport_write(void *opaque, u32 addr, u32 val)