KVM: cleanup pic reset
authorGleb Natapov <gleb@redhat.com>
Mon, 3 Sep 2012 11:47:25 +0000 (14:47 +0300)
committerAvi Kivity <avi@redhat.com>
Tue, 4 Sep 2012 11:53:51 +0000 (14:53 +0300)
kvm_pic_reset() is not used anywhere. Move reset logic from
pic_ioport_write() there.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/i8259.c

index 90c84f947d45f34ad40cabc546af1c5a02661b0d..848206df0967d1d35e4fde100575147ef482a2f4 100644 (file)
@@ -275,23 +275,20 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
 {
        int irq, i;
        struct kvm_vcpu *vcpu;
-       u8 irr = s->irr, isr = s->imr;
+       u8 edge_irr = s->irr & ~s->elcr;
        bool found = false;
 
        s->last_irr = 0;
-       s->irr = 0;
+       s->irr &= s->elcr;
        s->imr = 0;
-       s->isr = 0;
        s->priority_add = 0;
-       s->irq_base = 0;
-       s->read_reg_select = 0;
-       s->poll = 0;
        s->special_mask = 0;
-       s->init_state = 0;
-       s->auto_eoi = 0;
-       s->rotate_on_auto_eoi = 0;
-       s->special_fully_nested_mode = 0;
-       s->init4 = 0;
+       s->read_reg_select = 0;
+       if (!s->init4) {
+               s->special_fully_nested_mode = 0;
+               s->auto_eoi = 0;
+       }
+       s->init_state = 1;
 
        kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
                if (kvm_apic_accept_pic_intr(vcpu)) {
@@ -304,7 +301,7 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
                return;
 
        for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
-               if (irr & (1 << irq) || isr & (1 << irq))
+               if (edge_irr & (1 << irq))
                        pic_clear_isr(s, irq);
 }
 
@@ -316,40 +313,13 @@ 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;
-                       s->imr = 0;
-                       s->priority_add = 0;
-                       s->special_mask = 0;
-                       s->read_reg_select = 0;
-                       if (!s->init4) {
-                               s->special_fully_nested_mode = 0;
-                               s->auto_eoi = 0;
-                       }
-                       s->init_state = 1;
                        if (val & 0x02)
                                pr_pic_unimpl("single mode not supported");
                        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);
+                                               "level sensitive irq not supported");
+                       kvm_pic_reset(s);
                } else if (val & 0x08) {
                        if (val & 0x04)
                                s->poll = 1;