1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * crt0-efi-arm.S - PE/COFF header for ARM 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 image_base 17*4882a593Smuzhiyunimage_base: 18*4882a593Smuzhiyun .ascii "MZ" 19*4882a593Smuzhiyun .skip 58 /* 'MZ' + pad + offset == 64 */ 20*4882a593Smuzhiyun .long pe_header - image_base /* Offset to the PE header */ 21*4882a593Smuzhiyunpe_header: 22*4882a593Smuzhiyun .ascii "PE" 23*4882a593Smuzhiyun .short 0 24*4882a593Smuzhiyuncoff_header: 25*4882a593Smuzhiyun .short 0x1c2 /* Mixed ARM/Thumb */ 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_32BIT_MACHINE | 33*4882a593Smuzhiyun * IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | 34*4882a593Smuzhiyun * IMAGE_FILE_LINE_NUMS_STRIPPED 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun .short 0x306 37*4882a593Smuzhiyunoptional_header: 38*4882a593Smuzhiyun .short 0x10b /* PE32+ format */ 39*4882a593Smuzhiyun .byte 0x02 /* MajorLinkerVersion */ 40*4882a593Smuzhiyun .byte 0x14 /* MinorLinkerVersion */ 41*4882a593Smuzhiyun .long _edata - _start /* SizeOfCode */ 42*4882a593Smuzhiyun .long 0 /* SizeOfInitializedData */ 43*4882a593Smuzhiyun .long 0 /* SizeOfUninitializedData */ 44*4882a593Smuzhiyun .long _start - image_base /* AddressOfEntryPoint */ 45*4882a593Smuzhiyun .long _start - image_base /* BaseOfCode */ 46*4882a593Smuzhiyun .long 0 /* BaseOfData */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyunextra_header_fields: 49*4882a593Smuzhiyun .long 0 /* image_base */ 50*4882a593Smuzhiyun .long 0x20 /* SectionAlignment */ 51*4882a593Smuzhiyun .long 0x8 /* FileAlignment */ 52*4882a593Smuzhiyun .short 0 /* MajorOperatingSystemVersion */ 53*4882a593Smuzhiyun .short 0 /* MinorOperatingSystemVersion */ 54*4882a593Smuzhiyun .short 0 /* MajorImageVersion */ 55*4882a593Smuzhiyun .short 0 /* MinorImageVersion */ 56*4882a593Smuzhiyun .short 0 /* MajorSubsystemVersion */ 57*4882a593Smuzhiyun .short 0 /* MinorSubsystemVersion */ 58*4882a593Smuzhiyun .long 0 /* Win32VersionValue */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun .long _edata - image_base /* SizeOfImage */ 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* 63*4882a593Smuzhiyun * Everything before the kernel image is considered part of the header 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun .long _start - image_base /* SizeOfHeaders */ 66*4882a593Smuzhiyun .long 0 /* CheckSum */ 67*4882a593Smuzhiyun .short EFI_SUBSYSTEM /* Subsystem */ 68*4882a593Smuzhiyun .short 0 /* DllCharacteristics */ 69*4882a593Smuzhiyun .long 0 /* SizeOfStackReserve */ 70*4882a593Smuzhiyun .long 0 /* SizeOfStackCommit */ 71*4882a593Smuzhiyun .long 0 /* SizeOfHeapReserve */ 72*4882a593Smuzhiyun .long 0 /* SizeOfHeapCommit */ 73*4882a593Smuzhiyun .long 0 /* LoaderFlags */ 74*4882a593Smuzhiyun .long 0x6 /* NumberOfRvaAndSizes */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun .quad 0 /* ExportTable */ 77*4882a593Smuzhiyun .quad 0 /* ImportTable */ 78*4882a593Smuzhiyun .quad 0 /* ResourceTable */ 79*4882a593Smuzhiyun .quad 0 /* ExceptionTable */ 80*4882a593Smuzhiyun .quad 0 /* CertificationTable */ 81*4882a593Smuzhiyun .quad 0 /* BaseRelocationTable */ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyunsection_table: 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * The EFI application loader requires a relocation section 87*4882a593Smuzhiyun * because EFI applications must be relocatable. This is a 88*4882a593Smuzhiyun * dummy section as far as we are concerned. 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun .ascii ".reloc" 91*4882a593Smuzhiyun .byte 0 92*4882a593Smuzhiyun .byte 0 /* end of 0 padding of section name */ 93*4882a593Smuzhiyun .long 0 94*4882a593Smuzhiyun .long 0 95*4882a593Smuzhiyun .long 0 /* SizeOfRawData */ 96*4882a593Smuzhiyun .long 0 /* PointerToRawData */ 97*4882a593Smuzhiyun .long 0 /* PointerToRelocations */ 98*4882a593Smuzhiyun .long 0 /* PointerToLineNumbers */ 99*4882a593Smuzhiyun .short 0 /* NumberOfRelocations */ 100*4882a593Smuzhiyun .short 0 /* NumberOfLineNumbers */ 101*4882a593Smuzhiyun .long 0x42100040 /* Characteristics (section flags) */ 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 - image_base /* VirtualAddress */ 109*4882a593Smuzhiyun .long _edata - _start /* SizeOfRawData */ 110*4882a593Smuzhiyun .long _start - image_base /* 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 stmfd sp!, {r0-r2, lr} 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun mov r2, r0 122*4882a593Smuzhiyun mov r3, r1 123*4882a593Smuzhiyun adr r1, .L_DYNAMIC 124*4882a593Smuzhiyun ldr r0, [r1] 125*4882a593Smuzhiyun add r1, r0, r1 126*4882a593Smuzhiyun adr r0, image_base 127*4882a593Smuzhiyun bl _relocate 128*4882a593Smuzhiyun teq r0, #0 129*4882a593Smuzhiyun bne 0f 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun ldmfd sp, {r0-r1} 132*4882a593Smuzhiyun bl efi_main 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun0: add sp, sp, #12 135*4882a593Smuzhiyun ldr pc, [sp], #4 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun.L_DYNAMIC: 138*4882a593Smuzhiyun .word _DYNAMIC - . 139