From c91b12a8e768a31d1cf64f1628be610e98828270 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Fri, 15 Feb 2013 13:32:25 +0000 Subject: [PATCH] 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 --- xen/arch/arm/gic.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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) -- 2.30.2