summaryrefslogtreecommitdiffstats
path: root/sys/i386/acpica
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2004-06-01 19:49:38 +0000
committerjhb <jhb@FreeBSD.org>2004-06-01 19:49:38 +0000
commitff59f0bd8b2f737263314d91d4f155826cbe182c (patch)
tree7388b1ae1f635e918e270387ee7d3963eb13f520 /sys/i386/acpica
parentdbfd4ab6f2ca187676df23464479a62015543e54 (diff)
downloadFreeBSD-src-ff59f0bd8b2f737263314d91d4f155826cbe182c.zip
FreeBSD-src-ff59f0bd8b2f737263314d91d4f155826cbe182c.tar.gz
Use the local APIC ID rather than the ACPI Processor ID to index the array
of CPUs since local APIC IDs are bounded but ACPI IDs are not bounded.
Diffstat (limited to 'sys/i386/acpica')
-rw-r--r--sys/i386/acpica/madt.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/sys/i386/acpica/madt.c b/sys/i386/acpica/madt.c
index 844efd2..cea20d1 100644
--- a/sys/i386/acpica/madt.c
+++ b/sys/i386/acpica/madt.c
@@ -67,8 +67,8 @@ struct ioapic_info {
struct lapic_info {
u_int la_present:1;
u_int la_enabled:1;
- u_int la_apic_id:8;
-} lapics[NLAPICS + 1];
+ u_int la_acpi_id:8;
+} lapics[NLAPICS];
static int madt_found_sci_override;
static MULTIPLE_APIC_TABLE *madt;
@@ -446,14 +446,14 @@ madt_probe_cpus_handler(APIC_HEADER *entry, void *arg)
printf("MADT: Found CPU APIC ID %d ACPI ID %d: %s\n",
proc->LocalApicId, proc->ProcessorId,
proc->ProcessorEnabled ? "enabled" : "disabled");
- if (proc->ProcessorId > NLAPICS)
+ if (proc->LocalApicId >= NLAPICS)
panic("%s: CPU ID %d too high", __func__,
- proc->ProcessorId);
- la = &lapics[proc->ProcessorId];
+ proc->LocalApicId);
+ la = &lapics[proc->LocalApicId];
KASSERT(la->la_present == 0,
- ("Duplicate local ACPI ID %d", proc->ProcessorId));
+ ("Duplicate local APIC ID %d", proc->LocalApicId));
la->la_present = 1;
- la->la_apic_id = proc->LocalApicId;
+ la->la_acpi_id = proc->ProcessorId;
if (proc->ProcessorEnabled) {
la->la_enabled = 1;
lapic_create(proc->LocalApicId, 0);
@@ -544,14 +544,20 @@ interrupt_trigger(UINT16 TriggerMode, UINT8 Source)
static int
madt_find_cpu(u_int acpi_id, u_int *apic_id)
{
+ int i;
- if (!lapics[acpi_id].la_present)
- return (ENOENT);
- *apic_id = lapics[acpi_id].la_apic_id;
- if (lapics[acpi_id].la_enabled)
- return (0);
- else
- return (ENXIO);
+ for (i = 0; i < NLAPICS; i++) {
+ if (!lapics[i].la_present)
+ continue;
+ if (lapics[i].la_acpi_id != acpi_id)
+ continue;
+ *apic_id = i;
+ if (lapics[i].la_enabled)
+ return (0);
+ else
+ return (ENXIO);
+ }
+ return (ENOENT);
}
/*
@@ -751,8 +757,9 @@ madt_parse_ints(APIC_HEADER *entry, void *arg __unused)
static void
madt_set_ids(void *dummy)
{
+ struct lapic_info *la;
struct pcpu *pc;
- u_int i, j;
+ u_int i;
if (madt == NULL)
return;
@@ -761,19 +768,14 @@ madt_set_ids(void *dummy)
continue;
pc = pcpu_find(i);
KASSERT(pc != NULL, ("no pcpu data for CPU %d", i));
- for (j = 0; j < NLAPICS + 1; j++) {
- if (!lapics[j].la_present || !lapics[j].la_enabled)
- continue;
- if (lapics[j].la_apic_id == pc->pc_apic_id) {
- pc->pc_acpi_id = j;
- if (bootverbose)
- printf("APIC: CPU %u has ACPI ID %u\n",
- i, j);
- break;
- }
- }
- if (j == NLAPICS + 1)
- panic("Unable to find ACPI ID for CPU %d", i);
+ la = &lapics[pc->pc_apic_id];
+ if (!la->la_present || !la->la_enabled)
+ panic("APIC: CPU with APIC ID %u is not enabled",
+ pc->pc_apic_id);
+ pc->pc_acpi_id = la->la_acpi_id;
+ if (bootverbose)
+ printf("APIC: CPU %u has ACPI ID %u\n", i,
+ la->la_acpi_id);
}
}
SYSINIT(madt_set_ids, SI_SUB_CPU, SI_ORDER_ANY, madt_set_ids, NULL)
OpenPOWER on IntegriCloud