Commit 832187f0 authored by Ard Biesheuvel's avatar Ard Biesheuvel

efi/x86: Drop redundant .bss section

In commit

  c7fb93ec ("x86/efi: Include a .bss section within the PE/COFF headers")

we added a separate .bss section to the PE/COFF header of the compressed
kernel describing the static memory footprint of the decompressor, to
ensure that it has enough headroom to decompress itself.

We can achieve the exact same result by increasing the virtual size of
the .text section, without changing the raw size, which, as per the
PE/COFF specification, requires the loader to zero initialize the delta.

Doing so frees up a slot in the section table, which we will use later
to describe the mixed mode entrypoint.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 223e3ee5
...@@ -106,7 +106,7 @@ coff_header: ...@@ -106,7 +106,7 @@ coff_header:
#else #else
.word 0x8664 # x86-64 .word 0x8664 # x86-64
#endif #endif
.word 4 # nr_sections .word 3 # nr_sections
.long 0 # TimeDateStamp .long 0 # TimeDateStamp
.long 0 # PointerToSymbolTable .long 0 # PointerToSymbolTable
.long 1 # NumberOfSymbols .long 1 # NumberOfSymbols
...@@ -248,25 +248,6 @@ section_table: ...@@ -248,25 +248,6 @@ section_table:
.word 0 # NumberOfLineNumbers .word 0 # NumberOfLineNumbers
.long 0x60500020 # Characteristics (section flags) .long 0x60500020 # Characteristics (section flags)
#
# The offset & size fields are filled in by build.c.
#
.ascii ".bss"
.byte 0
.byte 0
.byte 0
.byte 0
.long 0
.long 0x0
.long 0 # Size of initialized data
# on disk
.long 0x0
.long 0 # PointerToRelocations
.long 0 # PointerToLineNumbers
.word 0 # NumberOfRelocations
.word 0 # NumberOfLineNumbers
.long 0xc8000080 # Characteristics (section flags)
#endif /* CONFIG_EFI_STUB */ #endif /* CONFIG_EFI_STUB */
# Kernel attributes; used by setup. This is part 1 of the # Kernel attributes; used by setup. This is part 1 of the
......
...@@ -203,10 +203,12 @@ static void update_pecoff_setup_and_reloc(unsigned int size) ...@@ -203,10 +203,12 @@ static void update_pecoff_setup_and_reloc(unsigned int size)
put_unaligned_le32(10, &buf[reloc_offset + 4]); put_unaligned_le32(10, &buf[reloc_offset + 4]);
} }
static void update_pecoff_text(unsigned int text_start, unsigned int file_sz) static void update_pecoff_text(unsigned int text_start, unsigned int file_sz,
unsigned int init_sz)
{ {
unsigned int pe_header; unsigned int pe_header;
unsigned int text_sz = file_sz - text_start; unsigned int text_sz = file_sz - text_start;
unsigned int bss_sz = init_sz + text_start - file_sz;
pe_header = get_unaligned_le32(&buf[0x3c]); pe_header = get_unaligned_le32(&buf[0x3c]);
...@@ -214,30 +216,18 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz) ...@@ -214,30 +216,18 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
* Size of code: Subtract the size of the first sector (512 bytes) * Size of code: Subtract the size of the first sector (512 bytes)
* which includes the header. * which includes the header.
*/ */
put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]); put_unaligned_le32(file_sz - 512 + bss_sz, &buf[pe_header + 0x1c]);
/* Size of image */
put_unaligned_le32(init_sz + text_start, &buf[pe_header + 0x50]);
/* /*
* Address of entry point for PE/COFF executable * Address of entry point for PE/COFF executable
*/ */
put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]); put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]);
update_pecoff_section_header(".text", text_start, text_sz); update_pecoff_section_header_fields(".text", text_start, text_sz + bss_sz,
} text_sz, text_start);
static void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz)
{
unsigned int pe_header;
unsigned int bss_sz = init_sz - file_sz;
pe_header = get_unaligned_le32(&buf[0x3c]);
/* Size of uninitialized data */
put_unaligned_le32(bss_sz, &buf[pe_header + 0x24]);
/* Size of image */
put_unaligned_le32(init_sz, &buf[pe_header + 0x50]);
update_pecoff_section_header_fields(".bss", file_sz, bss_sz, 0, 0);
} }
static int reserve_pecoff_reloc_section(int c) static int reserve_pecoff_reloc_section(int c)
...@@ -278,9 +268,8 @@ static void efi_stub_entry_update(void) ...@@ -278,9 +268,8 @@ static void efi_stub_entry_update(void)
static inline void update_pecoff_setup_and_reloc(unsigned int size) {} static inline void update_pecoff_setup_and_reloc(unsigned int size) {}
static inline void update_pecoff_text(unsigned int text_start, static inline void update_pecoff_text(unsigned int text_start,
unsigned int file_sz) {} unsigned int file_sz,
static inline void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz) {}
unsigned int init_sz) {}
static inline void efi_stub_defaults(void) {} static inline void efi_stub_defaults(void) {}
static inline void efi_stub_entry_update(void) {} static inline void efi_stub_entry_update(void) {}
...@@ -406,9 +395,8 @@ int main(int argc, char ** argv) ...@@ -406,9 +395,8 @@ int main(int argc, char ** argv)
buf[0x1f1] = setup_sectors-1; buf[0x1f1] = setup_sectors-1;
put_unaligned_le32(sys_size, &buf[0x1f4]); put_unaligned_le32(sys_size, &buf[0x1f4]);
update_pecoff_text(setup_sectors * 512, i + (sys_size * 16));
init_sz = get_unaligned_le32(&buf[0x260]); init_sz = get_unaligned_le32(&buf[0x260]);
update_pecoff_bss(i + (sys_size * 16), init_sz + setup_sectors * 512); update_pecoff_text(setup_sectors * 512, i + (sys_size * 16), init_sz);
efi_stub_entry_update(); efi_stub_entry_update();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment