svn commit: r189404 - in head/sys: amd64/acpica i386/acpica
John Baldwin
jhb at FreeBSD.org
Thu Mar 5 08:03:45 PST 2009
Author: jhb
Date: Thu Mar 5 16:03:44 2009
New Revision: 189404
URL: http://svn.freebsd.org/changeset/base/189404
Log:
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
Modified:
head/sys/amd64/acpica/madt.c
head/sys/i386/acpica/madt.c
Modified: head/sys/amd64/acpica/madt.c
==============================================================================
--- head/sys/amd64/acpica/madt.c Thu Mar 5 15:50:39 2009 (r189403)
+++ head/sys/amd64/acpica/madt.c Thu Mar 5 16:03:44 2009 (r189404)
@@ -483,6 +483,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *e
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;
Modified: head/sys/i386/acpica/madt.c
==============================================================================
--- head/sys/i386/acpica/madt.c Thu Mar 5 15:50:39 2009 (r189403)
+++ head/sys/i386/acpica/madt.c Thu Mar 5 16:03:44 2009 (r189404)
@@ -482,6 +482,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *e
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;
More information about the svn-src-all
mailing list