From 373a6e31c98580fa8ace2a9d298d7ff62371d45b Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 13 Jul 2005 15:41:16 +0000 Subject: - Ignore BIOS IRQs (that is, IRQ settings left by the BIOS or a previous OS in the PCI config registers) that are > 15 as $PIR can only route PCI interrupts to ISA IRQs which are limited to the 0 to 15 range. - Remove an extra word from a printf. Reported by: othermark atkin901 at yahoo dot com MFC after: 3 days --- sys/i386/pci/pci_pir.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sys/i386/pci/pci_pir.c b/sys/i386/pci/pci_pir.c index faeb0a7..caf5b6e 100644 --- a/sys/i386/pci/pci_pir.c +++ b/sys/i386/pci/pci_pir.c @@ -327,6 +327,15 @@ pci_pir_initial_irqs(struct PIR_entry *entry, struct PIR_intpin *intpin, if (irq == PCI_INVALID_IRQ || irq == pci_link->pl_irq) return; + /* Don't trust any BIOS IRQs greater than 15. */ + if (irq >= NUM_ISA_INTERRUPTS) { + printf( + "$PIR: Ignoring invalid BIOS IRQ %d from %d.%d.INT%c for link %#x\n", + irq, entry->pe_bus, entry->pe_device, pin + 'A', + pci_link->pl_id); + return; + } + /* * If we don't have an IRQ for this link yet, then we trust the * BIOS, even if it seems invalid from the $PIR entries. @@ -334,7 +343,7 @@ pci_pir_initial_irqs(struct PIR_entry *entry, struct PIR_intpin *intpin, if (pci_link->pl_irq == PCI_INVALID_IRQ) { if (!pci_pir_valid_irq(pci_link, irq)) printf( - "$PIR: Using invalid BIOS IRQ %d from %d.%d.INT%c is for link %#x\n", + "$PIR: Using invalid BIOS IRQ %d from %d.%d.INT%c for link %#x\n", irq, entry->pe_bus, entry->pe_device, pin + 'A', pci_link->pl_id); pci_link->pl_irq = irq; -- cgit v1.1