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 0e275d49556..54b29bb24e7 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 |
