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:
Родитель
98f75b8291
Коммит
f3670394c2
|
@ -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,7 +385,18 @@ 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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче