ICW is not a full reset, instead it resets a limited number of registers
in the PIC.  Change ICW1 emulation to only reset those registers.

Signed-off-by: Avi Kivity <[email protected]>
---
 arch/x86/kvm/i8259.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 8d10c06..a82876f 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -305,13 +305,17 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 
val)
        addr &= 1;
        if (addr == 0) {
                if (val & 0x10) {
-                       kvm_pic_reset(s);       /* init */
-                       /*
-                        * deassert a pending interrupt
-                        */
-                       pic_irq_request(s->pics_state->kvm, 0);
-                       s->init_state = 1;
                        s->init4 = val & 1;
+                       s->last_irr = 0;
+                       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)
                                printk(KERN_ERR "single mode not supported");
                        if (val & 0x08)
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to