Commit cfa0b71dd84977b9378a9100b759739ef9220ac6
1 parent
724d3a8f
Fix OMAP pic handling of simultaneous interrupts.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3095 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
13 additions
and
9 deletions
hw/omap.c
| ... | ... | @@ -70,16 +70,20 @@ struct omap_intr_handler_s { |
| 70 | 70 | |
| 71 | 71 | static void omap_inth_update(struct omap_intr_handler_s *s) |
| 72 | 72 | { |
| 73 | - uint32_t irq = s->new_irq_agr & s->irqs & ~s->mask & ~s->fiq; | |
| 74 | - uint32_t fiq = s->new_fiq_agr & s->irqs & ~s->mask & s->fiq; | |
| 73 | + uint32_t irq = s->irqs & ~s->mask & ~s->fiq; | |
| 74 | + uint32_t fiq = s->irqs & ~s->mask & s->fiq; | |
| 75 | 75 | |
| 76 | - qemu_set_irq(s->parent_pic[ARM_PIC_CPU_IRQ], irq); | |
| 77 | - if (irq) | |
| 78 | - s->new_irq_agr = 0; | |
| 76 | + if (s->new_irq_agr || !irq) { | |
| 77 | + qemu_set_irq(s->parent_pic[ARM_PIC_CPU_IRQ], irq); | |
| 78 | + if (irq) | |
| 79 | + s->new_irq_agr = 0; | |
| 80 | + } | |
| 79 | 81 | |
| 80 | - qemu_set_irq(s->parent_pic[ARM_PIC_CPU_FIQ], fiq); | |
| 81 | - if (fiq) | |
| 82 | - s->new_fiq_agr = 0; | |
| 82 | + if (s->new_fiq_agr || !irq) { | |
| 83 | + qemu_set_irq(s->parent_pic[ARM_PIC_CPU_FIQ], fiq); | |
| 84 | + if (fiq) | |
| 85 | + s->new_fiq_agr = 0; | |
| 86 | + } | |
| 83 | 87 | } |
| 84 | 88 | |
| 85 | 89 | static void omap_inth_sir_update(struct omap_intr_handler_s *s) |
| ... | ... | @@ -124,7 +128,7 @@ static void omap_set_intr(void *opaque, int irq, int req) |
| 124 | 128 | if (req) { |
| 125 | 129 | rise = ~ih->irqs & (1 << irq); |
| 126 | 130 | ih->irqs |= rise; |
| 127 | - ih->stats[irq] ++; | |
| 131 | + ih->stats[irq] += !!rise; | |
| 128 | 132 | } else { |
| 129 | 133 | rise = ih->sens_edge & ih->irqs & (1 << irq); |
| 130 | 134 | ih->irqs &= ~rise; | ... | ... |