diff options
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r-- | arch/x86/kernel/head_64.S | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 0e275d495563..54b29bb24e71 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/msr.h> | 19 | #include <asm/msr.h> |
20 | #include <asm/cache.h> | 20 | #include <asm/cache.h> |
21 | #include <asm/processor-flags.h> | 21 | #include <asm/processor-flags.h> |
22 | #include <asm/percpu.h> | ||
22 | 23 | ||
23 | #ifdef CONFIG_PARAVIRT | 24 | #ifdef CONFIG_PARAVIRT |
24 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
@@ -226,12 +227,15 @@ ENTRY(secondary_startup_64) | |||
226 | movl %eax,%fs | 227 | movl %eax,%fs |
227 | movl %eax,%gs | 228 | movl %eax,%gs |
228 | 229 | ||
229 | /* | 230 | /* Set up %gs. |
230 | * Setup up a dummy PDA. this is just for some early bootup code | 231 | * |
231 | * that does in_interrupt() | 232 | * The base of %gs always points to the bottom of the irqstack |
232 | */ | 233 | * union. If the stack protector canary is enabled, it is |
234 | * located at %gs:40. Note that, on SMP, the boot cpu uses | ||
235 | * init data section till per cpu areas are set up. | ||
236 | */ | ||
233 | movl $MSR_GS_BASE,%ecx | 237 | movl $MSR_GS_BASE,%ecx |
234 | movq $empty_zero_page,%rax | 238 | movq initial_gs(%rip),%rax |
235 | movq %rax,%rdx | 239 | movq %rax,%rdx |
236 | shrq $32,%rdx | 240 | shrq $32,%rdx |
237 | wrmsr | 241 | wrmsr |
@@ -257,6 +261,8 @@ ENTRY(secondary_startup_64) | |||
257 | .align 8 | 261 | .align 8 |
258 | ENTRY(initial_code) | 262 | ENTRY(initial_code) |
259 | .quad x86_64_start_kernel | 263 | .quad x86_64_start_kernel |
264 | ENTRY(initial_gs) | ||
265 | .quad INIT_PER_CPU_VAR(irq_stack_union) | ||
260 | __FINITDATA | 266 | __FINITDATA |
261 | 267 | ||
262 | ENTRY(stack_start) | 268 | ENTRY(stack_start) |
@@ -323,8 +329,6 @@ early_idt_ripmsg: | |||
323 | #endif /* CONFIG_EARLY_PRINTK */ | 329 | #endif /* CONFIG_EARLY_PRINTK */ |
324 | .previous | 330 | .previous |
325 | 331 | ||
326 | .balign PAGE_SIZE | ||
327 | |||
328 | #define NEXT_PAGE(name) \ | 332 | #define NEXT_PAGE(name) \ |
329 | .balign PAGE_SIZE; \ | 333 | .balign PAGE_SIZE; \ |
330 | ENTRY(name) | 334 | ENTRY(name) |
@@ -401,7 +405,8 @@ NEXT_PAGE(level2_spare_pgt) | |||
401 | .globl early_gdt_descr | 405 | .globl early_gdt_descr |
402 | early_gdt_descr: | 406 | early_gdt_descr: |
403 | .word GDT_ENTRIES*8-1 | 407 | .word GDT_ENTRIES*8-1 |
404 | .quad per_cpu__gdt_page | 408 | early_gdt_descr_base: |
409 | .quad INIT_PER_CPU_VAR(gdt_page) | ||
405 | 410 | ||
406 | ENTRY(phys_base) | 411 | ENTRY(phys_base) |
407 | /* This must match the first entry in level2_kernel_pgt */ | 412 | /* This must match the first entry in level2_kernel_pgt */ |
@@ -412,7 +417,7 @@ ENTRY(phys_base) | |||
412 | .section .bss, "aw", @nobits | 417 | .section .bss, "aw", @nobits |
413 | .align L1_CACHE_BYTES | 418 | .align L1_CACHE_BYTES |
414 | ENTRY(idt_table) | 419 | ENTRY(idt_table) |
415 | .skip 256 * 16 | 420 | .skip IDT_ENTRIES * 16 |
416 | 421 | ||
417 | .section .bss.page_aligned, "aw", @nobits | 422 | .section .bss.page_aligned, "aw", @nobits |
418 | .align PAGE_SIZE | 423 | .align PAGE_SIZE |