From: Stefano Stabellini Date: Fri, 15 Feb 2013 13:32:25 +0000 (+0000) Subject: xen/arm: drain all the outstanding interrupts before returning from gic_interrupt X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~7260 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c91b12a8e768a31d1cf64f1628be610e98828270;p=xen.git xen/arm: drain all the outstanding interrupts before returning from gic_interrupt Signed-off-by: Stefano Stabellini Acked-by: Ian Campbell Committed-by: Ian Campbell --- diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index ff186d29b5..1c8219d18b 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -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)