[haiku-commits] r37108 - in haiku/trunk: headers/private/kernel/arch/x86 src/system/boot/platform/bios_ia32 src/system/kernel/arch/x86

  • From: geist@xxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 12 Jun 2010 03:01:55 +0200 (CEST)

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


Other related posts:

  • » [haiku-commits] r37108 - in haiku/trunk: headers/private/kernel/arch/x86 src/system/boot/platform/bios_ia32 src/system/kernel/arch/x86 - geist