Commit 8ca038dc authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 EFI updates from Ingo Molnar:
 "This patchset makes changes to the bzImage EFI header, so that it can
  be signed with a secure boot signature tool.  It should not affect
  anyone who is not using the EFI self-boot feature in any way."

* 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, efi: Fix NumberOfRvaAndSizes field in PE32 header for EFI_STUB
  x86, efi: Fix .text section overlapping image header for EFI_STUB
  x86, efi: Fix issue of overlapping .reloc section for EFI_STUB
parents e7b30a17 a9aff3ea
...@@ -904,11 +904,19 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table) ...@@ -904,11 +904,19 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
memset(boot_params, 0x0, 0x4000); memset(boot_params, 0x0, 0x4000);
/* Copy first two sectors to boot_params */
memcpy(boot_params, image->image_base, 1024);
hdr = &boot_params->hdr; hdr = &boot_params->hdr;
/* Copy the second sector to boot_params */
memcpy(&hdr->jump, image->image_base + 512, 512);
/*
* Fill out some of the header fields ourselves because the
* EFI firmware loader doesn't load the first sector.
*/
hdr->root_flags = 1;
hdr->vid_mode = 0xffff;
hdr->boot_flag = 0xAA55;
/* /*
* The EFI firmware loader could have placed the kernel image * The EFI firmware loader could have placed the kernel image
* anywhere in memory, but the kernel has various restrictions * anywhere in memory, but the kernel has various restrictions
......
...@@ -147,7 +147,7 @@ optional_header: ...@@ -147,7 +147,7 @@ optional_header:
# Filled in by build.c # Filled in by build.c
.long 0x0000 # AddressOfEntryPoint .long 0x0000 # AddressOfEntryPoint
.long 0x0000 # BaseOfCode .long 0x0200 # BaseOfCode
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
.long 0 # data .long 0 # data
#endif #endif
...@@ -189,7 +189,7 @@ extra_header_fields: ...@@ -189,7 +189,7 @@ extra_header_fields:
.quad 0 # SizeOfHeapCommit .quad 0 # SizeOfHeapCommit
#endif #endif
.long 0 # LoaderFlags .long 0 # LoaderFlags
.long 0x1 # NumberOfRvaAndSizes .long 0x6 # NumberOfRvaAndSizes
.quad 0 # ExportTable .quad 0 # ExportTable
.quad 0 # ImportTable .quad 0 # ImportTable
...@@ -217,18 +217,17 @@ section_table: ...@@ -217,18 +217,17 @@ section_table:
# #
# The EFI application loader requires a relocation section # The EFI application loader requires a relocation section
# because EFI applications are relocatable and not having # because EFI applications must be relocatable. But since
# this section seems to confuse it. But since we don't need # we don't need the loader to fixup any relocs for us, we
# the loader to fixup any relocs for us just fill it with a # just create an empty (zero-length) .reloc section header.
# single dummy reloc.
# #
.ascii ".reloc" .ascii ".reloc"
.byte 0 .byte 0
.byte 0 .byte 0
.long reloc_end - reloc_start .long 0
.long reloc_start .long 0
.long reloc_end - reloc_start # SizeOfRawData .long 0 # SizeOfRawData
.long reloc_start # PointerToRawData .long 0 # PointerToRawData
.long 0 # PointerToRelocations .long 0 # PointerToRelocations
.long 0 # PointerToLineNumbers .long 0 # PointerToLineNumbers
.word 0 # NumberOfRelocations .word 0 # NumberOfRelocations
...@@ -469,10 +468,3 @@ setup_corrupt: ...@@ -469,10 +468,3 @@ setup_corrupt:
.data .data
dummy: .long 0 dummy: .long 0
.section .reloc
reloc_start:
.long dummy - reloc_start
.long 10
.word 0
reloc_end:
...@@ -198,12 +198,19 @@ int main(int argc, char ** argv) ...@@ -198,12 +198,19 @@ int main(int argc, char ** argv)
pe_header = get_unaligned_le32(&buf[0x3c]); pe_header = get_unaligned_le32(&buf[0x3c]);
/* Size of code */
put_unaligned_le32(file_sz, &buf[pe_header + 0x1c]);
/* Size of image */ /* Size of image */
put_unaligned_le32(file_sz, &buf[pe_header + 0x50]); put_unaligned_le32(file_sz, &buf[pe_header + 0x50]);
/*
* Subtract the size of the first section (512 bytes) which
* includes the header and .reloc section. The remaining size
* is that of the .text section.
*/
file_sz -= 512;
/* Size of code */
put_unaligned_le32(file_sz, &buf[pe_header + 0x1c]);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/* /*
* Address of entry point. * Address of entry point.
...@@ -216,8 +223,14 @@ int main(int argc, char ** argv) ...@@ -216,8 +223,14 @@ int main(int argc, char ** argv)
/* .text size */ /* .text size */
put_unaligned_le32(file_sz, &buf[pe_header + 0xb0]); put_unaligned_le32(file_sz, &buf[pe_header + 0xb0]);
/* .text vma */
put_unaligned_le32(0x200, &buf[pe_header + 0xb4]);
/* .text size of initialised data */ /* .text size of initialised data */
put_unaligned_le32(file_sz, &buf[pe_header + 0xb8]); put_unaligned_le32(file_sz, &buf[pe_header + 0xb8]);
/* .text file offset */
put_unaligned_le32(0x200, &buf[pe_header + 0xbc]);
#else #else
/* /*
* Address of entry point. startup_32 is at the beginning and * Address of entry point. startup_32 is at the beginning and
...@@ -231,9 +244,14 @@ int main(int argc, char ** argv) ...@@ -231,9 +244,14 @@ int main(int argc, char ** argv)
/* .text size */ /* .text size */
put_unaligned_le32(file_sz, &buf[pe_header + 0xc0]); put_unaligned_le32(file_sz, &buf[pe_header + 0xc0]);
/* .text vma */
put_unaligned_le32(0x200, &buf[pe_header + 0xc4]);
/* .text size of initialised data */ /* .text size of initialised data */
put_unaligned_le32(file_sz, &buf[pe_header + 0xc8]); put_unaligned_le32(file_sz, &buf[pe_header + 0xc8]);
/* .text file offset */
put_unaligned_le32(0x200, &buf[pe_header + 0xcc]);
#endif /* CONFIG_X86_32 */ #endif /* CONFIG_X86_32 */
#endif /* CONFIG_EFI_STUB */ #endif /* CONFIG_EFI_STUB */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment