Author: geist Date: 2010-06-12 03:01:54 +0200 (Sat, 12 Jun 2010) New Revision: 37108 Changeset: http://dev.haiku-os.org/changeset/37108/haiku Modified: haiku/trunk/headers/private/kernel/arch/x86/arch_kernel_args.h haiku/trunk/src/system/boot/platform/bios_ia32/smp.cpp haiku/trunk/src/system/kernel/arch/x86/arch_smp.cpp Log: SMP: remove the tracking of apic id -> cpu id. Don't pass between bootloader and kernel. Kernel doesn't use it, and it could be regenerated in the kernel if it did need it. This also unlocks the apic range the bios can use. Previously the apic ids would have to fit within 0..MAX_CPUS or it'd reject the cpu. Some boxes (mine in particular) seem to sparsely populate the apic id so that the range is pretty large. Modified: haiku/trunk/headers/private/kernel/arch/x86/arch_kernel_args.h =================================================================== --- haiku/trunk/headers/private/kernel/arch/x86/arch_kernel_args.h 2010-06-12 00:36:44 UTC (rev 37107) +++ haiku/trunk/headers/private/kernel/arch/x86/arch_kernel_args.h 2010-06-12 01:01:54 UTC (rev 37108) @@ -38,7 +38,6 @@ uint32 ioapic_phys; uint32 *ioapic; uint32 cpu_apic_id[MAX_BOOT_CPUS]; - uint32 cpu_os_id[MAX_BOOT_CPUS]; uint32 cpu_apic_version[MAX_BOOT_CPUS]; // hpet stuff uint32 hpet_phys; Modified: haiku/trunk/src/system/boot/platform/bios_ia32/smp.cpp =================================================================== --- haiku/trunk/src/system/boot/platform/bios_ia32/smp.cpp 2010-06-12 00:36:44 UTC (rev 37107) +++ haiku/trunk/src/system/boot/platform/bios_ia32/smp.cpp 2010-06-12 01:01:54 UTC (rev 37108) @@ -78,8 +78,13 @@ if (gKernelArgs.arch_args.apic == NULL) return 0; - return gKernelArgs.arch_args.cpu_os_id[ - (apic_read(APIC_ID) & 0xffffffff) >> 24]; + uint8_t apic_id = (apic_read(APIC_ID) & 0xffffffff) >> 24; + for (int i = 0; i < gKernelArgs.num_cpus; i++) { + if (gKernelArgs.arch_args.cpu_apic_id[i] == apic_id) + return i; + } + + return 0; } @@ -165,16 +170,8 @@ continue; } - // skip if the apic id is too large - if (processor->apic_id >= MAX_BOOT_CPUS) { - TRACE(("smp: apic id too large (%d)\n", processor->apic_id)); - continue; - } - gKernelArgs.arch_args.cpu_apic_id[gKernelArgs.num_cpus] = processor->apic_id; - gKernelArgs.arch_args.cpu_os_id[processor->apic_id] - = gKernelArgs.num_cpus; gKernelArgs.arch_args.cpu_apic_version[gKernelArgs.num_cpus] = processor->apic_version; @@ -280,16 +277,8 @@ break; } - // skip if the apic id is too large - if (localApic->apic_id >= MAX_BOOT_CPUS) { - TRACE(("smp: apic id too large (%d)\n", localApic->apic_id)); - break; - } - gKernelArgs.arch_args.cpu_apic_id[gKernelArgs.num_cpus] = localApic->apic_id; - gKernelArgs.arch_args.cpu_os_id[localApic->apic_id] - = gKernelArgs.num_cpus; // TODO: how to find out? putting 0x10 in to indicate a local apic gKernelArgs.arch_args.cpu_apic_version[gKernelArgs.num_cpus] = 0x10; Modified: haiku/trunk/src/system/kernel/arch/x86/arch_smp.cpp =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/arch_smp.cpp 2010-06-12 00:36:44 UTC (rev 37107) +++ haiku/trunk/src/system/kernel/arch/x86/arch_smp.cpp 2010-06-12 01:01:54 UTC (rev 37108) @@ -34,7 +34,6 @@ #endif static uint32 sCPUAPICIds[B_MAX_CPU_COUNT]; -static uint32 sCPUOSIds[B_MAX_CPU_COUNT]; static uint32 sAPICVersions[B_MAX_CPU_COUNT]; extern "C" void init_sse(void); @@ -84,7 +83,6 @@ // setup some globals memcpy(sCPUAPICIds, args->arch_args.cpu_apic_id, sizeof(args->arch_args.cpu_apic_id)); - memcpy(sCPUOSIds, args->arch_args.cpu_os_id, sizeof(args->arch_args.cpu_os_id)); memcpy(sAPICVersions, args->arch_args.cpu_apic_version, sizeof(args->arch_args.cpu_apic_version)); // set up the local apic on the boot cpu