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