diff options
Diffstat (limited to 'kernels/linux-libre-pae/0007-Fix-the-use-of-code32_start-in-the-EFI-boot-stub.patch')
-rw-r--r-- | kernels/linux-libre-pae/0007-Fix-the-use-of-code32_start-in-the-EFI-boot-stub.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/kernels/linux-libre-pae/0007-Fix-the-use-of-code32_start-in-the-EFI-boot-stub.patch b/kernels/linux-libre-pae/0007-Fix-the-use-of-code32_start-in-the-EFI-boot-stub.patch new file mode 100644 index 000000000..8cf776842 --- /dev/null +++ b/kernels/linux-libre-pae/0007-Fix-the-use-of-code32_start-in-the-EFI-boot-stub.patch @@ -0,0 +1,96 @@ +From ec8ec8362c46fd86571204d0fcce11c03477e5c5 Mon Sep 17 00:00:00 2001 +From: Matt Fleming <matt@console-pimps.org> +Date: Wed, 9 Apr 2014 10:33:49 +0200 +Subject: [PATCH 7/7] Fix the use of code32_start in the EFI boot stub + +--- + arch/x86/boot/compressed/eboot.c | 5 +++-- + arch/x86/boot/compressed/head_32.S | 14 ++++++++------ + arch/x86/boot/compressed/head_64.S | 9 +++------ + 3 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c +index a7677ba..78cbb2d 100644 +--- a/arch/x86/boot/compressed/eboot.c ++++ b/arch/x86/boot/compressed/eboot.c +@@ -425,6 +425,9 @@ void setup_graphics(struct boot_params *boot_params) + * Because the x86 boot code expects to be passed a boot_params we + * need to create one ourselves (usually the bootloader would create + * one for us). ++ * ++ * The caller is responsible for filling out ->code32_start in the ++ * returned boot_params. + */ + struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) + { +@@ -483,8 +486,6 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) + hdr->vid_mode = 0xffff; + hdr->boot_flag = 0xAA55; + +- hdr->code32_start = (__u64)(unsigned long)image->image_base; +- + hdr->type_of_loader = 0x21; + + /* Convert unicode cmdline to ascii */ +diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S +index 9116aac..f45ab7a 100644 +--- a/arch/x86/boot/compressed/head_32.S ++++ b/arch/x86/boot/compressed/head_32.S +@@ -50,6 +50,13 @@ ENTRY(efi_pe_entry) + pushl %eax + pushl %esi + pushl %ecx ++ ++ call reloc ++reloc: ++ popl %ecx ++ subl reloc, %ecx ++ movl %ecx, BP_code32_start(%eax) ++ + sub $0x4, %esp + + ENTRY(efi_stub_entry) +@@ -63,12 +70,7 @@ ENTRY(efi_stub_entry) + hlt + jmp 1b + 2: +- call 3f +-3: +- popl %eax +- subl $3b, %eax +- subl BP_pref_address(%esi), %eax +- add BP_code32_start(%esi), %eax ++ movl BP_code32_start(%esi), %eax + leal preferred_addr(%eax), %eax + jmp *%eax + +diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S +index c5c1ae0..b10fa66 100644 +--- a/arch/x86/boot/compressed/head_64.S ++++ b/arch/x86/boot/compressed/head_64.S +@@ -217,6 +217,8 @@ ENTRY(efi_pe_entry) + cmpq $0,%rax + je 1f + mov %rax, %rdx ++ leaq startup_32(%rip), %rax ++ movl %eax, BP_code32_start(%rdx) + popq %rsi + popq %rdi + +@@ -230,12 +232,7 @@ ENTRY(efi_stub_entry) + hlt + jmp 1b + 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 + +-- +1.9.1 + |