Revert "x86/efi: Fixup GOT in all boot code paths"

This reverts commit 9cb0e39423.

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>
This commit is contained in:
Linus Torvalds 2014-09-22 23:05:49 -07:00
Родитель 98f75b8291
Коммит f3670394c2
2 изменённых файлов: 29 добавлений и 81 удалений

Просмотреть файл

@ -30,33 +30,6 @@
#include <asm/boot.h> #include <asm/boot.h>
#include <asm/asm-offsets.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 __HEAD
ENTRY(startup_32) ENTRY(startup_32)
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
@ -83,9 +56,6 @@ ENTRY(efi_pe_entry)
add %esi, 88(%eax) add %esi, 88(%eax)
pushl %eax pushl %eax
movl %esi, %ebx
FIXUP_GOT
call make_boot_params call make_boot_params
cmpl $0, %eax cmpl $0, %eax
je fail je fail
@ -111,10 +81,6 @@ ENTRY(efi32_stub_entry)
leal efi32_config(%esi), %eax leal efi32_config(%esi), %eax
add %esi, 88(%eax) add %esi, 88(%eax)
pushl %eax pushl %eax
movl %esi, %ebx
FIXUP_GOT
2: 2:
call efi_main call efi_main
cmpl $0, %eax cmpl $0, %eax
@ -224,7 +190,19 @@ relocated:
shrl $2, %ecx shrl $2, %ecx
rep stosl 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.. * Do the decompression, and jump to the new kernel..
*/ */
@ -247,12 +225,8 @@ relocated:
xorl %ebx, %ebx xorl %ebx, %ebx
jmp *%eax jmp *%eax
.data
/* Have we relocated the GOT? */
got_fixed:
.byte 0
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
.data
efi32_config: efi32_config:
.fill 11,8,0 .fill 11,8,0
.long efi_call_phys .long efi_call_phys

Просмотреть файл

@ -32,33 +32,6 @@
#include <asm/processor-flags.h> #include <asm/processor-flags.h>
#include <asm/asm-offsets.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 __HEAD
.code32 .code32
ENTRY(startup_32) ENTRY(startup_32)
@ -279,13 +252,10 @@ ENTRY(efi_pe_entry)
subq $1b, %rbp subq $1b, %rbp
/* /*
* Relocate efi_config->call() and the GOT entries. * Relocate efi_config->call().
*/ */
addq %rbp, efi64_config+88(%rip) addq %rbp, efi64_config+88(%rip)
movq %rbp, %rbx
FIXUP_GOT
movq %rax, %rdi movq %rax, %rdi
call make_boot_params call make_boot_params
cmpq $0,%rax cmpq $0,%rax
@ -301,13 +271,10 @@ handover_entry:
subq $1b, %rbp subq $1b, %rbp
/* /*
* Relocate efi_config->call() and the GOT entries. * Relocate efi_config->call().
*/ */
movq efi_config(%rip), %rax movq efi_config(%rip), %rax
addq %rbp, 88(%rax) addq %rbp, 88(%rax)
movq %rbp, %rbx
FIXUP_GOT
2: 2:
movq efi_config(%rip), %rdi movq efi_config(%rip), %rdi
call efi_main call efi_main
@ -418,8 +385,19 @@ relocated:
shrq $3, %rcx shrq $3, %rcx
rep stosq 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.. * Do the decompression, and jump to the new kernel..
*/ */
@ -459,10 +437,6 @@ gdt:
.quad 0x0000000000000000 /* TS continued */ .quad 0x0000000000000000 /* TS continued */
gdt_end: gdt_end:
/* Have we relocated the GOT? */
got_fixed:
.byte 0
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
efi_config: efi_config:
.quad 0 .quad 0