arm64/efi: set PE/COFF file alignment to 512 bytes
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 10 Oct 2014 16:42:55 +0000 (18:42 +0200)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 5 Nov 2014 08:03:09 +0000 (09:03 +0100)
Change our PE/COFF header to use the minimum file alignment of
512 bytes (0x200), as mandated by the PE/COFF spec v8.3

Also update the linker script so that the Image file itself is also a
round multiple of FileAlignment.

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Roy Franz <roy.franz@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
arch/arm64/kernel/head.S
arch/arm64/kernel/vmlinux.lds.S

index 8ae84d8..5a76e3a 100644 (file)
@@ -162,7 +162,7 @@ optional_header:
 extra_header_fields:
        .quad   0                               // ImageBase
        .long   0x1000                          // SectionAlignment
-       .long   0x8                             // FileAlignment
+       .long   PECOFF_FILE_ALIGNMENT           // FileAlignment
        .short  0                               // MajorOperatingSystemVersion
        .short  0                               // MinorOperatingSystemVersion
        .short  0                               // MajorImageVersion
index edf8715..4596f46 100644 (file)
@@ -32,6 +32,22 @@ jiffies = jiffies_64;
        *(.hyp.text)                                    \
        VMLINUX_SYMBOL(__hyp_text_end) = .;
 
+/*
+ * The size of the PE/COFF section that covers the kernel image, which
+ * runs from stext to _edata, must be a round multiple of the PE/COFF
+ * FileAlignment, which we set to its minimum value of 0x200. 'stext'
+ * itself is 4 KB aligned, so padding out _edata to a 0x200 aligned
+ * boundary should be sufficient.
+ */
+PECOFF_FILE_ALIGNMENT = 0x200;
+
+#ifdef CONFIG_EFI
+#define PECOFF_EDATA_PADDING   \
+       .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
+#else
+#define PECOFF_EDATA_PADDING
+#endif
+
 SECTIONS
 {
        /*
@@ -103,6 +119,7 @@ SECTIONS
        _data = .;
        _sdata = .;
        RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE)
+       PECOFF_EDATA_PADDING
        _edata = .;
 
        BSS_SECTION(0, 0, 0)