summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/acpica/madt.c24
-rw-r--r--sys/amd64/amd64/mptable.c6
-rw-r--r--sys/i386/acpica/madt.c24
-rw-r--r--sys/i386/i386/mptable.c6
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);
OpenPOWER on IntegriCloud