summaryrefslogtreecommitdiffstats
path: root/arch/x86/boot/compressed/head_64.S
diff options
context:
space:
mode:
authorMatt Fleming <matt@console-pimps.org>2014-04-08 14:14:00 +0200
committerMatt Fleming <matt.fleming@intel.com>2014-04-10 22:19:52 +0200
commit7e8213c1f3acc064aef37813a39f13cbfe7c3ce7 (patch)
tree6a24e3cd7ca9994d165bd38e83567ab546d01a92 /arch/x86/boot/compressed/head_64.S
parentx86/efi: Fix boot failure with EFI stub (diff)
downloadlinux-7e8213c1f3acc064aef37813a39f13cbfe7c3ce7.tar.xz
linux-7e8213c1f3acc064aef37813a39f13cbfe7c3ce7.zip
x86/efi: Correct EFI boot stub use of code32_start
code32_start should point at the start of the protected mode code, and *not* at the beginning of the bzImage. This is much easier to do in assembly so document that callers of make_boot_params() need to fill out code32_start. The fallout from this bug is that we would end up relocating the image but copying the image at some offset, resulting in what appeared to be memory corruption. Reported-by: Thomas Bächler <thomas@archlinux.org> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'arch/x86/boot/compressed/head_64.S')
-rw-r--r--arch/x86/boot/compressed/head_64.S9
1 files changed, 3 insertions, 6 deletions
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 57e58a5fa210..0d558ee899ae 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -261,6 +261,8 @@ ENTRY(efi_pe_entry)
cmpq $0,%rax
je fail
mov %rax, %rsi
+ leaq startup_32(%rip), %rax
+ movl %eax, BP_code32_start(%rsi)
jmp 2f /* Skip the relocation */
handover_entry:
@@ -284,12 +286,7 @@ fail:
hlt
jmp fail
2:
- call 3f
-3:
- popq %rax
- subq $3b, %rax
- subq BP_pref_address(%rsi), %rax
- add BP_code32_start(%esi), %eax
+ movl BP_code32_start(%esi), %eax
leaq preferred_addr(%rax), %rax
jmp *%rax