From patchwork Sun Nov 25 21:51:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v7,07/10] i8254/i8259: workaround to make IRQ0 work like before Date: Sun, 25 Nov 2012 11:51:43 -0000 From: Matthew Ogilvie X-Patchwork-Id: 201572 Message-Id: <1353880306-8004-8-git-send-email-mmogilvi_qemu@miniinfo.net> To: qemu-devel@nongnu.org Cc: Jan Kiszka , Matthew Ogilvie , "Maciej W. Rozycki" , Avi Kivity Someday it should be fixed properly, but doing so may break migration. So go with an incremental approach instead. Signed-off-by: Matthew Ogilvie --- hw/i8259.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/hw/i8259.c b/hw/i8259.c index 9b2ec40..71cc09a 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -150,8 +150,25 @@ static void pic_set_irq(void *opaque, int irq, int level) /* Dropping level clears the interrupt regardless of edge trigger * vs level trigger. */ - s->irr &= ~mask; s->last_irr &= ~mask; + + /* Migration compatibility hack: + * + * The i8254 timer model is wrong in a number of ways, + * including lowering IRQ0 much earlier than it should. + * + * FIXME i8254_timing_fixes: Eventually the i8254 + * should be fixed, but it isn't + * trivial to do so in a way that avoids possible problems with + * migration (lost or gained timer ticks). So for now, make the + * i8254 work the same way that it worked in qemu 1.2, and + * leave irr for IRQ0 alone in the i8259 here: + */ + if (irq == 0 && s->master) { + mask = 0; + } + + s->irr &= ~mask; } pic_update_irq(s); }