blob: 0c8d5cb4b7f5f78c9f6b8f083df00447253dd56f [file] [log] [blame]
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