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