x86/boot/64: Push correct start_cpu() return address
[linux-2.6-microblaze.git] / arch / x86 / kernel / head_64.S
index b07cd27..b467b14 100644 (file)
@@ -112,20 +112,20 @@ startup_64:
        movq    %rdi, %rax
        shrq    $PGDIR_SHIFT, %rax
 
-       leaq    (4096 + _KERNPG_TABLE)(%rbx), %rdx
+       leaq    (PAGE_SIZE + _KERNPG_TABLE)(%rbx), %rdx
        movq    %rdx, 0(%rbx,%rax,8)
        movq    %rdx, 8(%rbx,%rax,8)
 
-       addq    $4096, %rdx
+       addq    $PAGE_SIZE, %rdx
        movq    %rdi, %rax
        shrq    $PUD_SHIFT, %rax
        andl    $(PTRS_PER_PUD-1), %eax
-       movq    %rdx, 4096(%rbx,%rax,8)
+       movq    %rdx, PAGE_SIZE(%rbx,%rax,8)
        incl    %eax
        andl    $(PTRS_PER_PUD-1), %eax
-       movq    %rdx, 4096(%rbx,%rax,8)
+       movq    %rdx, PAGE_SIZE(%rbx,%rax,8)
 
-       addq    $8192, %rbx
+       addq    $PAGE_SIZE * 2, %rbx
        movq    %rdi, %rax
        shrq    $PMD_SHIFT, %rdi
        addq    $(__PAGE_KERNEL_LARGE_EXEC & ~_PAGE_GLOBAL), %rax
@@ -142,6 +142,9 @@ startup_64:
        decl    %ecx
        jnz     1b
 
+       test %rbp, %rbp
+       jz .Lskip_fixup
+
        /*
         * Fixup the kernel text+data virtual addresses. Note that
         * we might write invalid pmds, when the kernel is relocated
@@ -149,9 +152,9 @@ startup_64:
         * beyond _end.
         */
        leaq    level2_kernel_pgt(%rip), %rdi
-       leaq    4096(%rdi), %r8
+       leaq    PAGE_SIZE(%rdi), %r8
        /* See if it is a valid page table entry */
-1:     testb   $1, 0(%rdi)
+1:     testb   $_PAGE_PRESENT, 0(%rdi)
        jz      2f
        addq    %rbp, 0(%rdi)
        /* Go to the next page */
@@ -162,6 +165,7 @@ startup_64:
        /* Fixup phys_base */
        addq    %rbp, phys_base(%rip)
 
+.Lskip_fixup:
        movq    $(early_level4_pgt - __START_KERNEL_map), %rax
        jmp 1f
 ENTRY(secondary_startup_64)
@@ -294,12 +298,13 @@ ENTRY(start_cpu)
         *      REX.W + FF /5 JMP m16:64 Jump far, absolute indirect,
         *              address given in m16:64.
         */
-       call    1f              # put return address on stack for unwinder
-1:     xorq    %rbp, %rbp      # clear frame pointer
+       pushq   $.Lafter_lret   # put return address on stack for unwinder
+       xorq    %rbp, %rbp      # clear frame pointer
        movq    initial_code(%rip), %rax
        pushq   $__KERNEL_CS    # set correct cs
        pushq   %rax            # target address in negative space
        lretq
+.Lafter_lret:
 ENDPROC(start_cpu)
 
 #include "verify_cpu.S"