Comments
Patch
@@ -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);
}
Someday it should be fixed properly, but doing so may break migration. So go with an incremental approach instead. Signed-off-by: Matthew Ogilvie <mmogilvi_qemu@miniinfo.net> --- hw/i8259.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)