Commit dd0f2bdf authored by Manfred Spraul's avatar Manfred Spraul Committed by Linus Torvalds

[PATCH] Avoid overwriting boot_cpu_data from trampoline code

boot_cpu_data should contain the common capabilities of all cpus in the
system. identify_cpu [arch/i386/kernel/cpu/common.c] tries to enforce
that. But right now, the SMP trampoline code [arch/i386/kernel/head.S]
overwrites boot_cpu_data when the secondary cpus are started, i.e.
boot_cpu_data contains the capabilities from the last cpu that booted :-(

The attached patch adds a new, __initdata variable for the asm code.
parent 576d92d6
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
#define NEW_CL_POINTER 0x228 /* Relative to real mode data */ #define NEW_CL_POINTER 0x228 /* Relative to real mode data */
/* /*
* References to members of the boot_cpu_data structure. * References to members of the new_cpu_data structure.
*/ */
#define CPU_PARAMS boot_cpu_data #define CPU_PARAMS new_cpu_data
#define X86 CPU_PARAMS+0 #define X86 CPU_PARAMS+0
#define X86_VENDOR CPU_PARAMS+1 #define X86_VENDOR CPU_PARAMS+1
#define X86_MODEL CPU_PARAMS+2 #define X86_MODEL CPU_PARAMS+2
......
...@@ -50,6 +50,9 @@ static inline char * __init machine_specific_memory_setup(void); ...@@ -50,6 +50,9 @@ static inline char * __init machine_specific_memory_setup(void);
*/ */
char ignore_irq13; /* set if exception 16 works */ char ignore_irq13; /* set if exception 16 works */
/* cpu data as detected by the assembly code in head.S */
struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
/* common cpu data for all cpus */
struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
unsigned long mmu_cr4_features; unsigned long mmu_cr4_features;
...@@ -840,6 +843,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -840,6 +843,7 @@ void __init setup_arch(char **cmdline_p)
{ {
unsigned long max_low_pfn; unsigned long max_low_pfn;
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
pre_setup_arch_hook(); pre_setup_arch_hook();
early_cpu_init(); early_cpu_init();
......
...@@ -78,6 +78,7 @@ struct cpuinfo_x86 { ...@@ -78,6 +78,7 @@ struct cpuinfo_x86 {
*/ */
extern struct cpuinfo_x86 boot_cpu_data; extern struct cpuinfo_x86 boot_cpu_data;
extern struct cpuinfo_x86 new_cpu_data;
extern struct tss_struct init_tss[NR_CPUS]; extern struct tss_struct init_tss[NR_CPUS];
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment