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
This commit is contained in:
commit
8ca038dc10
3 changed files with 41 additions and 23 deletions
|
@ -904,11 +904,19 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
|
|||
|
||||
memset(boot_params, 0x0, 0x4000);
|
||||
|
||||
/* Copy first two sectors to boot_params */
|
||||
memcpy(boot_params, image->image_base, 1024);
|
||||
|
||||
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
|
||||
* anywhere in memory, but the kernel has various restrictions
|
||||
|
|
|
@ -147,7 +147,7 @@ optional_header:
|
|||
# Filled in by build.c
|
||||
.long 0x0000 # AddressOfEntryPoint
|
||||
|
||||
.long 0x0000 # BaseOfCode
|
||||
.long 0x0200 # BaseOfCode
|
||||
#ifdef CONFIG_X86_32
|
||||
.long 0 # data
|
||||
#endif
|
||||
|
@ -189,7 +189,7 @@ extra_header_fields:
|
|||
.quad 0 # SizeOfHeapCommit
|
||||
#endif
|
||||
.long 0 # LoaderFlags
|
||||
.long 0x1 # NumberOfRvaAndSizes
|
||||
.long 0x6 # NumberOfRvaAndSizes
|
||||
|
||||
.quad 0 # ExportTable
|
||||
.quad 0 # ImportTable
|
||||
|
@ -217,18 +217,17 @@ section_table:
|
|||
|
||||
#
|
||||
# The EFI application loader requires a relocation section
|
||||
# because EFI applications are relocatable and not having
|
||||
# this section seems to confuse it. But since we don't need
|
||||
# the loader to fixup any relocs for us just fill it with a
|
||||
# single dummy reloc.
|
||||
# because EFI applications must be relocatable. But since
|
||||
# we don't need the loader to fixup any relocs for us, we
|
||||
# just create an empty (zero-length) .reloc section header.
|
||||
#
|
||||
.ascii ".reloc"
|
||||
.byte 0
|
||||
.byte 0
|
||||
.long reloc_end - reloc_start
|
||||
.long reloc_start
|
||||
.long reloc_end - reloc_start # SizeOfRawData
|
||||
.long reloc_start # PointerToRawData
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0 # SizeOfRawData
|
||||
.long 0 # PointerToRawData
|
||||
.long 0 # PointerToRelocations
|
||||
.long 0 # PointerToLineNumbers
|
||||
.word 0 # NumberOfRelocations
|
||||
|
@ -469,10 +468,3 @@ setup_corrupt:
|
|||
|
||||
.data
|
||||
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)
|
|||
|
||||
pe_header = get_unaligned_le32(&buf[0x3c]);
|
||||
|
||||
/* Size of code */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0x1c]);
|
||||
|
||||
/* Size of image */
|
||||
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
|
||||
/*
|
||||
* Address of entry point.
|
||||
|
@ -216,8 +223,14 @@ int main(int argc, char ** argv)
|
|||
/* .text size */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0xb0]);
|
||||
|
||||
/* .text vma */
|
||||
put_unaligned_le32(0x200, &buf[pe_header + 0xb4]);
|
||||
|
||||
/* .text size of initialised data */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0xb8]);
|
||||
|
||||
/* .text file offset */
|
||||
put_unaligned_le32(0x200, &buf[pe_header + 0xbc]);
|
||||
#else
|
||||
/*
|
||||
* Address of entry point. startup_32 is at the beginning and
|
||||
|
@ -231,9 +244,14 @@ int main(int argc, char ** argv)
|
|||
/* .text size */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0xc0]);
|
||||
|
||||
/* .text vma */
|
||||
put_unaligned_le32(0x200, &buf[pe_header + 0xc4]);
|
||||
|
||||
/* .text size of initialised data */
|
||||
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_EFI_STUB */
|
||||
|
||||
|
|
Loading…
Reference in a new issue