[LinuxBIOS] Local APIC IDs for dual Xeons

Steve Magnani steve at digidescorp.com
Fri Jul 1 06:36:45 CEST 2005


I haven't completely unraveled this yet, but I'm pretty sure that one
reason my second Xeon chip won't start is due to a nested spin_lock within
the 2nd chip's execution path.

Since my board is similar to the Tyan s2735 I use the same setting,
CONFIG_MAX_CPUS = 4. If I am tracing the code correctly, I believe that
results in the following sequence of calls to bring up the CPUs. The "CPU
#x" header shows which logical CPU executes each set of calls.

CPU #0 (APIC ID 0, Xeon Chip 0, Logical processor 0):
northbridge.c:      cpu_bus_init
lapic_cpu_init.c:    initialize_cpus
cpu.c:                cpu_initialize
model_f2x_init.c:      model_f2x_init
intel_sibling.c:        intel_sibling_init
lapic_cpu_init.c:        start_cpu (APIC ID 1)
                          spin_lock(&start_cpu_lock)
lapic_cpu_init.c:         lapic_start_cpu
                          spin_unlock(&start_cpu_lock)
lapic_cpu_init.c:     initialize_other_cpus
lapic_cpu_init.c:      start_cpu(APIC ID 6)
                        spin_lock(&start_cpu_lock)
lapic_cpu_init.c:       lapic_start_cpu
                        spin_unlock(&start_cpu_lock)


CPU #1 (APIC ID 1, Xeon Chip 0, Logical processor 1):
lapic_cpu_init.c:   secondary_cpu_init
                     spin_lock(&start_cpu_lock)
cpu.c:               cpu_initialize
model_f2x_init.c:      model_f2x_init
intel_sibling.c:        intel_sibling_init (no-op)
                     spin_unlock(&start_cpu_lock)
lapic.h:             stop_this_cpu


CPU #2 (APIC ID 6, Xeon Chip 1, Logical processor 0):
lapic_cpu_init.c:   secondary_cpu_init
                     spin_lock(&start_cpu_lock)
cpu.c:               cpu_initialize
model_f2x_init.c:      model_f2x_init
intel_sibling.c:        intel_sibling_init
lapic_cpu_init.c:        start_cpu (APIC ID 7)
                          spin_lock(&start_cpu_lock)
lapic_cpu_init.c:         lapic_start_cpu
                          spin_unlock(&start_cpu_lock)
                     spin_unlock(&start_cpu_lock)
lapic.h:             stop_this_cpu
                       
                          
CPU #3 (APIC ID 7, Xeon Chip 1, Logical processor 1):
lapic_cpu_init.c:   secondary_cpu_init
                     spin_lock(&start_cpu_lock)
cpu.c:               cpu_initialize
model_f2x_init.c:      model_f2x_init
intel_sibling.c:        intel_sibling_init (no-op)
                     spin_unlock(&start_cpu_lock)
lapic.h:             stop_this_cpu


It sure looks to me like the CPU #2 call sequence tries to grab the
start_cpu_lock twice. 

Steve






More information about the coreboot mailing list