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,16 +70,20 @@ struct omap_intr_handler_s { | ||
| 70 | 70 | ||
| 71 | static void omap_inth_update(struct omap_intr_handler_s *s) | 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 | static void omap_inth_sir_update(struct omap_intr_handler_s *s) | 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,7 +128,7 @@ static void omap_set_intr(void *opaque, int irq, int req) | ||
| 124 | if (req) { | 128 | if (req) { |
| 125 | rise = ~ih->irqs & (1 << irq); | 129 | rise = ~ih->irqs & (1 << irq); |
| 126 | ih->irqs |= rise; | 130 | ih->irqs |= rise; |
| 127 | - ih->stats[irq] ++; | 131 | + ih->stats[irq] += !!rise; |
| 128 | } else { | 132 | } else { |
| 129 | rise = ih->sens_edge & ih->irqs & (1 << irq); | 133 | rise = ih->sens_edge & ih->irqs & (1 << irq); |
| 130 | ih->irqs &= ~rise; | 134 | ih->irqs &= ~rise; |