x86: rework __per_cpu_load adjustments
authorBrian Gerst <brgerst@gmail.com>
Mon, 19 Jan 2009 03:21:28 +0000 (12:21 +0900)
committerTejun Heo <tj@kernel.org>
Tue, 20 Jan 2009 03:29:20 +0000 (12:29 +0900)
Impact: cleanup

Use cpu_number to determine if the adjustment is necessary.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
arch/x86/kernel/head_64.S

index c8ace880661bb163579da7fadfacbe95b30384ed..98ea26a2fca159f2ca24d57d6051e6cf03968635 100644 (file)
@@ -207,19 +207,15 @@ ENTRY(secondary_startup_64)
 
 #ifdef CONFIG_SMP
        /*
-        * early_gdt_base should point to the gdt_page in static percpu init
-        * data area.  Computing this requires two symbols - __per_cpu_load
-        * and per_cpu__gdt_page.  As linker can't do no such relocation, do
-        * it by hand.  As early_gdt_descr is manipulated by C code for
-        * secondary CPUs, this should be done only once for the boot CPU
-        * when early_gdt_descr_base contains zero.
+        * Fix up static pointers that need __per_cpu_load added.  The assembler
+        * is unable to do this directly.  This is only needed for the boot cpu.
+        * These values are set up with the correct base addresses by C code for
+        * secondary cpus.
         */
-       movq    early_gdt_descr_base(%rip), %rax
-       testq   %rax, %rax
-       jnz     1f
-       movq    $__per_cpu_load, %rax
-       addq    $per_cpu__gdt_page, %rax
-       movq    %rax, early_gdt_descr_base(%rip)
+       movq    initial_gs(%rip), %rax
+       cmpl    $0, per_cpu__cpu_number(%rax)
+       jne     1f
+       addq    %rax, early_gdt_descr_base(%rip)
 1:
 #endif
        /*
@@ -431,12 +427,8 @@ NEXT_PAGE(level2_spare_pgt)
        .globl early_gdt_descr
 early_gdt_descr:
        .word   GDT_ENTRIES*8-1
-#ifdef CONFIG_SMP
 early_gdt_descr_base:
-       .quad   0x0000000000000000
-#else
        .quad   per_cpu__gdt_page
-#endif
 
 ENTRY(phys_base)
        /* This must match the first entry in level2_kernel_pgt */