summaryrefslogtreecommitdiffstats
path: root/sys/x86
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2011-01-13 17:00:22 +0000
committerjhb <jhb@FreeBSD.org>2011-01-13 17:00:22 +0000
commitcfd16f712573032be1fa07106485eb0667fa7411 (patch)
treebfa614e1497554b75209bc2819f61899041b525b /sys/x86
parentd0e4f29150b70c6db15b3bb2245e00de82a7cb7d (diff)
downloadFreeBSD-src-cfd16f712573032be1fa07106485eb0667fa7411.zip
FreeBSD-src-cfd16f712573032be1fa07106485eb0667fa7411.tar.gz
If an interrupt on an I/O APIC is moved to a different CPU after it has
started to execute, it seems that the corresponding ISR bit in the "old" local APIC can be cleared. This causes the local APIC interrupt routine to fail to find an interrupt to service. Rather than panic'ing in this case, simply return from the interrupt without sending an EOI to the local APIC. If there are any other pending interrupts in other ISR registers, the local APIC will assert a new interrupt. Tested by: steve
Diffstat (limited to 'sys/x86')
-rw-r--r--sys/x86/x86/local_apic.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index d6da578..804c411 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -780,8 +780,6 @@ lapic_handle_intr(int vector, struct trapframe *frame)
{
struct intsrc *isrc;
- if (vector == -1)
- panic("Couldn't get vector from ISR!");
isrc = intr_lookup_source(apic_idt_to_irq(PCPU_GET(apic_id),
vector));
intr_execute_handlers(isrc, frame);
OpenPOWER on IntegriCloud