From: Sepherosa Ziehau Date: Fri, 20 Jul 2012 02:31:04 +0000 (+0800) Subject: apic: APIC ID should not be 255, which is used for broadcast X-Git-Tag: v3.2.0~560 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/740024d359f2089662381587f390fa5744723d6f apic: APIC ID should not be 255, which is used for broadcast --- diff --git a/sys/platform/pc32/acpica5/acpi_madt.c b/sys/platform/pc32/acpica5/acpi_madt.c index 7f4bbc35cc..904614ec47 100644 --- a/sys/platform/pc32/acpica5/acpi_madt.c +++ b/sys/platform/pc32/acpica5/acpi_madt.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "acpi_sdt.h" #include "acpi_sdt_var.h" @@ -394,6 +395,12 @@ madt_lapic_probe_callback(void *xarg, const struct acpi_madt_ent *ent) lapic_ent = (const struct acpi_madt_lapic *)ent; if (lapic_ent->ml_flags & MADT_LAPIC_ENABLED) arg->cpu_count++; + if (lapic_ent->ml_apic_id == APICID_MAX) { + kprintf("madt_lapic_probe: " + "invalid LAPIC apic id %d\n", + lapic_ent->ml_apic_id); + return EINVAL; + } } else if (ent->me_type == MADT_ENT_LAPIC_ADDR) { const struct acpi_madt_lapic_addr *lapic_addr_ent; @@ -535,6 +542,12 @@ madt_ioapic_probe_callback(void *xarg, const struct acpi_madt_ent *ent) kprintf("madt_ioapic_probe: zero IOAPIC address\n"); return EINVAL; } + if (ioapic_ent->mio_apic_id == APICID_MAX) { + kprintf("madt_ioapic_probe: " + "invalid IOAPIC apic id %d\n", + ioapic_ent->mio_apic_id); + return EINVAL; + } arg->ioapic_cnt++; if (ioapic_ent->mio_gsi_base == 0) diff --git a/sys/platform/pc32/apic/apicvar.h b/sys/platform/pc32/apic/apicvar.h index 07982e8af1..80c035d5da 100644 --- a/sys/platform/pc32/apic/apicvar.h +++ b/sys/platform/pc32/apic/apicvar.h @@ -39,4 +39,10 @@ */ #define NAPICID 256 +/* + * APICID must be less than this value + * 255 is for "broadcast to all APICs" + */ +#define APICID_MAX 255 + #endif /* _MACHINE_APICVAR_H_ */ diff --git a/sys/platform/pc32/apic/lapic.c b/sys/platform/pc32/apic/lapic.c index 75833d2e12..b9dd213d9f 100644 --- a/sys/platform/pc32/apic/lapic.c +++ b/sys/platform/pc32/apic/lapic.c @@ -671,7 +671,7 @@ lapic_unused_apic_id(int start) { int i; - for (i = start; i < NAPICID; ++i) { + for (i = start; i < APICID_MAX; ++i) { if (APICID_TO_CPUID(i) == -1) return i; } diff --git a/sys/platform/pc32/i386/mptable.c b/sys/platform/pc32/i386/mptable.c index 4cb4e8c025..b017dede03 100644 --- a/sys/platform/pc32/i386/mptable.c +++ b/sys/platform/pc32/i386/mptable.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -821,6 +822,12 @@ mptable_lapic_probe_callback(void *xarg, const void *pos, int type) return 0; arg->cpu_count++; + if (ent->apic_id == APICID_MAX) { + kprintf("MPTABLE: invalid LAPIC apic id %d\n", + ent->apic_id); + return EINVAL; + } + if (ent->cpu_flags & PROCENTRY_FLAG_BP) { if (arg->found_bsp) { kprintf("more than one BSP in base MP table\n"); @@ -904,6 +911,11 @@ mptable_ioapic_list_callback(void *xarg, const void *pos, int type) kprintf("mptable_ioapic_create_list: zero IOAPIC addr\n"); return EINVAL; } + if (ent->apic_id == APICID_MAX) { + kprintf("mptable_ioapic_create_list: " + "invalid IOAPIC apic id %d\n", ent->apic_id); + return EINVAL; + } TAILQ_FOREACH(ioapic, &mptable_ioapic_list, mio_link) { if (ioapic->mio_apic_id == ent->apic_id) { diff --git a/sys/platform/pc64/acpica5/acpi_madt.c b/sys/platform/pc64/acpica5/acpi_madt.c index b56a6a75a6..e2c3d291d7 100644 --- a/sys/platform/pc64/acpica5/acpi_madt.c +++ b/sys/platform/pc64/acpica5/acpi_madt.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "acpi_sdt.h" #include "acpi_sdt_var.h" @@ -394,6 +395,12 @@ madt_lapic_probe_callback(void *xarg, const struct acpi_madt_ent *ent) lapic_ent = (const struct acpi_madt_lapic *)ent; if (lapic_ent->ml_flags & MADT_LAPIC_ENABLED) arg->cpu_count++; + if (lapic_ent->ml_apic_id == APICID_MAX) { + kprintf("madt_lapic_probe: " + "invalid LAPIC apic id %d\n", + lapic_ent->ml_apic_id); + return EINVAL; + } } else if (ent->me_type == MADT_ENT_LAPIC_ADDR) { const struct acpi_madt_lapic_addr *lapic_addr_ent; @@ -535,6 +542,12 @@ madt_ioapic_probe_callback(void *xarg, const struct acpi_madt_ent *ent) kprintf("madt_ioapic_probe: zero IOAPIC address\n"); return EINVAL; } + if (ioapic_ent->mio_apic_id == APICID_MAX) { + kprintf("madt_ioapic_probe: " + "invalid IOAPIC apic id %d\n", + ioapic_ent->mio_apic_id); + return EINVAL; + } arg->ioapic_cnt++; if (ioapic_ent->mio_gsi_base == 0) diff --git a/sys/platform/pc64/apic/apicvar.h b/sys/platform/pc64/apic/apicvar.h index 8df9b7ae89..80928b5997 100644 --- a/sys/platform/pc64/apic/apicvar.h +++ b/sys/platform/pc64/apic/apicvar.h @@ -40,4 +40,10 @@ */ #define NAPICID 256 +/* + * APICID must be less than this value + * 255 is for "broadcast to all APICs" + */ +#define APICID_MAX 255 + #endif /* _MACHINE_APICVAR_H_ */ diff --git a/sys/platform/pc64/apic/lapic.c b/sys/platform/pc64/apic/lapic.c index 07e575ae10..670025beab 100644 --- a/sys/platform/pc64/apic/lapic.c +++ b/sys/platform/pc64/apic/lapic.c @@ -732,7 +732,7 @@ lapic_unused_apic_id(int start) { int i; - for (i = start; i < NAPICID; ++i) { + for (i = start; i < APICID_MAX; ++i) { if (APICID_TO_CPUID(i) == -1) return i; } diff --git a/sys/platform/pc64/x86_64/mptable.c b/sys/platform/pc64/x86_64/mptable.c index 141d47429e..c11ef7e6ec 100644 --- a/sys/platform/pc64/x86_64/mptable.c +++ b/sys/platform/pc64/x86_64/mptable.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -822,6 +823,12 @@ mptable_lapic_probe_callback(void *xarg, const void *pos, int type) return 0; arg->cpu_count++; + if (ent->apic_id == APICID_MAX) { + kprintf("MPTABLE: invalid LAPIC apic id %d\n", + ent->apic_id); + return EINVAL; + } + if (ent->cpu_flags & PROCENTRY_FLAG_BP) { if (arg->found_bsp) { kprintf("more than one BSP in base MP table\n"); @@ -905,6 +912,11 @@ mptable_ioapic_list_callback(void *xarg, const void *pos, int type) kprintf("mptable_ioapic_create_list: zero IOAPIC addr\n"); return EINVAL; } + if (ent->apic_id == APICID_MAX) { + kprintf("mptable_ioapic_create_list: " + "invalid IOAPIC apic id %d\n", ent->apic_id); + return EINVAL; + } TAILQ_FOREACH(ioapic, &mptable_ioapic_list, mio_link) { if (ioapic->mio_apic_id == ent->apic_id) {