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