aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/kernel/cpu/common.c13
-rw-r--r--arch/i386/kernel/smpboot.c9
-rw-r--r--arch/i386/mach-voyager/voyager_smp.c6
-rw-r--r--include/asm-i386/processor.h1
4 files changed, 22 insertions, 7 deletions
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
index 8689d62abd4a..8a8bbdaaf38a 100644
--- a/arch/i386/kernel/cpu/common.c
+++ b/arch/i386/kernel/cpu/common.c
@@ -710,11 +710,8 @@ __cpuinit int init_gdt(int cpu, struct task_struct *idle)
710 return 1; 710 return 1;
711} 711}
712 712
713/* Common CPU init for both boot and secondary CPUs */ 713void __cpuinit cpu_set_gdt(int cpu)
714static void __cpuinit _cpu_init(int cpu, struct task_struct *curr)
715{ 714{
716 struct tss_struct * t = &per_cpu(init_tss, cpu);
717 struct thread_struct *thread = &curr->thread;
718 struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu); 715 struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
719 716
720 /* Reinit these anyway, even if they've already been done (on 717 /* Reinit these anyway, even if they've already been done (on
@@ -722,6 +719,13 @@ static void __cpuinit _cpu_init(int cpu, struct task_struct *curr)
722 the real ones). */ 719 the real ones). */
723 load_gdt(cpu_gdt_descr); 720 load_gdt(cpu_gdt_descr);
724 set_kernel_gs(); 721 set_kernel_gs();
722}
723
724/* Common CPU init for both boot and secondary CPUs */
725static void __cpuinit _cpu_init(int cpu, struct task_struct *curr)
726{
727 struct tss_struct * t = &per_cpu(init_tss, cpu);
728 struct thread_struct *thread = &curr->thread;
725 729
726 if (cpu_test_and_set(cpu, cpu_initialized)) { 730 if (cpu_test_and_set(cpu, cpu_initialized)) {
727 printk(KERN_WARNING "CPU#%d already initialized!\n", cpu); 731 printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
@@ -807,6 +811,7 @@ void __cpuinit cpu_init(void)
807 local_irq_enable(); 811 local_irq_enable();
808 } 812 }
809 813
814 cpu_set_gdt(cpu);
810 _cpu_init(cpu, curr); 815 _cpu_init(cpu, curr);
811} 816}
812 817
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index dea7ef9d3e82..8c6c8c52b95c 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -596,6 +596,12 @@ static void __cpuinit start_secondary(void *unused)
596void __devinit initialize_secondary(void) 596void __devinit initialize_secondary(void)
597{ 597{
598 /* 598 /*
599 * switch to the per CPU GDT we already set up
600 * in do_boot_cpu()
601 */
602 cpu_set_gdt(current_thread_info()->cpu);
603
604 /*
599 * We don't actually need to load the full TSS, 605 * We don't actually need to load the full TSS,
600 * basically just the stack pointer and the eip. 606 * basically just the stack pointer and the eip.
601 */ 607 */
@@ -972,9 +978,6 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)
972 /* Stack for startup_32 can be just as for start_secondary onwards */ 978 /* Stack for startup_32 can be just as for start_secondary onwards */
973 stack_start.esp = (void *) idle->thread.esp; 979 stack_start.esp = (void *) idle->thread.esp;
974 980
975 start_pda = cpu_pda(cpu);
976 cpu_gdt_descr = per_cpu(cpu_gdt_descr, cpu);
977
978 irq_ctx_init(cpu); 981 irq_ctx_init(cpu);
979 982
980 x86_cpu_to_apicid[cpu] = apicid; 983 x86_cpu_to_apicid[cpu] = apicid;
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c
index 55428e656a3f..74aeedf277f4 100644
--- a/arch/i386/mach-voyager/voyager_smp.c
+++ b/arch/i386/mach-voyager/voyager_smp.c
@@ -773,6 +773,12 @@ initialize_secondary(void)
773#endif 773#endif
774 774
775 /* 775 /*
776 * switch to the per CPU GDT we already set up
777 * in do_boot_cpu()
778 */
779 cpu_set_gdt(current_thread_info()->cpu);
780
781 /*
776 * We don't actually need to load the full TSS, 782 * We don't actually need to load the full TSS,
777 * basically just the stack pointer and the eip. 783 * basically just the stack pointer and the eip.
778 */ 784 */
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h
index a52d65440429..359f10b54f59 100644
--- a/include/asm-i386/processor.h
+++ b/include/asm-i386/processor.h
@@ -743,6 +743,7 @@ extern void enable_sep_cpu(void);
743extern int sysenter_setup(void); 743extern int sysenter_setup(void);
744 744
745extern int init_gdt(int cpu, struct task_struct *idle); 745extern int init_gdt(int cpu, struct task_struct *idle);
746extern void cpu_set_gdt(int);
746extern void secondary_cpu_init(void); 747extern void secondary_cpu_init(void);
747 748
748#endif /* __ASM_I386_PROCESSOR_H */ 749#endif /* __ASM_I386_PROCESSOR_H */