diff options
author | Jan Kiszka | 2011-10-07 09:19:43 +0200 |
---|---|---|
committer | Blue Swirl | 2011-10-16 13:11:04 +0200 |
commit | 78ef2b6989fb20eb7eee3a5cef66655ea1d19175 (patch) | |
tree | cc5de0af3a3376efe8e14bb68deb486f980b676b | |
parent | i8259: Do not update IRQ output after spurious pic_poll_read (diff) | |
download | qemu-78ef2b6989fb20eb7eee3a5cef66655ea1d19175.tar.gz qemu-78ef2b6989fb20eb7eee3a5cef66655ea1d19175.tar.xz qemu-78ef2b6989fb20eb7eee3a5cef66655ea1d19175.zip |
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 <jan.kiszka@siemens.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
-rw-r--r-- | hw/i8259.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/hw/i8259.c b/hw/i8259.c index cddd3c769e..b7a011fb69 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, |