Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 23 May 2012 17:40:34 +0000 (10:40 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 23 May 2012 17:40:34 +0000 (10:40 -0700)
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

arch/x86/boot/compressed/eboot.c
arch/x86/boot/header.S
arch/x86/boot/tools/build.c

index 0cdfc0d2315e51d84c0c0383bbd3b82020b52ceb..2c14e76bb4c71255ee9c1d9b29b171dd73a33d60 100644 (file)
@@ -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
index f1bbeeb091489d43267975234b0c0403e9cbffe5..8bbea6aa40d9705b68e1dd9531b7c9c74d96a106 100644 (file)
@@ -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:
index 24443a3320838ede8cdf995525851794e8d1052a..3f61f6e2b46f3ece150f20b409c1e652f3dd301b 100644 (file)
@@ -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 */