On Sun, Jul 18, 2010 at 08:59:33PM -0400, Christos Zoulas wrote: > 1. ACPI seems to define cpuids 1..n; we define 0..n-1. Adjust for that > 2. My laptop is dual core, but ACPI reports 4 cpu nodes. Instead of > attaching the unmatched ones, make the match fail. Do we want to > attach and do nothing instead? > 3. Create a flag, and only set it after we are completely initialized, > so the sysmon thread does not try to access unitialized state.
Can you (and others who might have the same problem) test the attached diff? There might be a more elegant way to do this, but including the MADT ID in <x86/cpu.h> is probably the least invasive one. There is still the case where the MADT IDs and ACPI processor object IDs do not match, and the case where a BIOS writer was unable to enumerate numbers in ascending order. - Jukka.
Index: include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/cpu.h,v retrieving revision 1.23 diff -u -p -r1.23 cpu.h --- include/cpu.h 24 Jul 2010 00:45:56 -0000 1.23 +++ include/cpu.h 30 Jul 2010 07:06:50 -0000 @@ -95,6 +95,7 @@ struct cpu_info { int ci_fpused; /* XEN: FPU was used by curlwp */ cpuid_t ci_cpuid; /* our CPU ID */ int ci_cpumask; /* (1 << CPU ID) */ + uint32_t ci_acpiid; /* our ACPI/MADT ID */ uint32_t ci_initapicid; /* our intitial APIC ID */ struct cpu_data ci_data; /* MI per-cpu data */ Index: include/cpuvar.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/cpuvar.h,v retrieving revision 1.33 diff -u -p -r1.33 cpuvar.h --- include/cpuvar.h 6 Jul 2010 20:50:35 -0000 1.33 +++ include/cpuvar.h 30 Jul 2010 07:06:50 -0000 @@ -79,6 +79,7 @@ extern const struct cpu_functions mp_cpu #define CPU_ROLE_AP 2 struct cpu_attach_args { + int cpu_id; int cpu_number; int cpu_role; const struct cpu_functions *cpu_func; Index: x86/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/cpu.c,v retrieving revision 1.73 diff -u -p -r1.73 cpu.c --- x86/cpu.c 24 Jul 2010 00:45:56 -0000 1.73 +++ x86/cpu.c 30 Jul 2010 07:06:50 -0000 @@ -330,6 +330,7 @@ cpu_attach(device_t parent, device_t sel ci->ci_self = ci; sc->sc_info = ci; ci->ci_dev = self; + ci->ci_acpiid = caa->cpu_id; ci->ci_cpuid = caa->cpu_number; ci->ci_func = caa->cpu_func; Index: x86/mpacpi.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/mpacpi.c,v retrieving revision 1.87 diff -u -p -r1.87 mpacpi.c --- x86/mpacpi.c 27 Apr 2010 05:34:14 -0000 1.87 +++ x86/mpacpi.c 30 Jul 2010 07:06:51 -0000 @@ -383,6 +383,7 @@ mpacpi_config_cpu(ACPI_SUBTABLE_HEADER * caa.cpu_role = CPU_ROLE_AP; else caa.cpu_role = CPU_ROLE_BP; + caa.cpu_id = lapic->ProcessorId; caa.cpu_number = lapic->Id; caa.cpu_func = &mp_cpu_funcs; locs[CPUBUSCF_APID] = caa.cpu_number; @@ -409,6 +410,7 @@ mpacpi_config_cpu(ACPI_SUBTABLE_HEADER * caa.cpu_role = CPU_ROLE_AP; else caa.cpu_role = CPU_ROLE_BP; + caa.cpu_id = x2apic->Uid; caa.cpu_number = x2apic->LocalApicId; caa.cpu_func = &mp_cpu_funcs; locs[CPUBUSCF_APID] = caa.cpu_number; Index: x86/mpbios.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/mpbios.c,v retrieving revision 1.57 diff -u -p -r1.57 mpbios.c --- x86/mpbios.c 18 Apr 2010 23:47:51 -0000 1.57 +++ x86/mpbios.c 30 Jul 2010 07:06:51 -0000 @@ -717,6 +717,7 @@ mpbios_cpu(const uint8_t *ent, device_t else caa.cpu_role = CPU_ROLE_AP; + caa.cpu_id = entry->apic_id; caa.cpu_number = entry->apic_id; caa.cpu_func = &mp_cpu_funcs; locs[CPUBUSCF_APID] = caa.cpu_number; Index: acpi_cpu.c =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpi_cpu.c,v retrieving revision 1.10 diff -u -p -r1.10 acpi_cpu.c --- acpi_cpu.c 30 Jul 2010 06:11:14 -0000 1.10 +++ acpi_cpu.c 30 Jul 2010 07:08:02 -0000 @@ -270,8 +270,12 @@ acpicpu_id(uint32_t id) for (CPU_INFO_FOREACH(cii, ci)) { - if (id == ci->ci_cpuid) + if (id == ci->ci_acpiid) { + printf("ACPI CPU: " + "ACPI ID %u, MADT ID %u, LAPIC ID %u\n", + id, ci->ci_acpiid, (uint32_t)ci->ci_cpuid); return id; + } } return 0xFFFFFF;