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