Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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
+9 −17
Original line number Diff line number Diff line
@@ -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:
+21 −3
Original line number Diff line number Diff line
@@ -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 */