diff options
-rw-r--r-- | sys/amd64/acpica/madt.c | 24 | ||||
-rw-r--r-- | sys/amd64/amd64/mptable.c | 6 | ||||
-rw-r--r-- | sys/i386/acpica/madt.c | 24 | ||||
-rw-r--r-- | sys/i386/i386/mptable.c | 6 |
4 files changed, 42 insertions, 18 deletions
diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c index 0c5d615..6fcf92e 100644 --- a/sys/amd64/acpica/madt.c +++ b/sys/amd64/acpica/madt.c @@ -521,25 +521,33 @@ madt_find_interrupt(int intr, void **apic, u_int *pin) static void madt_parse_interrupt_override(INTERRUPT_SOURCE_OVERRIDE *intr) { - void *ioapic; - u_int pin; + void *new_ioapic, *old_ioapic; + u_int new_pin, old_pin; if (bootverbose) printf("MADT: intr override: source %u, irq %u\n", intr->Source, intr->GlobalSystemInterrupt); KASSERT(intr->Bus == 0, ("bus for interrupt overrides must be zero")); - if (madt_find_interrupt(intr->GlobalSystemInterrupt, - &ioapic, &pin) != 0) { + if (madt_find_interrupt(intr->GlobalSystemInterrupt, &new_ioapic, + &new_pin) != 0) { printf("MADT: Could not find APIC for vector %d (IRQ %d)\n", intr->GlobalSystemInterrupt, intr->Source); return; } - if (intr->Source != intr->GlobalSystemInterrupt) - ioapic_remap_vector(ioapic, pin, intr->Source); - ioapic_set_triggermode(ioapic, pin, + if (intr->Source != intr->GlobalSystemInterrupt) { + ioapic_remap_vector(new_ioapic, new_pin, intr->Source); + if (madt_find_interrupt(intr->Source, &old_ioapic, + &old_pin) != 0) + printf("MADT: Could not find APIC for source IRQ %d\n", + intr->Source); + else + ioapic_disable_pin(old_ioapic, old_pin); + } + ioapic_set_triggermode(new_ioapic, new_pin, interrupt_trigger(intr->TriggerMode)); - ioapic_set_polarity(ioapic, pin, interrupt_polarity(intr->Polarity)); + ioapic_set_polarity(new_ioapic, new_pin, + interrupt_polarity(intr->Polarity)); } /* diff --git a/sys/amd64/amd64/mptable.c b/sys/amd64/amd64/mptable.c index 910b314..ed448e2 100644 --- a/sys/amd64/amd64/mptable.c +++ b/sys/amd64/amd64/mptable.c @@ -655,8 +655,12 @@ mptable_parse_io_int(int_entry_ptr intr) if (busses[intr->src_bus_id].bus_type == NOBUS) panic("interrupt from missing bus"); if (busses[intr->src_bus_id].bus_type == ISA && - intr->src_bus_irq != pin) + intr->src_bus_irq != pin) { ioapic_remap_vector(ioapic, pin, intr->src_bus_irq); + if (ioapic_get_vector(ioapic, intr->src_bus_irq) == + intr->src_bus_irq) + ioapic_disable_pin(ioapic, intr->src_bus_irq); + } break; case INTENTRY_TYPE_NMI: ioapic_set_nmi(ioapic, pin); diff --git a/sys/i386/acpica/madt.c b/sys/i386/acpica/madt.c index 0c5d615..6fcf92e 100644 --- a/sys/i386/acpica/madt.c +++ b/sys/i386/acpica/madt.c @@ -521,25 +521,33 @@ madt_find_interrupt(int intr, void **apic, u_int *pin) static void madt_parse_interrupt_override(INTERRUPT_SOURCE_OVERRIDE *intr) { - void *ioapic; - u_int pin; + void *new_ioapic, *old_ioapic; + u_int new_pin, old_pin; if (bootverbose) printf("MADT: intr override: source %u, irq %u\n", intr->Source, intr->GlobalSystemInterrupt); KASSERT(intr->Bus == 0, ("bus for interrupt overrides must be zero")); - if (madt_find_interrupt(intr->GlobalSystemInterrupt, - &ioapic, &pin) != 0) { + if (madt_find_interrupt(intr->GlobalSystemInterrupt, &new_ioapic, + &new_pin) != 0) { printf("MADT: Could not find APIC for vector %d (IRQ %d)\n", intr->GlobalSystemInterrupt, intr->Source); return; } - if (intr->Source != intr->GlobalSystemInterrupt) - ioapic_remap_vector(ioapic, pin, intr->Source); - ioapic_set_triggermode(ioapic, pin, + if (intr->Source != intr->GlobalSystemInterrupt) { + ioapic_remap_vector(new_ioapic, new_pin, intr->Source); + if (madt_find_interrupt(intr->Source, &old_ioapic, + &old_pin) != 0) + printf("MADT: Could not find APIC for source IRQ %d\n", + intr->Source); + else + ioapic_disable_pin(old_ioapic, old_pin); + } + ioapic_set_triggermode(new_ioapic, new_pin, interrupt_trigger(intr->TriggerMode)); - ioapic_set_polarity(ioapic, pin, interrupt_polarity(intr->Polarity)); + ioapic_set_polarity(new_ioapic, new_pin, + interrupt_polarity(intr->Polarity)); } /* diff --git a/sys/i386/i386/mptable.c b/sys/i386/i386/mptable.c index 910b314..ed448e2 100644 --- a/sys/i386/i386/mptable.c +++ b/sys/i386/i386/mptable.c @@ -655,8 +655,12 @@ mptable_parse_io_int(int_entry_ptr intr) if (busses[intr->src_bus_id].bus_type == NOBUS) panic("interrupt from missing bus"); if (busses[intr->src_bus_id].bus_type == ISA && - intr->src_bus_irq != pin) + intr->src_bus_irq != pin) { ioapic_remap_vector(ioapic, pin, intr->src_bus_irq); + if (ioapic_get_vector(ioapic, intr->src_bus_irq) == + intr->src_bus_irq) + ioapic_disable_pin(ioapic, intr->src_bus_irq); + } break; case INTENTRY_TYPE_NMI: ioapic_set_nmi(ioapic, pin); |