1ca987d46SWarner Losh/*- 2ca987d46SWarner Losh * Copyright (c) 2014 Andrew Turner 3ca987d46SWarner Losh * All rights reserved. 4ca987d46SWarner Losh * 5ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without 6ca987d46SWarner Losh * modification, are permitted provided that the following conditions 7ca987d46SWarner Losh * are met: 8ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright 9ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer. 10ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright 11ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer in the 12ca987d46SWarner Losh * documentation and/or other materials provided with the distribution. 13ca987d46SWarner Losh * 14ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17ca987d46SWarner Losh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24ca987d46SWarner Losh * SUCH DAMAGE. 25ca987d46SWarner Losh */ 26ca987d46SWarner Losh 27ca987d46SWarner Losh/* 28ca987d46SWarner Losh * We need to be a PE32+ file for EFI. On some architectures we can use 29ca987d46SWarner Losh * objcopy to create the correct file, however on arm64 we need to do 30ca987d46SWarner Losh * it ourselves. 31ca987d46SWarner Losh */ 32ca987d46SWarner Losh 33ca987d46SWarner Losh#define IMAGE_FILE_MACHINE_ARM64 0xaa64 34ca987d46SWarner Losh 35*21d56b79SMark Johnston#define IMAGE_FILE_EXECUTABLE 0x0002 36*21d56b79SMark Johnston 37ca987d46SWarner Losh#define IMAGE_SCN_CNT_CODE 0x00000020 38ca987d46SWarner Losh#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 39ca987d46SWarner Losh#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 40ca987d46SWarner Losh#define IMAGE_SCN_MEM_EXECUTE 0x20000000 41ca987d46SWarner Losh#define IMAGE_SCN_MEM_READ 0x40000000 42*21d56b79SMark Johnston#define IMAGE_SCN_MEM_WRITE 0x80000000 43ca987d46SWarner Losh 44ca987d46SWarner Losh .section .peheader,"a" 45ca987d46SWarner Loshefi_start: 46ca987d46SWarner Losh /* The MS-DOS Stub, only used to get the offset of the COFF header */ 47ca987d46SWarner Losh .ascii "MZ" 48ca987d46SWarner Losh .short 0 49ca987d46SWarner Losh .space 0x38 50ca987d46SWarner Losh .long pe_sig - efi_start 51ca987d46SWarner Losh 52ca987d46SWarner Losh /* The PE32 Signature. Needs to be 8-byte aligned */ 53ca987d46SWarner Losh .align 3 54ca987d46SWarner Loshpe_sig: 55ca987d46SWarner Losh .ascii "PE" 56ca987d46SWarner Losh .short 0 57ca987d46SWarner Loshcoff_head: 58ca987d46SWarner Losh .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */ 59ca987d46SWarner Losh .short 2 /* 2 Sections */ 60ca987d46SWarner Losh .long 0 /* Timestamp */ 61ca987d46SWarner Losh .long 0 /* No symbol table */ 62ca987d46SWarner Losh .long 0 /* No symbols */ 63ca987d46SWarner Losh .short section_table - optional_header /* Optional header size */ 64*21d56b79SMark Johnston .short IMAGE_FILE_EXECUTABLE /* Characteristics */ 65ca987d46SWarner Losh 66ca987d46SWarner Loshoptional_header: 67ca987d46SWarner Losh .short 0x020b /* PE32+ (64-bit addressing) */ 68ca987d46SWarner Losh .byte 0 /* Major linker version */ 69ca987d46SWarner Losh .byte 0 /* Minor linker version */ 70*21d56b79SMark Johnston .long _etext - _end_header /* Code size */ 71*21d56b79SMark Johnston .long __data_size /* Initialized data size */ 72ca987d46SWarner Losh .long 0 /* No uninitialized data */ 73ca987d46SWarner Losh .long _start - efi_start /* Entry point */ 74ca987d46SWarner Losh .long _end_header - efi_start /* Start of code */ 75ca987d46SWarner Losh 76ca987d46SWarner Loshoptional_windows_header: 77ca987d46SWarner Losh .quad 0 /* Image base */ 78*21d56b79SMark Johnston .long 4096 /* Section Alignment */ 79*21d56b79SMark Johnston .long 512 /* File alignment */ 80ca987d46SWarner Losh .short 0 /* Major OS version */ 81ca987d46SWarner Losh .short 0 /* Minor OS version */ 82ca987d46SWarner Losh .short 0 /* Major image version */ 83ca987d46SWarner Losh .short 0 /* Minor image version */ 84ca987d46SWarner Losh .short 0 /* Major subsystem version */ 85ca987d46SWarner Losh .short 0 /* Minor subsystem version */ 86ca987d46SWarner Losh .long 0 /* Win32 version */ 87ca987d46SWarner Losh .long _edata - efi_start /* Image size */ 88ca987d46SWarner Losh .long _end_header - efi_start /* Header size */ 89ca987d46SWarner Losh .long 0 /* Checksum */ 90ca987d46SWarner Losh .short 0xa /* Subsystem (EFI app) */ 91ca987d46SWarner Losh .short 0 /* DLL Characteristics */ 92ca987d46SWarner Losh .quad 0 /* Stack reserve */ 93ca987d46SWarner Losh .quad 0 /* Stack commit */ 94ca987d46SWarner Losh .quad 0 /* Heap reserve */ 95ca987d46SWarner Losh .quad 0 /* Heap commit */ 96ca987d46SWarner Losh .long 0 /* Loader flags */ 97ca987d46SWarner Losh .long 6 /* Number of RVAs */ 98ca987d46SWarner Losh 99ca987d46SWarner Losh /* RVAs: */ 100ca987d46SWarner Losh .quad 0 101ca987d46SWarner Losh .quad 0 102ca987d46SWarner Losh .quad 0 103ca987d46SWarner Losh .quad 0 104ca987d46SWarner Losh .quad 0 105ca987d46SWarner Losh .quad 0 106ca987d46SWarner Losh 107ca987d46SWarner Loshsection_table: 108ca987d46SWarner Losh .ascii ".text" 109ca987d46SWarner Losh .byte 0 110ca987d46SWarner Losh .byte 0 111ca987d46SWarner Losh .byte 0 /* Pad to 8 bytes */ 112*21d56b79SMark Johnston .long _etext - _end_header /* Virtual size */ 113ca987d46SWarner Losh .long _end_header - efi_start /* Virtual address */ 114*21d56b79SMark Johnston .long _etext - _end_header /* Size of raw data */ 115ca987d46SWarner Losh .long _end_header - efi_start /* Pointer to raw data */ 116ca987d46SWarner Losh .long 0 /* Pointer to relocations */ 117ca987d46SWarner Losh .long 0 /* Pointer to line numbers */ 118ca987d46SWarner Losh .short 0 /* Number of relocations */ 119ca987d46SWarner Losh .short 0 /* Number of line numbers */ 120ca987d46SWarner Losh .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \ 121ca987d46SWarner Losh IMAGE_SCN_MEM_READ) /* Characteristics */ 122*21d56b79SMark Johnston 123*21d56b79SMark Johnston .ascii ".data" 124*21d56b79SMark Johnston .byte 0 125*21d56b79SMark Johnston .byte 0 126*21d56b79SMark Johnston .byte 0 /* Pad to 8 bytes */ 127*21d56b79SMark Johnston .long __data_size /* Virtual size */ 128*21d56b79SMark Johnston .long __data_start - efi_start /* Virtual address */ 129*21d56b79SMark Johnston .long __data_size /* Size of raw data */ 130*21d56b79SMark Johnston .long __data_start - efi_start /* Pointer to raw data */ 131*21d56b79SMark Johnston .long 0 /* Pointer to relocations */ 132*21d56b79SMark Johnston .long 0 /* Pointer to line numbers */ 133*21d56b79SMark Johnston .short 0 /* Number of relocations */ 134*21d56b79SMark Johnston .short 0 /* Number of line numbers */ 135*21d56b79SMark Johnston .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \ 136*21d56b79SMark Johnston IMAGE_SCN_MEM_WRITE) /* Characteristics */ 137*21d56b79SMark Johnston 138*21d56b79SMark Johnston .align 12 139ca987d46SWarner Losh_end_header: 140ca987d46SWarner Losh 141ca987d46SWarner Losh .text 142ca987d46SWarner Losh .globl _start 143ca987d46SWarner Losh_start: 144ca987d46SWarner Losh /* Save the boot params to the stack */ 145ca987d46SWarner Losh stp x0, x1, [sp, #-16]! 146ca987d46SWarner Losh 147b9aa4537SAndrew Turner adrp x0, __bss_start 148b9aa4537SAndrew Turner add x0, x0, :lo12:__bss_start 149b9aa4537SAndrew Turner adrp x1, __bss_end 150b9aa4537SAndrew Turner add x1, x1, :lo12:__bss_end 151ca987d46SWarner Losh 152ca987d46SWarner Losh b 2f 153ca987d46SWarner Losh 154ca987d46SWarner Losh1: 155ca987d46SWarner Losh stp xzr, xzr, [x0], #16 156ca987d46SWarner Losh2: 157ca987d46SWarner Losh cmp x0, x1 158ca987d46SWarner Losh b.lo 1b 159ca987d46SWarner Losh 160b9aa4537SAndrew Turner adrp x0, ImageBase 161b9aa4537SAndrew Turner add x0, x0, :lo12:ImageBase 162b9aa4537SAndrew Turner adrp x1, _DYNAMIC 163b9aa4537SAndrew Turner add x1, x1, :lo12:_DYNAMIC 164ca987d46SWarner Losh 165ca987d46SWarner Losh bl self_reloc 166ca987d46SWarner Losh 167ca987d46SWarner Losh ldp x0, x1, [sp], #16 168ca987d46SWarner Losh 16978da6046SAndrew Turner#ifndef EFI_BOOT1 17078da6046SAndrew Turner /* 17178da6046SAndrew Turner * Load the stack to use. The default stack may be too small for 17278da6046SAndrew Turner * the lua loader. 17378da6046SAndrew Turner */ 174b9aa4537SAndrew Turner adrp x2, initstack_end 175b9aa4537SAndrew Turner add x2, x2, :lo12:initstack_end 17678da6046SAndrew Turner mov sp, x2 17778da6046SAndrew Turner#endif 17878da6046SAndrew Turner 179ca987d46SWarner Losh bl efi_main 180ca987d46SWarner Losh 181ca987d46SWarner Losh1: b 1b 18278da6046SAndrew Turner 18378da6046SAndrew Turner#ifndef EFI_BOOT1 18478da6046SAndrew Turner.bss 18578da6046SAndrew Turner .align 4 18678da6046SAndrew Turnerinitstack: 18778da6046SAndrew Turner .space (64 * 1024) 18878da6046SAndrew Turnerinitstack_end: 18978da6046SAndrew Turner#endif 190