|  | /* | 
|  | * SMP stuff which is common to all sub-architectures. | 
|  | */ | 
|  | #include <linux/module.h> | 
|  | #include <asm/smp.h> | 
|  |  | 
|  | #ifdef CONFIG_X86_32 | 
|  | DEFINE_PER_CPU(unsigned long, this_cpu_off); | 
|  | EXPORT_PER_CPU_SYMBOL(this_cpu_off); | 
|  |  | 
|  | /* Initialize the CPU's GDT.  This is either the boot CPU doing itself | 
|  | (still using the master per-cpu area), or a CPU doing it for a | 
|  | secondary which will soon come up. */ | 
|  | __cpuinit void init_gdt(int cpu) | 
|  | { | 
|  | struct desc_struct *gdt = get_cpu_gdt_table(cpu); | 
|  |  | 
|  | pack_descriptor(&gdt[GDT_ENTRY_PERCPU], | 
|  | __per_cpu_offset[cpu], 0xFFFFF, | 
|  | 0x2 | DESCTYPE_S, 0x8); | 
|  |  | 
|  | gdt[GDT_ENTRY_PERCPU].s = 1; | 
|  |  | 
|  | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | 
|  | per_cpu(cpu_number, cpu) = cpu; | 
|  | } | 
|  | #endif |