Skip to content

Commit

Permalink
Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linu…
Browse files Browse the repository at this point in the history
…x/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
  • Loading branch information
torvalds committed May 23, 2012
2 parents e7b30a1 + a9aff3e commit 8ca038d
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 23 deletions.
14 changes: 11 additions & 3 deletions arch/x86/boot/compressed/eboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 9 additions & 17 deletions arch/x86/boot/header.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -469,10 +468,3 @@ setup_corrupt:

.data
dummy: .long 0

.section .reloc
reloc_start:
.long dummy - reloc_start
.long 10
.word 0
reloc_end:
24 changes: 21 additions & 3 deletions arch/x86/boot/tools/build.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand All @@ -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 */

Expand Down

0 comments on commit 8ca038d

Please sign in to comment.