diff options
Diffstat (limited to 'Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch')
-rw-r--r-- | Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch b/Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch new file mode 100644 index 000000000..842901a6d --- /dev/null +++ b/Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch @@ -0,0 +1,209 @@ +From 6b57872f1ef945b97044a7fbbd75dfb526cd6aff Mon Sep 17 00:00:00 2001 +From: Josh Boyer <jwboyer@fedoraproject.org> +Date: Mon, 22 Sep 2014 14:45:11 -0400 +Subject: [PATCH] Revert "x86/efi: Fixup GOT in all boot code paths" + +This reverts commit 9cb0e394234d244fe5a97e743ec9dd7ddff7e64b. +--- + arch/x86/boot/compressed/head_32.S | 54 ++++++++++-------------------------- + arch/x86/boot/compressed/head_64.S | 56 ++++++++++---------------------------- + 2 files changed, 29 insertions(+), 81 deletions(-) + +diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S +index d6b8aa4c986c..cbed1407a5cd 100644 +--- a/arch/x86/boot/compressed/head_32.S ++++ b/arch/x86/boot/compressed/head_32.S +@@ -30,33 +30,6 @@ + #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 +diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S +index 50f69c7eaaf4..2884e0c3e8a5 100644 +--- a/arch/x86/boot/compressed/head_64.S ++++ b/arch/x86/boot/compressed/head_64.S +@@ -32,33 +32,6 @@ + #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 +-- +1.9.3 + |