Revert "x86/efi: Fixup GOT in all boot code paths"
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Sep 2014 06:05:49 +0000 (23:05 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Sep 2014 06:05:49 +0000 (23:05 -0700)
This reverts commit 9cb0e394234d244fe5a97e743ec9dd7ddff7e64b.

It causes my Sony Vaio Pro 11 to immediately reboot at startup.

Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: Peter Anvin <hpa@zytor.com>
Cc: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/boot/compressed/head_32.S
arch/x86/boot/compressed/head_64.S

index d6b8aa4c986c038fa12d3f76242ea7d738f2b329..cbed1407a5cdb7ead8fa0cae90d2e7902133aaa7 100644 (file)
 #include <asm/boot.h>
 #include <asm/asm-offsets.h>
 
-/*
- * Adjust our own GOT
- *
- * The relocation base must be in %ebx
- *
- * It is safe to call this macro more than once, because in some of the
- * code paths multiple invocations are inevitable, e.g. via the efi*
- * entry points.
- *
- * Relocation is only performed the first time.
- */
-.macro FIXUP_GOT
-       cmpb    $1, got_fixed(%ebx)
-       je      2f
-
-       leal    _got(%ebx), %edx
-       leal    _egot(%ebx), %ecx
-1:
-       cmpl    %ecx, %edx
-       jae     2f
-       addl    %ebx, (%edx)
-       addl    $4, %edx
-       jmp     1b
-2:
-       movb    $1, got_fixed(%ebx)
-.endm
-
        __HEAD
 ENTRY(startup_32)
 #ifdef CONFIG_EFI_STUB
@@ -83,9 +56,6 @@ ENTRY(efi_pe_entry)
        add     %esi, 88(%eax)
        pushl   %eax
 
-       movl    %esi, %ebx
-       FIXUP_GOT
-
        call    make_boot_params
        cmpl    $0, %eax
        je      fail
@@ -111,10 +81,6 @@ ENTRY(efi32_stub_entry)
        leal    efi32_config(%esi), %eax
        add     %esi, 88(%eax)
        pushl   %eax
-
-       movl    %esi, %ebx
-       FIXUP_GOT
-
 2:
        call    efi_main
        cmpl    $0, %eax
@@ -224,7 +190,19 @@ relocated:
        shrl    $2, %ecx
        rep     stosl
 
-       FIXUP_GOT
+/*
+ * Adjust our own GOT
+ */
+       leal    _got(%ebx), %edx
+       leal    _egot(%ebx), %ecx
+1:
+       cmpl    %ecx, %edx
+       jae     2f
+       addl    %ebx, (%edx)
+       addl    $4, %edx
+       jmp     1b
+2:
+
 /*
  * Do the decompression, and jump to the new kernel..
  */
@@ -247,12 +225,8 @@ relocated:
        xorl    %ebx, %ebx
        jmp     *%eax
 
-       .data
-/* Have we relocated the GOT? */
-got_fixed:
-       .byte 0
-
 #ifdef CONFIG_EFI_STUB
+       .data
 efi32_config:
        .fill 11,8,0
        .long efi_call_phys
index 50f69c7eaaf4bc98b14ad68f76cd2d262982a19a..2884e0c3e8a5880411ce63955b01c103e6eabd00 100644 (file)
 #include <asm/processor-flags.h>
 #include <asm/asm-offsets.h>
 
-/*
- * Adjust our own GOT
- *
- * The relocation base must be in %rbx
- *
- * It is safe to call this macro more than once, because in some of the
- * code paths multiple invocations are inevitable, e.g. via the efi*
- * entry points.
- *
- * Relocation is only performed the first time.
- */
-.macro FIXUP_GOT
-       cmpb    $1, got_fixed(%rip)
-       je      2f
-
-       leaq    _got(%rip), %rdx
-       leaq    _egot(%rip), %rcx
-1:
-       cmpq    %rcx, %rdx
-       jae     2f
-       addq    %rbx, (%rdx)
-       addq    $8, %rdx
-       jmp     1b
-2:
-       movb    $1, got_fixed(%rip)
-.endm
-
        __HEAD
        .code32
 ENTRY(startup_32)
@@ -279,13 +252,10 @@ ENTRY(efi_pe_entry)
        subq    $1b, %rbp
 
        /*
-        * Relocate efi_config->call() and the GOT entries.
+        * Relocate efi_config->call().
         */
        addq    %rbp, efi64_config+88(%rip)
 
-       movq    %rbp, %rbx
-       FIXUP_GOT
-
        movq    %rax, %rdi
        call    make_boot_params
        cmpq    $0,%rax
@@ -301,13 +271,10 @@ handover_entry:
        subq    $1b, %rbp
 
        /*
-        * Relocate efi_config->call() and the GOT entries.
+        * Relocate efi_config->call().
         */
        movq    efi_config(%rip), %rax
        addq    %rbp, 88(%rax)
-
-       movq    %rbp, %rbx
-       FIXUP_GOT
 2:
        movq    efi_config(%rip), %rdi
        call    efi_main
@@ -418,8 +385,19 @@ relocated:
        shrq    $3, %rcx
        rep     stosq
 
-       FIXUP_GOT
-
+/*
+ * Adjust our own GOT
+ */
+       leaq    _got(%rip), %rdx
+       leaq    _egot(%rip), %rcx
+1:
+       cmpq    %rcx, %rdx
+       jae     2f
+       addq    %rbx, (%rdx)
+       addq    $8, %rdx
+       jmp     1b
+2:
+       
 /*
  * Do the decompression, and jump to the new kernel..
  */
@@ -459,10 +437,6 @@ gdt:
        .quad   0x0000000000000000      /* TS continued */
 gdt_end:
 
-/* Have we relocated the GOT? */
-got_fixed:
-       .byte   0
-
 #ifdef CONFIG_EFI_STUB
 efi_config:
        .quad   0