From 4a91381108b45460216f56512e6a5ed9c29de324 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 20 Mar 2011 12:37:45 +0800 Subject: [PATCH] ioapic/abi: Mark unused ISA IRQs as reserved --- sys/platform/pc32/apic/ioapic_abi.c | 16 ++++++++++++++++ sys/platform/pc32/apic/ioapic_abi.h | 1 + sys/platform/pc32/apic/mpapic.c | 1 + sys/platform/pc64/apic/ioapic_abi.c | 16 ++++++++++++++++ sys/platform/pc64/apic/ioapic_abi.h | 1 + sys/platform/pc64/apic/mpapic.c | 1 + 6 files changed, 36 insertions(+) diff --git a/sys/platform/pc32/apic/ioapic_abi.c b/sys/platform/pc32/apic/ioapic_abi.c index bd1be50d1a..3835d6ce22 100644 --- a/sys/platform/pc32/apic/ioapic_abi.c +++ b/sys/platform/pc32/apic/ioapic_abi.c @@ -710,6 +710,22 @@ ioapic_abi_set_irqmap(int irq, int gsi, enum intr_trigger trig, imen_unlock(); } +void +ioapic_abi_fixup_irqmap(void) +{ + int i; + + for (i = 0; i < 16; ++i) { + struct ioapic_irqmap *map = &ioapic_irqmaps[i]; + + if (map->im_type == IOAPIC_IMT_UNUSED) { + map->im_type = IOAPIC_IMT_RESERVED; + if (bootverbose) + kprintf("IOAPIC: irq %d reserved\n", i); + } + } +} + static void ioapic_intr_config(int irq, enum intr_trigger trig, enum intr_polarity pola) { diff --git a/sys/platform/pc32/apic/ioapic_abi.h b/sys/platform/pc32/apic/ioapic_abi.h index b43c46e239..7216236775 100644 --- a/sys/platform/pc32/apic/ioapic_abi.h +++ b/sys/platform/pc32/apic/ioapic_abi.h @@ -50,6 +50,7 @@ extern struct machintr_abi MachIntrABI_IOAPIC; void ioapic_abi_set_irqmap(int, int, enum intr_trigger, enum intr_polarity); +void ioapic_abi_fixup_irqmap(void); #endif /* SMP */ diff --git a/sys/platform/pc32/apic/mpapic.c b/sys/platform/pc32/apic/mpapic.c index c29a3dc64c..570a9cf01e 100644 --- a/sys/platform/pc32/apic/mpapic.c +++ b/sys/platform/pc32/apic/mpapic.c @@ -1200,6 +1200,7 @@ ioapic_config(void) */ TAILQ_FOREACH(info, &ioapic_conf.ioc_list, io_link) ioapic_setup(info); + ioapic_abi_fixup_irqmap(); write_eflags(ef); diff --git a/sys/platform/pc64/apic/ioapic_abi.c b/sys/platform/pc64/apic/ioapic_abi.c index de135b376a..63bee9f2a4 100644 --- a/sys/platform/pc64/apic/ioapic_abi.c +++ b/sys/platform/pc64/apic/ioapic_abi.c @@ -703,6 +703,22 @@ ioapic_abi_set_irqmap(int irq, int gsi, enum intr_trigger trig, imen_unlock(); } +void +ioapic_abi_fixup_irqmap(void) +{ + int i; + + for (i = 0; i < 16; ++i) { + struct ioapic_irqmap *map = &ioapic_irqmaps[i]; + + if (map->im_type == IOAPIC_IMT_UNUSED) { + map->im_type = IOAPIC_IMT_RESERVED; + if (bootverbose) + kprintf("IOAPIC: irq %d reserved\n", i); + } + } +} + static void ioapic_intr_config(int irq, enum intr_trigger trig, enum intr_polarity pola) { diff --git a/sys/platform/pc64/apic/ioapic_abi.h b/sys/platform/pc64/apic/ioapic_abi.h index b43c46e239..7216236775 100644 --- a/sys/platform/pc64/apic/ioapic_abi.h +++ b/sys/platform/pc64/apic/ioapic_abi.h @@ -50,6 +50,7 @@ extern struct machintr_abi MachIntrABI_IOAPIC; void ioapic_abi_set_irqmap(int, int, enum intr_trigger, enum intr_polarity); +void ioapic_abi_fixup_irqmap(void); #endif /* SMP */ diff --git a/sys/platform/pc64/apic/mpapic.c b/sys/platform/pc64/apic/mpapic.c index 8244af31a3..8d8bc4a7ac 100644 --- a/sys/platform/pc64/apic/mpapic.c +++ b/sys/platform/pc64/apic/mpapic.c @@ -1262,6 +1262,7 @@ ioapic_config(void) */ TAILQ_FOREACH(info, &ioapic_conf.ioc_list, io_link) ioapic_setup(info); + ioapic_abi_fixup_irqmap(); write_rflags(ef); -- 2.41.0