KVM: MMU: Remove unused varialbe in rmap_next()
[safe/jmp/linux-2.6] / arch / x86 / kernel / head_64.S
index 7a995d0..3d1e6f1 100644 (file)
 #include <linux/linkage.h>
 #include <linux/threads.h>
 #include <linux/init.h>
-#include <asm/desc.h>
 #include <asm/segment.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/msr.h>
 #include <asm/cache.h>
 #include <asm/processor-flags.h>
+#include <asm/percpu.h>
 
 #ifdef CONFIG_PARAVIRT
 #include <asm/asm-offsets.h>
@@ -27,7 +27,7 @@
 #define GET_CR2_INTO_RCX movq %cr2, %rcx
 #endif
 
-/* we are not able to switch in one step to the final KERNEL ADRESS SPACE
+/* we are not able to switch in one step to the final KERNEL ADDRESS SPACE
  * because we need identity-mapped pages.
  *
  */
@@ -40,7 +40,7 @@ L4_START_KERNEL = pgd_index(__START_KERNEL_map)
 L3_START_KERNEL = pud_index(__START_KERNEL_map)
 
        .text
-       .section .text.head
+       __HEAD
        .code64
        .globl startup_64
 startup_64:
@@ -204,23 +204,6 @@ ENTRY(secondary_startup_64)
        pushq $0
        popfq
 
-#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.
-        */
-       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)
-1:
-#endif
        /*
         * We must switch to a new descriptor in kernel space for the GDT
         * because soon the kernel won't have access anymore to the userspace
@@ -229,8 +212,8 @@ ENTRY(secondary_startup_64)
         */
        lgdt    early_gdt_descr(%rip)
 
-       /* set up data segments. actually 0 would do too */
-       movl $__KERNEL_DS,%eax
+       /* set up data segments */
+       xorl %eax,%eax
        movl %eax,%ds
        movl %eax,%ss
        movl %eax,%es
@@ -245,13 +228,10 @@ ENTRY(secondary_startup_64)
 
        /* Set up %gs.
         *
-        * On SMP, %gs should point to the per-cpu area.  For initial
-        * boot, make %gs point to the init data section.  For a
-        * secondary CPU,initial_gs should be set to its pda address
-        * before the CPU runs this code.
-        *
-        * On UP, initial_gs points to _boot_cpu_pda and doesn't
-        * change.
+        * The base of %gs always points to the bottom of the irqstack
+        * union.  If the stack protector canary is enabled, it is
+        * located at %gs:40.  Note that, on SMP, the boot cpu uses
+        * init data section till per cpu areas are set up.
         */
        movl    $MSR_GS_BASE,%ecx
        movq    initial_gs(%rip),%rax
@@ -281,16 +261,12 @@ ENTRY(secondary_startup_64)
        ENTRY(initial_code)
        .quad   x86_64_start_kernel
        ENTRY(initial_gs)
-#ifdef CONFIG_SMP
-       .quad   __per_cpu_load
-#else
-       .quad   _boot_cpu_pda
-#endif
-       __FINITDATA
+       .quad   INIT_PER_CPU_VAR(irq_stack_union)
 
        ENTRY(stack_start)
        .quad  init_thread_union+THREAD_SIZE-8
        .word  0
+       __FINITDATA
 
 bad_address:
        jmp bad_address
@@ -352,8 +328,6 @@ early_idt_ripmsg:
 #endif /* CONFIG_EARLY_PRINTK */
        .previous
 
-.balign PAGE_SIZE
-
 #define NEXT_PAGE(name) \
        .balign PAGE_SIZE; \
 ENTRY(name)
@@ -366,6 +340,7 @@ ENTRY(name)
        i = i + 1 ;                                     \
        .endr
 
+       .data
        /*
         * This default setting generates an ident mapping at address 0x100000
         * and a mapping for the kernel that precisely maps virtual address
@@ -430,12 +405,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
+       .quad   INIT_PER_CPU_VAR(gdt_page)
 
 ENTRY(phys_base)
        /* This must match the first entry in level2_kernel_pgt */
@@ -446,9 +417,9 @@ ENTRY(phys_base)
        .section .bss, "aw", @nobits
        .align L1_CACHE_BYTES
 ENTRY(idt_table)
-       .skip 256 * 16
+       .skip IDT_ENTRIES * 16
 
-       .section .bss.page_aligned, "aw", @nobits
+       __PAGE_ALIGNED_BSS
        .align PAGE_SIZE
 ENTRY(empty_zero_page)
        .skip PAGE_SIZE