From: Jan Kiszka Date: Fri, 7 Oct 2011 07:19:43 +0000 (+0200) Subject: i8259: Reorder intack in pic_read_irq X-Git-Tag: v1.0-rc0~102 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=78ef2b6989fb20eb7eee3a5cef66655ea1d19175;p=thirdparty%2Fqemu.git i8259: Reorder intack in pic_read_irq As we want to move the IRQ update to pic_intack, ordering matters: the slave ack must be executed before the master ack to avoid missing further pending slave IRQs. Signed-off-by: Jan Kiszka Signed-off-by: Blue Swirl --- diff --git a/hw/i8259.c b/hw/i8259.c index cddd3c769e6..b7a011fb692 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -228,7 +228,6 @@ int pic_read_irq(PicState2 *s) irq = pic_get_irq(&s->pics[0]); if (irq >= 0) { - pic_intack(&s->pics[0], irq); if (irq == 2) { irq2 = pic_get_irq(&s->pics[1]); if (irq2 >= 0) { @@ -238,12 +237,10 @@ int pic_read_irq(PicState2 *s) irq2 = 7; } intno = s->pics[1].irq_base + irq2; -#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_LATENCY) - irq = irq2 + 8; -#endif } else { intno = s->pics[0].irq_base + irq; } + pic_intack(&s->pics[0], irq); } else { /* spurious IRQ on host controller */ irq = 7; @@ -251,6 +248,11 @@ int pic_read_irq(PicState2 *s) } pic_update_irq(s); +#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_LATENCY) + if (irq == 2) { + irq = irq2 + 8; + } +#endif #ifdef DEBUG_IRQ_LATENCY printf("IRQ%d latency=%0.3fus\n", irq,