From 77708c792ffbe3b4309fbec7cbe4f63790d3359e Mon Sep 17 00:00:00 2001 From: Lionel Debroux Date: Sat, 1 Apr 2023 01:09:51 +0200 Subject: [PATCH] Add .osrel section to the EFI binaries so that boot loaders that support the "Boot Loader Spec" can better deal with memtest86+ automatically. Fixes #265. --- boot/x86/header.S | 26 ++++++++++++++++++++++++-- build/i586/ldscripts/memtest_efi.lds | 14 +++++++++++++- build/x86_64/ldscripts/memtest_efi.lds | 14 +++++++++++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/boot/x86/header.S b/boot/x86/header.S index ee50003..d69e07a 100644 --- a/boot/x86/header.S +++ b/boot/x86/header.S @@ -43,6 +43,7 @@ #include "boot.h" #include "build_version.h" #include "peimage.h" +#include "build_version.h" # The EFI loader loads the header at ImageBase, so we have to locate the main program # after that. This means we can't load the main program at HIGH_LOAD_ADDR. Pick a load @@ -805,7 +806,7 @@ coff_header: #else .word IMAGE_FILE_MACHINE_I386 # Machine (i386) #endif - .word 3 # NumberOfSections + .word 4 # NumberOfSections .long 0 # TimeDateStamp .long 0 # PointerToSymbolTable .long 0 # NumberOfSymbols @@ -833,7 +834,7 @@ optional_header: .byte 0x14 # MinorLinkerVersion .long _virt_text_size # SizeOfCode - .long _virt_sbat_size # SizeOfInitializedData + .long _virt_osrel_size # SizeOfInitializedData .long 0 # SizeOfUninitializedData .long _virt_text_start + 0x1e0 # AddressOfEntryPoint @@ -939,6 +940,20 @@ section_table: .long IMAGE_SCN_MEM_READ \ | IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags) + .ascii ".osrel" + .byte 0 + .byte 0 + .long _virt_osrel_size # VirtualSize + .long _virt_osrel_start # VirtualAddress + .long _file_osrel_size # SizeOfRawData + .long _file_osrel_start # PointerToRawData + .long 0 # PointerToRelocations + .long 0 # PointerToLineNumbers + .word 0 # NumberOfRelocations + .word 0 # NumberOfLineNumbers + .long IMAGE_SCN_MEM_READ \ + | IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags) + # Pad to the declared size. .org (SETUP_SECS*512) @@ -949,3 +964,10 @@ section_table: .section ".sbat", "a", @progbits .incbin "../boot/sbat.csv" + +.section ".osrel", "a", @progbits + .ascii "ID=memtest86plus\nNAME=\"memtest86+\"\nVERSION=\"" + .ascii MT_VERSION + .ascii "." + .asciz GIT_HASH + .ascii "\"" diff --git a/build/i586/ldscripts/memtest_efi.lds b/build/i586/ldscripts/memtest_efi.lds index 5b87ef8..d28e835 100644 --- a/build/i586/ldscripts/memtest_efi.lds +++ b/build/i586/ldscripts/memtest_efi.lds @@ -33,16 +33,26 @@ SECTIONS { _file_sbat_end = . ; } .shstrtab : { *(.shstrtab) } + .osrel : { + _file_osrel_start = . ; + *(.osrel) + _real_osrel_end = . ; + . = ALIGN(512); + _file_osrel_end = . ; + } + /DISCARD/ : { *(*) } _real_text_size = _real_text_end - _file_text_start; _real_reloc_size = _real_reloc_end - _file_reloc_start; _real_sbat_size = _real_sbat_end - _file_sbat_start; + _real_osrel_size = _real_osrel_end - _file_osrel_start; _file_head_size = _file_text_start; _file_text_size = _file_text_end - _file_text_start; _file_reloc_size = _file_reloc_end - _file_reloc_start; _file_sbat_size = _file_sbat_end - _file_sbat_start; + _file_osrel_size = _file_osrel_end - _file_osrel_start; _sys_size = (_real_text_size + 15) >> 4; _init_size = _real_text_size + _bss_size; @@ -51,12 +61,14 @@ SECTIONS { _virt_text_size = ((_init_size + 4095) >> 12) << 12; _virt_reloc_size = ((_file_reloc_size + 4095) >> 12) << 12; _virt_sbat_size = ((_file_sbat_size + 4095) >> 12) << 12; + _virt_osrel_size = ((_file_osrel_size + 4095) >> 12) << 12; _virt_text_start = _virt_head_size; _virt_reloc_start = _virt_text_start + _virt_text_size; _virt_sbat_start = _virt_reloc_start + _virt_reloc_size; + _virt_osrel_start = _virt_sbat_start + _virt_sbat_size; - _virt_img_size = _virt_sbat_start + _virt_sbat_size; + _virt_img_size = _virt_osrel_start + _virt_osrel_size; . = ASSERT(header == 0x202, "The setup header has the wrong offset!"); . = ASSERT(_file_text_start == 0x1000, "The .text is at the wrong offset!"); diff --git a/build/x86_64/ldscripts/memtest_efi.lds b/build/x86_64/ldscripts/memtest_efi.lds index dbcd4e8..b853b54 100644 --- a/build/x86_64/ldscripts/memtest_efi.lds +++ b/build/x86_64/ldscripts/memtest_efi.lds @@ -33,16 +33,26 @@ SECTIONS { _file_sbat_end = . ; } .shstrtab : { *(.shstrtab) } + .osrel : { + _file_osrel_start = . ; + *(.osrel) + _real_osrel_end = . ; + . = ALIGN(512); + _file_osrel_end = . ; + } + /DISCARD/ : { *(*) } _real_text_size = _real_text_end - _file_text_start; _real_reloc_size = _real_reloc_end - _file_reloc_start; _real_sbat_size = _real_sbat_end - _file_sbat_start; + _real_osrel_size = _real_osrel_end - _file_osrel_start; _file_head_size = _file_text_start; _file_text_size = _file_text_end - _file_text_start; _file_reloc_size = _file_reloc_end - _file_reloc_start; _file_sbat_size = _file_sbat_end - _file_sbat_start; + _file_osrel_size = _file_osrel_end - _file_osrel_start; _sys_size = (_real_text_size + 15) >> 4; _init_size = _real_text_size + _bss_size; @@ -51,12 +61,14 @@ SECTIONS { _virt_text_size = ((_init_size + 4095) >> 12) << 12; _virt_reloc_size = ((_file_reloc_size + 4095) >> 12) << 12; _virt_sbat_size = ((_file_sbat_size + 4095) >> 12) << 12; + _virt_osrel_size = ((_file_osrel_size + 4095) >> 12) << 12; _virt_text_start = _virt_head_size; _virt_reloc_start = _virt_text_start + _virt_text_size; _virt_sbat_start = _virt_reloc_start + _virt_reloc_size; + _virt_osrel_start = _virt_sbat_start + _virt_sbat_size; - _virt_img_size = _virt_sbat_start + _virt_sbat_size; + _virt_img_size = _virt_osrel_start + _virt_osrel_size; . = ASSERT(header == 0x202, "The setup header has the wrong offset!"); . = ASSERT(_file_text_start == 0x1000, "The .text is at the wrong offset!");