diff options
author | jhb <jhb@FreeBSD.org> | 2009-03-05 16:03:44 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-03-05 16:03:44 +0000 |
commit | 95e639db1b991fdc54d20f37e7074d73033bdcd8 (patch) | |
tree | 10d7597a79ed7d66a0ce328ab6140e588b1bf33e /sys | |
parent | 0bda83f9a749c51dbba8ab3683b65c05ebb8cc93 (diff) | |
download | FreeBSD-src-95e639db1b991fdc54d20f37e7074d73033bdcd8.zip FreeBSD-src-95e639db1b991fdc54d20f37e7074d73033bdcd8.tar.gz |
At least one BIOS bogusly includes duplicate entries for I/O APICs. The
bogus entries have a starting IRQ that is invalid (> 255, so won't fit
into a PCI intline config register). It had the side effect of breaking
MSI by "claiming" several IRQs in the MSI range. Fix this by ignoring such
I/O APICs.
MFC after: 2 weeks
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/acpica/madt.c | 4 | ||||
-rw-r--r-- | sys/i386/acpica/madt.c | 4 |
2 files changed, 8 insertions, 0 deletions
diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c index 7bcf0e6..a8df55d 100644 --- a/sys/amd64/acpica/madt.c +++ b/sys/amd64/acpica/madt.c @@ -483,6 +483,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *entry, void *arg __unused) apic->Id); if (ioapics[apic->Id].io_apic != NULL) panic("%s: Double APIC ID %u", __func__, apic->Id); + if (apic->GlobalIrqBase >= FIRST_MSI_INT) { + printf("MADT: Ignoring bogus I/O APIC ID %u", apic->Id); + break; + } ioapics[apic->Id].io_apic = ioapic_create(apic->Address, apic->Id, apic->GlobalIrqBase); ioapics[apic->Id].io_vector = apic->GlobalIrqBase; diff --git a/sys/i386/acpica/madt.c b/sys/i386/acpica/madt.c index 3e53cf0..e604829 100644 --- a/sys/i386/acpica/madt.c +++ b/sys/i386/acpica/madt.c @@ -482,6 +482,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *entry, void *arg __unused) apic->Id); if (ioapics[apic->Id].io_apic != NULL) panic("%s: Double APIC ID %u", __func__, apic->Id); + if (apic->GlobalIrqBase >= FIRST_MSI_INT) { + printf("MADT: Ignoring bogus I/O APIC ID %u", apic->Id); + break; + } ioapics[apic->Id].io_apic = ioapic_create(apic->Address, apic->Id, apic->GlobalIrqBase); ioapics[apic->Id].io_vector = apic->GlobalIrqBase; |