| From 2b05b9c5cda0b50080cfd5539e4fac1a10cda108 Mon Sep 17 00:00:00 2001 |
| From: Nobel Barakat <nobelbarakat@google.com> |
| Date: Thu, 3 Nov 2022 11:04:06 -0700 |
| Subject: [PATCH] Revert "Modernize aarch64" |
| |
| This reverts commit d6eb9c6cc7826cea02f31580ac0e56726ae80ad5. |
| --- |
| .gitmodules | 2 +- |
| Make.defaults | 4 +- |
| elf_aarch64_efi.lds | 125 +++++++++++++++++++++++++------------------- |
| gnu-efi | 2 +- |
| 4 files changed, 75 insertions(+), 58 deletions(-) |
| |
| diff --git a/.gitmodules b/.gitmodules |
| index 78424fb..1029752 100644 |
| --- a/.gitmodules |
| +++ b/.gitmodules |
| @@ -1,4 +1,4 @@ |
| [submodule "gnu-efi"] |
| path = gnu-efi |
| url = https://github.com/rhboot/gnu-efi.git |
| - branch = shim-15.6 |
| + branch = shim-15.5 |
| diff --git a/Make.defaults b/Make.defaults |
| index dfed9c4..18677da 100644 |
| --- a/Make.defaults |
| +++ b/Make.defaults |
| @@ -84,7 +84,9 @@ ifeq ($(ARCH),aarch64) |
| ARCH_GNUEFI ?= aarch64 |
| ARCH_SUFFIX ?= aa64 |
| ARCH_SUFFIX_UPPER ?= AA64 |
| - ARCH_LDFLAGS ?= |
| + FORMAT := -O binary |
| + SUBSYSTEM := 0xa |
| + ARCH_LDFLAGS += --defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) |
| ARCH_CFLAGS ?= |
| endif |
| ifeq ($(ARCH),arm) |
| diff --git a/elf_aarch64_efi.lds b/elf_aarch64_efi.lds |
| index 60c55ba..42825fd 100644 |
| --- a/elf_aarch64_efi.lds |
| +++ b/elf_aarch64_efi.lds |
| @@ -3,94 +3,109 @@ OUTPUT_ARCH(aarch64) |
| ENTRY(_start) |
| SECTIONS |
| { |
| - . = 0; |
| - ImageBase = .; |
| - .hash : { *(.hash) } /* this MUST come first! */ |
| - . = ALIGN(4096); |
| - .eh_frame : |
| - { |
| - *(.eh_frame) |
| - } |
| - . = ALIGN(4096); |
| - .text : |
| - { |
| - _text = .; |
| - *(.text) |
| - *(.text.*) |
| - *(.gnu.linkonce.t.*) |
| - _etext = .; |
| - } |
| - . = ALIGN(4096); |
| - .reloc : |
| - { |
| - *(.reloc) |
| - } |
| - . = ALIGN(4096); |
| - .note.gnu.build-id : { |
| - *(.note.gnu.build-id) |
| - } |
| - |
| - . = ALIGN(4096); |
| - .data.ident : { |
| - *(.data.ident) |
| + .text 0x0 : { |
| + _text = .; |
| + *(.text.head) |
| + *(.text) |
| + *(.text.*) |
| + *(.gnu.linkonce.t.*) |
| + _evtext = .; |
| + . = ALIGN(4096); |
| } |
| + _etext = .; |
| + _text_size = . - _text; |
| + _text_vsize = _evtext - _text; |
| |
| . = ALIGN(4096); |
| .data : |
| { |
| _data = .; |
| - *(.rodata*) |
| + *(.sdata) |
| + *(.data) |
| + *(.data1) |
| + *(.data.*) |
| *(.got.plt) |
| *(.got) |
| - *(.data*) |
| - *(.sdata) |
| + |
| + *(.dynamic) |
| + |
| /* the EFI loader doesn't seem to like a .bss section, so we stick |
| it all into .data: */ |
| + . = ALIGN(16); |
| + _bss = .; |
| *(.sbss) |
| *(.scommon) |
| *(.dynbss) |
| *(.bss) |
| *(COMMON) |
| - *(.rel.local) |
| + _evdata = .; |
| + . = ALIGN(4096); |
| + _bss_end = .; |
| } |
| + _edata = .; |
| + _data_vsize = _evdata - _data; |
| + _data_size = . - _data; |
| |
| + /* |
| + * Note that _sbat must be the beginning of the data, and _esbat must be the |
| + * end and must be before any section padding. The sbat self-check uses |
| + * _esbat to find the bounds of the data, and if the padding is included, the |
| + * CSV parser (correctly) rejects the data as having NUL values in one of the |
| + * required columns. |
| + */ |
| . = ALIGN(4096); |
| - .vendor_cert : |
| + .sbat : |
| { |
| - *(.vendor_cert) |
| + _sbat = .; |
| + *(.sbat) |
| + *(.sbat.*) |
| + _esbat = .; |
| + . = ALIGN(4096); |
| + _epsbat = .; |
| } |
| + _sbat_size = _epsbat - _sbat; |
| + _sbat_vsize = _esbat - _sbat; |
| + |
| . = ALIGN(4096); |
| - .dynamic : { *(.dynamic) } |
| + .rodata : |
| + { |
| + _rodata = .; |
| + *(.rodata*) |
| + *(.srodata) |
| + . = ALIGN(16); |
| + *(.note.gnu.build-id) |
| + . = ALIGN(4096); |
| + *(.vendor_cert) |
| + *(.data.ident) |
| + . = ALIGN(4096); |
| + } |
| . = ALIGN(4096); |
| .rela : |
| { |
| + *(.rela.dyn) |
| + *(.rela.plt) |
| + *(.rela.got) |
| + *(.rela.data) |
| *(.rela.data*) |
| - *(.rela.got*) |
| - *(.rela.stab*) |
| } |
| - _edata = .; |
| - _data_size = . - _data; |
| . = ALIGN(4096); |
| - .sbat : |
| + .dyn : |
| { |
| - _sbat = .; |
| - *(.sbat) |
| - *(.sbat.*) |
| + *(.dynsym) |
| + *(.dynstr) |
| + _evrodata = .; |
| + . = ALIGN(4096); |
| } |
| - _esbat = .; |
| - _sbat_size = . - _sbat; |
| + _erodata = .; |
| + _rodata_size = . - _rodata; |
| + _rodata_vsize = _evrodata - _rodata; |
| + _alldata_size = . - _data; |
| |
| - . = ALIGN(4096); |
| - .dynsym : { *(.dynsym) } |
| - . = ALIGN(4096); |
| - .dynstr : { *(.dynstr) } |
| - . = ALIGN(4096); |
| - .ignored.reloc : |
| + /DISCARD/ : |
| { |
| - *(.rela.reloc) |
| + *(.rel.reloc) |
| *(.eh_frame) |
| *(.note.GNU-stack) |
| } |
| .comment 0 : { *(.comment) } |
| - .note.gnu.build-id : { *(.note.gnu.build-id) } |
| } |
| diff --git a/gnu-efi/Make.defaults b/gnu-efi/Make.defaults |
| index 3b56150..5ce8f7c 100755 |
| --- a/gnu-efi/Make.defaults |
| +++ b/gnu-efi/Make.defaults |
| @@ -153,11 +153,13 @@ endif |
| # Set HAVE_EFI_OBJCOPY if objcopy understands --target efi-[app|bsdrv|rtdrv], |
| # otherwise we need to compose the PE/COFF header using the assembler |
| # |
| +ifneq ($(ARCH),aarch64) |
| ifneq ($(ARCH),arm) |
| ifneq ($(ARCH),mips64el) |
| export HAVE_EFI_OBJCOPY=y |
| endif |
| endif |
| +endif |
| |
| ifeq ($(ARCH),arm) |
| CFLAGS += -marm |
| diff --git a/gnu-efi/gnuefi/crt0-efi-aarch64.S b/gnu-efi/gnuefi/crt0-efi-aarch64.S |
| index 0fefec0..b20e4f4 100644 |
| --- a/gnu-efi/gnuefi/crt0-efi-aarch64.S |
| +++ b/gnu-efi/gnuefi/crt0-efi-aarch64.S |
| @@ -16,11 +16,136 @@ |
| * either version 2 of the License, or (at your option) any later version. |
| */ |
| |
| + .section .text.head |
| |
| - .text |
| - .align 12 |
| + /* |
| + * Magic "MZ" signature for PE/COFF |
| + */ |
| + .globl ImageBase |
| +ImageBase: |
| + .ascii "MZ" |
| + .skip 58 // 'MZ' + pad + offset == 64 |
| + .long pe_header - ImageBase // Offset to the PE header. |
| +pe_header: |
| + .ascii "PE" |
| + .short 0 |
| +coff_header: |
| + .short 0xaa64 // AArch64 |
| + .short 4 // nr_sections |
| + .long 0 // TimeDateStamp |
| + .long 0 // PointerToSymbolTable |
| + .long 1 // NumberOfSymbols |
| + .short section_table - optional_header // SizeOfOptionalHeader |
| + .short 0x206 // Characteristics. |
| + // IMAGE_FILE_DEBUG_STRIPPED | |
| + // IMAGE_FILE_EXECUTABLE_IMAGE | |
| + // IMAGE_FILE_LINE_NUMS_STRIPPED |
| +optional_header: |
| + .short 0x20b // PE32+ format |
| + .byte 0x02 // MajorLinkerVersion |
| + .byte 0x14 // MinorLinkerVersion |
| + .long _text_size // SizeOfCode |
| + .long _alldata_size // SizeOfInitializedData |
| + .long 0 // SizeOfUninitializedData |
| + .long _start - ImageBase // AddressOfEntryPoint |
| + .long _start - ImageBase // BaseOfCode |
| + |
| +extra_header_fields: |
| + .quad 0 // ImageBase |
| + .long 0x1000 // SectionAlignment |
| + .long 0x200 // FileAlignment |
| + .short 0 // MajorOperatingSystemVersion |
| + .short 0 // MinorOperatingSystemVersion |
| + .short 0 // MajorImageVersion |
| + .short 0 // MinorImageVersion |
| + .short 0 // MajorSubsystemVersion |
| + .short 0 // MinorSubsystemVersion |
| + .long 0 // Win32VersionValue |
| + |
| + .long _erodata - ImageBase // SizeOfImage |
| + |
| + // Everything before the kernel image is considered part of the header |
| + .long _start - ImageBase // SizeOfHeaders |
| + .long 0 // CheckSum |
| + .short EFI_SUBSYSTEM // Subsystem |
| + .short 0 // DllCharacteristics |
| + .quad 0 // SizeOfStackReserve |
| + .quad 0 // SizeOfStackCommit |
| + .quad 0 // SizeOfHeapReserve |
| + .quad 0 // SizeOfHeapCommit |
| + .long 0 // LoaderFlags |
| + .long 0x6 // NumberOfRvaAndSizes |
| + |
| + .quad 0 // ExportTable |
| + .quad 0 // ImportTable |
| + .quad 0 // ResourceTable |
| + .quad 0 // ExceptionTable |
| + .quad 0 // CertificationTable |
| + .quad 0 // BaseRelocationTable |
| + |
| + // Section table |
| +section_table: |
| + .ascii ".text\0\0\0" |
| + .long _evtext - _start // VirtualSize |
| + .long _start - ImageBase // VirtualAddress |
| + .long _etext - _start // SizeOfRawData |
| + .long _start - ImageBase // PointerToRawData |
| + |
| + .long 0 // PointerToRelocations (0 for executables) |
| + .long 0 // PointerToLineNumbers (0 for executables) |
| + .short 0 // NumberOfRelocations (0 for executables) |
| + .short 0 // NumberOfLineNumbers (0 for executables) |
| + /* |
| + * EFI_IMAGE_SCN_MEM_READ | EFI_IMAGE_SCN_MEM_EXECUTE | EFI_IMAGE_SCN_CNT_CODE |
| + */ |
| + .long 0x60000020 // Characteristics (section flags) |
| |
| - .globl _start |
| + .ascii ".data\0\0\0" |
| + .long _data_vsize // VirtualSize |
| + .long _data - ImageBase // VirtualAddress |
| + .long _data_size // SizeOfRawData |
| + .long _data - ImageBase // PointerToRawData |
| + |
| + .long 0 // PointerToRelocations (0 for executables) |
| + .long 0 // PointerToLineNumbers (0 for executables) |
| + .short 0 // NumberOfRelocations (0 for executables) |
| + .short 0 // NumberOfLineNumbers (0 for executables) |
| + /* |
| + * EFI_IMAGE_SCN_MEM_WRITE | EFI_IMAGE_SCN_MEM_READ | EFI_IMAGE_SCN_CNT_INITIALIZED_DATA |
| + */ |
| + .long 0xc0000040 // Characteristics (section flags) |
| + |
| + .ascii ".sbat\0\0\0" |
| + .long _sbat_vsize // VirtualSize |
| + .long _sbat - ImageBase // VirtualAddress |
| + .long _sbat_size // SizeOfRawData |
| + .long _sbat - ImageBase // PointerToRawData |
| + |
| + .long 0 // PointerToRelocations (0 for executables) |
| + .long 0 // PointerToLineNumbers (0 for executables) |
| + .short 0 // NumberOfRelocations (0 for executables) |
| + .short 0 // NumberOfLineNumbers (0 for executables) |
| + /* |
| + * EFI_IMAGE_SCN_MEM_READ | EFI_IMAGE_SCN_ALIGN_8BYTES | EFI_IMAGE_SCN_CNT_INITIALIZED_DATA |
| + */ |
| + .long 0x40400040 // Characteristics (section flags) |
| + |
| + .ascii ".rodata\0" |
| + .long _rodata_vsize // VirtualSize |
| + .long _rodata - ImageBase // VirtualAddress |
| + .long _rodata_size // SizeOfRawData |
| + .long _rodata - ImageBase // PointerToRawData |
| + |
| + .long 0 // PointerToRelocations (0 for executables) |
| + .long 0 // PointerToLineNumbers (0 for executables) |
| + .short 0 // NumberOfRelocations (0 for executables) |
| + .short 0 // NumberOfLineNumbers (0 for executables) |
| + /* |
| + * EFI_IMAGE_SCN_MEM_READ | EFI_IMAGE_SCN_ALIGN_8BYTES | EFI_IMAGE_SCN_CNT_INITIALIZED_DATA |
| + */ |
| + .long 0x40400040 // Characteristics (section flags) |
| + |
| + .align 12 |
| _start: |
| stp x29, x30, [sp, #-32]! |
| mov x29, sp |
| @@ -38,16 +163,4 @@ _start: |
| bl efi_main |
| |
| 0: ldp x29, x30, [sp], #32 |
| - ret |
| - |
| - // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: |
| - .data |
| -.dummy0: |
| -.dummy1: |
| - .4byte 0 |
| - |
| -#define IMAGE_REL_ABSOLUTE 0 |
| - .section .reloc, "a" |
| - .4byte .dummy1-.dummy0 // Page RVA |
| - .4byte 10 // Block Size (2*4+2) |
| - .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy |
| + ret |
| \ No newline at end of file |
| -- |
| 2.38.1.431.g37b22c650d-goog |
| |