diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/smpboot_32.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/arch/x86/kernel/smpboot_32.c b/arch/x86/kernel/smpboot_32.c index d153d8423740..6be36d3eea4e 100644 --- a/arch/x86/kernel/smpboot_32.c +++ b/arch/x86/kernel/smpboot_32.c | |||
@@ -172,11 +172,23 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
172 | return 0; | 172 | return 0; |
173 | } | 173 | } |
174 | 174 | ||
175 | /* These are wrappers to interface to the new boot process. Someone | 175 | static void __init smp_cpu_index_default(void) |
176 | who understands all this stuff should rewrite it properly. --RR 15/Jul/02 */ | 176 | { |
177 | int i; | ||
178 | struct cpuinfo_x86 *c; | ||
179 | |||
180 | for_each_cpu_mask(i, cpu_possible_map) { | ||
181 | c = &cpu_data(i); | ||
182 | /* mark all to hotplug */ | ||
183 | c->cpu_index = NR_CPUS; | ||
184 | } | ||
185 | } | ||
186 | |||
177 | void __init native_smp_prepare_cpus(unsigned int max_cpus) | 187 | void __init native_smp_prepare_cpus(unsigned int max_cpus) |
178 | { | 188 | { |
179 | nmi_watchdog_default(); | 189 | nmi_watchdog_default(); |
190 | smp_cpu_index_default(); | ||
191 | current_cpu_data = boot_cpu_data; | ||
180 | cpu_callin_map = cpumask_of_cpu(0); | 192 | cpu_callin_map = cpumask_of_cpu(0); |
181 | mb(); | 193 | mb(); |
182 | 194 | ||
@@ -195,7 +207,11 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
195 | return; | 207 | return; |
196 | } | 208 | } |
197 | 209 | ||
198 | boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); | 210 | if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_physical_apicid) { |
211 | panic("Boot APIC ID in local APIC unexpected (%d vs %d)", | ||
212 | GET_APIC_ID(apic_read(APIC_ID)), boot_cpu_physical_apicid); | ||
213 | /* Or can we switch back to PIC here? */ | ||
214 | } | ||
199 | 215 | ||
200 | connect_bsp_APIC(); | 216 | connect_bsp_APIC(); |
201 | setup_local_APIC(); | 217 | setup_local_APIC(); |