1/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */ 2/* 3 * crt0-efi-aarch64.S - PE/COFF header for aarch64 EFI applications 4 * 5 * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org> 6 * 7 * 8 * This file is taken and modified from the gnu-efi project. 9 */ 10 11#include <asm-generic/pe.h> 12 13 .section .text.head 14 15 /* 16 * Magic "MZ" signature for PE/COFF 17 */ 18 .globl ImageBase 19ImageBase: 20 .short IMAGE_DOS_SIGNATURE /* 'MZ' */ 21 .skip 58 /* 'MZ' + pad + offset == 64 */ 22 .long pe_header - ImageBase /* Offset to the PE header */ 23pe_header: 24 .long IMAGE_NT_SIGNATURE /* 'PE' */ 25coff_header: 26 .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 */ 27 .short 2 /* nr_sections */ 28 .long 0 /* TimeDateStamp */ 29 .long 0 /* PointerToSymbolTable */ 30 .long 0 /* NumberOfSymbols */ 31 .short section_table - optional_header /* SizeOfOptionalHeader */ 32 /* Characteristics */ 33 .short (IMAGE_FILE_EXECUTABLE_IMAGE | \ 34 IMAGE_FILE_LINE_NUMS_STRIPPED | \ 35 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \ 36 IMAGE_FILE_DEBUG_STRIPPED) 37optional_header: 38 .short IMAGE_NT_OPTIONAL_HDR64_MAGIC /* PE32+ format */ 39 .byte 0x02 /* MajorLinkerVersion */ 40 .byte 0x14 /* MinorLinkerVersion */ 41 .long _edata - _start /* SizeOfCode */ 42 .long 0 /* SizeOfInitializedData */ 43 .long 0 /* SizeOfUninitializedData */ 44 .long _start - ImageBase /* AddressOfEntryPoint */ 45 .long _start - ImageBase /* BaseOfCode */ 46 47extra_header_fields: 48 .quad 0 /* ImageBase */ 49 .long 0x20 /* SectionAlignment */ 50 .long 0x8 /* FileAlignment */ 51 .short 0 /* MajorOperatingSystemVersion */ 52 .short 0 /* MinorOperatingSystemVersion */ 53 .short 0 /* MajorImageVersion */ 54 .short 0 /* MinorImageVersion */ 55 .short 0 /* MajorSubsystemVersion */ 56 .short 0 /* MinorSubsystemVersion */ 57 .long 0 /* Win32VersionValue */ 58 59 .long _edata - ImageBase /* SizeOfImage */ 60 61 /* 62 * Everything before the kernel image is considered part of the header 63 */ 64 .long _start - ImageBase /* SizeOfHeaders */ 65 .long 0 /* CheckSum */ 66 .short IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */ 67 .short 0 /* DllCharacteristics */ 68 .quad 0 /* SizeOfStackReserve */ 69 .quad 0 /* SizeOfStackCommit */ 70 .quad 0 /* SizeOfHeapReserve */ 71 .quad 0 /* SizeOfHeapCommit */ 72 .long 0 /* LoaderFlags */ 73 .long 0x6 /* NumberOfRvaAndSizes */ 74 75 .quad 0 /* ExportTable */ 76 .quad 0 /* ImportTable */ 77 .quad 0 /* ResourceTable */ 78 .quad 0 /* ExceptionTable */ 79 .quad 0 /* CertificationTable */ 80 .quad 0 /* BaseRelocationTable */ 81 82 /* Section table */ 83section_table: 84 85 /* 86 * The EFI application loader requires a relocation section 87 * because EFI applications must be relocatable. This is a 88 * dummy section as far as we are concerned. 89 */ 90 .ascii ".reloc" 91 .byte 0 92 .byte 0 /* end of 0 padding of section name */ 93 .long 0 94 .long 0 95 .long 0 /* SizeOfRawData */ 96 .long 0 /* PointerToRawData */ 97 .long 0 /* PointerToRelocations */ 98 .long 0 /* PointerToLineNumbers */ 99 .short 0 /* NumberOfRelocations */ 100 .short 0 /* NumberOfLineNumbers */ 101 .long 0x42100040 /* Characteristics (section flags) */ 102 103 104 .ascii ".text" 105 .byte 0 106 .byte 0 107 .byte 0 /* end of 0 padding of section name */ 108 .long _edata - _start /* VirtualSize */ 109 .long _start - ImageBase /* VirtualAddress */ 110 .long _edata - _start /* SizeOfRawData */ 111 .long _start - ImageBase /* PointerToRawData */ 112 113 .long 0 /* PointerToRelocations (0 for executables) */ 114 .long 0 /* PointerToLineNumbers (0 for executables) */ 115 .short 0 /* NumberOfRelocations (0 for executables) */ 116 .short 0 /* NumberOfLineNumbers (0 for executables) */ 117 .long 0xe0500020 /* Characteristics (section flags) */ 118 119_start: 120 stp x29, x30, [sp, #-32]! 121 mov x29, sp 122 123 stp x0, x1, [sp, #16] 124 adr x0, ImageBase 125 adrp x1, _DYNAMIC 126 add x1, x1, #:lo12:_DYNAMIC 127 bl _relocate 128 cbnz x0, 0f 129 130 ldp x0, x1, [sp, #16] 131 bl efi_main 132 1330: ldp x29, x30, [sp], #32 134 ret 135