aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/irq.c
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2012-08-30 18:06:39 +0100
committerAndrew Cooper <andrew.cooper3@citrix.com>2012-08-30 18:06:39 +0100
commit132906348a14d4df9830b2794c6f06315e44238b (patch)
treeb7b9d09a67d695aefb88d076bb78fa8ec2a44221 /xen/arch/x86/irq.c
parent944076d517216ac723899ebb6e65148783305e4c (diff)
downloadxen-132906348a14d4df9830b2794c6f06315e44238b.tar.gz
xen-132906348a14d4df9830b2794c6f06315e44238b.tar.bz2
xen-132906348a14d4df9830b2794c6f06315e44238b.zip
x86/i8259: Handle bogus spurious interrupts more quietly
c/s 25336:edd7c7ad1ad2 introduced the concept of a bogus vector, for in irqs delivered through the i8259 PIC after IO-APICs had been set up. However, if supurious PIC vectors are received, many "No irq handler for vector" log messages can be seen on the console. This patch adds to the bogus vector logic to detect spurious PIC vectors and simply ignore them. _mask_and_ack_8259A_irq() has been modified to return a boolean indicating whether the irq is real or not, and in the case of a spurious vector, the error in do_IRQ() is not printed. One complication is that now, _mask_and_ack_8259A_irq() can get called whatever the ack mode is, so has been altered to work out whether it should EOI the irq or not. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/irq.c')
-rw-r--r--xen/arch/x86/irq.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index 78a02e3290..f7465e5d1c 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -817,11 +817,11 @@ void do_IRQ(struct cpu_user_regs *regs)
ack_APIC_irq();
else
kind = "";
- if ( vector >= FIRST_LEGACY_VECTOR &&
- vector <= LAST_LEGACY_VECTOR )
- bogus_8259A_irq(vector - FIRST_LEGACY_VECTOR);
- printk("CPU%u: No irq handler for vector %02x (IRQ %d%s)\n",
- smp_processor_id(), vector, irq, kind);
+ if ( ! ( vector >= FIRST_LEGACY_VECTOR &&
+ vector <= LAST_LEGACY_VECTOR &&
+ bogus_8259A_irq(vector - FIRST_LEGACY_VECTOR) ) )
+ printk("CPU%u: No irq handler for vector %02x (IRQ %d%s)\n",
+ smp_processor_id(), vector, irq, kind);
TRACE_1D(TRC_HW_IRQ_UNMAPPED_VECTOR, vector);
}
goto out_no_unlock;