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; |