1*51e65385Sjmcneill/* $NetBSD: crt0-efi-aarch64.S,v 1.1.1.2 2021/09/30 18:50:09 jmcneill Exp $ */ 2974f52d2Sjmcneill 3974f52d2Sjmcneill/* 4974f52d2Sjmcneill * crt0-efi-aarch64.S - PE/COFF header for AArch64 EFI applications 5974f52d2Sjmcneill * 6974f52d2Sjmcneill * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org> 7974f52d2Sjmcneill * 8974f52d2Sjmcneill * Redistribution and use in source and binary forms, with or without 9974f52d2Sjmcneill * modification, are permitted provided that the following conditions 10974f52d2Sjmcneill * are met: 11974f52d2Sjmcneill * 1. Redistributions of source code must retain the above copyright 12974f52d2Sjmcneill * notice and this list of conditions, without modification. 13974f52d2Sjmcneill * 2. The name of the author may not be used to endorse or promote products 14974f52d2Sjmcneill * derived from this software without specific prior written permission. 15974f52d2Sjmcneill * 16974f52d2Sjmcneill * Alternatively, this software may be distributed under the terms of the 17974f52d2Sjmcneill * GNU General Public License as published by the Free Software Foundation; 18974f52d2Sjmcneill * either version 2 of the License, or (at your option) any later version. 19974f52d2Sjmcneill */ 20974f52d2Sjmcneill 21974f52d2Sjmcneill .section .text.head 22974f52d2Sjmcneill 23974f52d2Sjmcneill /* 24974f52d2Sjmcneill * Magic "MZ" signature for PE/COFF 25974f52d2Sjmcneill */ 26974f52d2Sjmcneill .globl ImageBase 27974f52d2SjmcneillImageBase: 28974f52d2Sjmcneill .ascii "MZ" 29974f52d2Sjmcneill .skip 58 // 'MZ' + pad + offset == 64 30974f52d2Sjmcneill .long pe_header - ImageBase // Offset to the PE header. 31974f52d2Sjmcneillpe_header: 32974f52d2Sjmcneill .ascii "PE" 33974f52d2Sjmcneill .short 0 34974f52d2Sjmcneillcoff_header: 35974f52d2Sjmcneill .short 0xaa64 // AArch64 36974f52d2Sjmcneill .short 2 // nr_sections 37974f52d2Sjmcneill .long 0 // TimeDateStamp 38974f52d2Sjmcneill .long 0 // PointerToSymbolTable 39*51e65385Sjmcneill .long 0 // NumberOfSymbols 40974f52d2Sjmcneill .short section_table - optional_header // SizeOfOptionalHeader 41974f52d2Sjmcneill .short 0x206 // Characteristics. 42974f52d2Sjmcneill // IMAGE_FILE_DEBUG_STRIPPED | 43974f52d2Sjmcneill // IMAGE_FILE_EXECUTABLE_IMAGE | 44974f52d2Sjmcneill // IMAGE_FILE_LINE_NUMS_STRIPPED 45974f52d2Sjmcneilloptional_header: 46974f52d2Sjmcneill .short 0x20b // PE32+ format 47974f52d2Sjmcneill .byte 0x02 // MajorLinkerVersion 48974f52d2Sjmcneill .byte 0x14 // MinorLinkerVersion 49974f52d2Sjmcneill .long _data - _start // SizeOfCode 50974f52d2Sjmcneill .long _data_size // SizeOfInitializedData 51974f52d2Sjmcneill .long 0 // SizeOfUninitializedData 52974f52d2Sjmcneill .long _start - ImageBase // AddressOfEntryPoint 53974f52d2Sjmcneill .long _start - ImageBase // BaseOfCode 54974f52d2Sjmcneill 55974f52d2Sjmcneillextra_header_fields: 56974f52d2Sjmcneill .quad 0 // ImageBase 57974f52d2Sjmcneill .long 0x1000 // SectionAlignment 58974f52d2Sjmcneill .long 0x200 // FileAlignment 59974f52d2Sjmcneill .short 0 // MajorOperatingSystemVersion 60974f52d2Sjmcneill .short 0 // MinorOperatingSystemVersion 61974f52d2Sjmcneill .short 0 // MajorImageVersion 62974f52d2Sjmcneill .short 0 // MinorImageVersion 63974f52d2Sjmcneill .short 0 // MajorSubsystemVersion 64974f52d2Sjmcneill .short 0 // MinorSubsystemVersion 65974f52d2Sjmcneill .long 0 // Win32VersionValue 66974f52d2Sjmcneill 67974f52d2Sjmcneill .long _edata - ImageBase // SizeOfImage 68974f52d2Sjmcneill 69974f52d2Sjmcneill // Everything before the kernel image is considered part of the header 70974f52d2Sjmcneill .long _start - ImageBase // SizeOfHeaders 71974f52d2Sjmcneill .long 0 // CheckSum 72974f52d2Sjmcneill .short EFI_SUBSYSTEM // Subsystem 73974f52d2Sjmcneill .short 0 // DllCharacteristics 74974f52d2Sjmcneill .quad 0 // SizeOfStackReserve 75974f52d2Sjmcneill .quad 0 // SizeOfStackCommit 76974f52d2Sjmcneill .quad 0 // SizeOfHeapReserve 77974f52d2Sjmcneill .quad 0 // SizeOfHeapCommit 78974f52d2Sjmcneill .long 0 // LoaderFlags 79974f52d2Sjmcneill .long 0x6 // NumberOfRvaAndSizes 80974f52d2Sjmcneill 81974f52d2Sjmcneill .quad 0 // ExportTable 82974f52d2Sjmcneill .quad 0 // ImportTable 83974f52d2Sjmcneill .quad 0 // ResourceTable 84974f52d2Sjmcneill .quad 0 // ExceptionTable 85974f52d2Sjmcneill .quad 0 // CertificationTable 86974f52d2Sjmcneill .quad 0 // BaseRelocationTable 87974f52d2Sjmcneill 88974f52d2Sjmcneill // Section table 89974f52d2Sjmcneillsection_table: 90974f52d2Sjmcneill .ascii ".text\0\0\0" 91974f52d2Sjmcneill .long _data - _start // VirtualSize 92974f52d2Sjmcneill .long _start - ImageBase // VirtualAddress 93974f52d2Sjmcneill .long _data - _start // SizeOfRawData 94974f52d2Sjmcneill .long _start - ImageBase // PointerToRawData 95974f52d2Sjmcneill 96974f52d2Sjmcneill .long 0 // PointerToRelocations (0 for executables) 97974f52d2Sjmcneill .long 0 // PointerToLineNumbers (0 for executables) 98974f52d2Sjmcneill .short 0 // NumberOfRelocations (0 for executables) 99974f52d2Sjmcneill .short 0 // NumberOfLineNumbers (0 for executables) 100974f52d2Sjmcneill .long 0x60000020 // Characteristics (section flags) 101974f52d2Sjmcneill 102974f52d2Sjmcneill .ascii ".data\0\0\0" 103974f52d2Sjmcneill .long _data_size // VirtualSize 104974f52d2Sjmcneill .long _data - ImageBase // VirtualAddress 105974f52d2Sjmcneill .long _data_size // SizeOfRawData 106974f52d2Sjmcneill .long _data - ImageBase // PointerToRawData 107974f52d2Sjmcneill 108974f52d2Sjmcneill .long 0 // PointerToRelocations (0 for executables) 109974f52d2Sjmcneill .long 0 // PointerToLineNumbers (0 for executables) 110974f52d2Sjmcneill .short 0 // NumberOfRelocations (0 for executables) 111974f52d2Sjmcneill .short 0 // NumberOfLineNumbers (0 for executables) 112974f52d2Sjmcneill .long 0xc0000040 // Characteristics (section flags) 113974f52d2Sjmcneill 114974f52d2Sjmcneill .align 12 115974f52d2Sjmcneill_start: 116974f52d2Sjmcneill stp x29, x30, [sp, #-32]! 117974f52d2Sjmcneill mov x29, sp 118974f52d2Sjmcneill 119974f52d2Sjmcneill stp x0, x1, [sp, #16] 120974f52d2Sjmcneill mov x2, x0 121974f52d2Sjmcneill mov x3, x1 122974f52d2Sjmcneill adr x0, ImageBase 123974f52d2Sjmcneill adrp x1, _DYNAMIC 124974f52d2Sjmcneill add x1, x1, #:lo12:_DYNAMIC 125974f52d2Sjmcneill bl _relocate 126974f52d2Sjmcneill cbnz x0, 0f 127974f52d2Sjmcneill 128974f52d2Sjmcneill ldp x0, x1, [sp, #16] 129974f52d2Sjmcneill bl efi_main 130974f52d2Sjmcneill 131974f52d2Sjmcneill0: ldp x29, x30, [sp], #32 132974f52d2Sjmcneill ret 133