xen/arm: drain all the outstanding interrupts before returning from gic_interrupt
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Fri, 15 Feb 2013 13:32:25 +0000 (13:32 +0000)
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>
Fri, 15 Feb 2013 13:32:25 +0000 (13:32 +0000)
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
xen/arch/arm/gic.c

index ff186d29b5cfae8b673c5da4f720074cf61c1db0..1c8219d18b51800dfd19c83904c4529be8ac5492 100644 (file)
@@ -592,16 +592,22 @@ out:
 /* Accept an interrupt from the GIC and dispatch its handler */
 void gic_interrupt(struct cpu_user_regs *regs, int is_fiq)
 {
-    uint32_t intack = GICC[GICC_IAR];
-    unsigned int irq = intack & GICC_IA_IRQ;
+    uint32_t intack;
+    unsigned int irq;
 
-    local_irq_enable();
 
-    if ( irq == 1023 )
-        /* Spurious interrupt */
-        return;
+    do  {
+        intack = GICC[GICC_IAR];
+        irq = intack & GICC_IA_IRQ;
+        local_irq_enable();
+
+        if (likely(irq < 1021))
+            do_IRQ(regs, irq, is_fiq);
+        else
+            break;
 
-    do_IRQ(regs, irq, is_fiq);
+        local_irq_disable();
+    } while (1);
 }
 
 int gicv_setup(struct domain *d)