summaryrefslogtreecommitdiffstats
path: root/Revert-x86-efi-Fixup-GOT-in-all-boot-code-paths.patch
diff options
context:
space:
mode:
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.patch209
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
+