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 * $FreeBSD$ 27ca987d46SWarner Losh */ 28ca987d46SWarner Losh 29ca987d46SWarner Losh/* 30ca987d46SWarner Losh * We need to be a PE32+ file for EFI. On some architectures we can use 31ca987d46SWarner Losh * objcopy to create the correct file, however on arm64 we need to do 32ca987d46SWarner Losh * it ourselves. 33ca987d46SWarner Losh */ 34ca987d46SWarner Losh 35ca987d46SWarner Losh#define IMAGE_FILE_MACHINE_ARM64 0xaa64 36ca987d46SWarner Losh 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 42ca987d46SWarner Losh 43ca987d46SWarner Losh .section .peheader,"a" 44ca987d46SWarner Loshefi_start: 45ca987d46SWarner Losh /* The MS-DOS Stub, only used to get the offset of the COFF header */ 46ca987d46SWarner Losh .ascii "MZ" 47ca987d46SWarner Losh .short 0 48ca987d46SWarner Losh .space 0x38 49ca987d46SWarner Losh .long pe_sig - efi_start 50ca987d46SWarner Losh 51ca987d46SWarner Losh /* The PE32 Signature. Needs to be 8-byte aligned */ 52ca987d46SWarner Losh .align 3 53ca987d46SWarner Loshpe_sig: 54ca987d46SWarner Losh .ascii "PE" 55ca987d46SWarner Losh .short 0 56ca987d46SWarner Loshcoff_head: 57ca987d46SWarner Losh .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */ 58ca987d46SWarner Losh .short 2 /* 2 Sections */ 59ca987d46SWarner Losh .long 0 /* Timestamp */ 60ca987d46SWarner Losh .long 0 /* No symbol table */ 61ca987d46SWarner Losh .long 0 /* No symbols */ 62ca987d46SWarner Losh .short section_table - optional_header /* Optional header size */ 63ca987d46SWarner Losh .short 0 /* Characteristics TODO: Fill in */ 64ca987d46SWarner Losh 65ca987d46SWarner Loshoptional_header: 66ca987d46SWarner Losh .short 0x020b /* PE32+ (64-bit addressing) */ 67ca987d46SWarner Losh .byte 0 /* Major linker version */ 68ca987d46SWarner Losh .byte 0 /* Minor linker version */ 69ca987d46SWarner Losh .long _edata - _end_header /* Code size */ 70ca987d46SWarner Losh .long 0 /* No initialized data */ 71ca987d46SWarner Losh .long 0 /* No uninitialized data */ 72ca987d46SWarner Losh .long _start - efi_start /* Entry point */ 73ca987d46SWarner Losh .long _end_header - efi_start /* Start of code */ 74ca987d46SWarner Losh 75ca987d46SWarner Loshoptional_windows_header: 76ca987d46SWarner Losh .quad 0 /* Image base */ 77ca987d46SWarner Losh .long 32 /* Section Alignment */ 78ca987d46SWarner Losh .long 8 /* File alignment */ 79ca987d46SWarner Losh .short 0 /* Major OS version */ 80ca987d46SWarner Losh .short 0 /* Minor OS version */ 81ca987d46SWarner Losh .short 0 /* Major image version */ 82ca987d46SWarner Losh .short 0 /* Minor image version */ 83ca987d46SWarner Losh .short 0 /* Major subsystem version */ 84ca987d46SWarner Losh .short 0 /* Minor subsystem version */ 85ca987d46SWarner Losh .long 0 /* Win32 version */ 86ca987d46SWarner Losh .long _edata - efi_start /* Image size */ 87ca987d46SWarner Losh .long _end_header - efi_start /* Header size */ 88ca987d46SWarner Losh .long 0 /* Checksum */ 89ca987d46SWarner Losh .short 0xa /* Subsystem (EFI app) */ 90ca987d46SWarner Losh .short 0 /* DLL Characteristics */ 91ca987d46SWarner Losh .quad 0 /* Stack reserve */ 92ca987d46SWarner Losh .quad 0 /* Stack commit */ 93ca987d46SWarner Losh .quad 0 /* Heap reserve */ 94ca987d46SWarner Losh .quad 0 /* Heap commit */ 95ca987d46SWarner Losh .long 0 /* Loader flags */ 96ca987d46SWarner Losh .long 6 /* Number of RVAs */ 97ca987d46SWarner Losh 98ca987d46SWarner Losh /* RVAs: */ 99ca987d46SWarner Losh .quad 0 100ca987d46SWarner Losh .quad 0 101ca987d46SWarner Losh .quad 0 102ca987d46SWarner Losh .quad 0 103ca987d46SWarner Losh .quad 0 104ca987d46SWarner Losh .quad 0 105ca987d46SWarner Losh 106ca987d46SWarner Loshsection_table: 107ca987d46SWarner Losh /* We need a .reloc section for EFI */ 108ca987d46SWarner Losh .ascii ".reloc" 109ca987d46SWarner Losh .byte 0 110ca987d46SWarner Losh .byte 0 /* Pad to 8 bytes */ 111ca987d46SWarner Losh .long 0 /* Virtual size */ 112ca987d46SWarner Losh .long 0 /* Virtual address */ 113ca987d46SWarner Losh .long 0 /* Size of raw data */ 114ca987d46SWarner Losh .long 0 /* Pointer to raw data */ 115ca987d46SWarner Losh .long 0 /* Pointer to relocations */ 116ca987d46SWarner Losh .long 0 /* Pointer to line numbers */ 117ca987d46SWarner Losh .short 0 /* Number of relocations */ 118ca987d46SWarner Losh .short 0 /* Number of line numbers */ 119ca987d46SWarner Losh .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \ 120ca987d46SWarner Losh IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */ 121ca987d46SWarner Losh 122ca987d46SWarner Losh /* The contents of the loader */ 123ca987d46SWarner Losh .ascii ".text" 124ca987d46SWarner Losh .byte 0 125ca987d46SWarner Losh .byte 0 126ca987d46SWarner Losh .byte 0 /* Pad to 8 bytes */ 127ca987d46SWarner Losh .long _edata - _end_header /* Virtual size */ 128ca987d46SWarner Losh .long _end_header - efi_start /* Virtual address */ 129ca987d46SWarner Losh .long _edata - _end_header /* Size of raw data */ 130ca987d46SWarner Losh .long _end_header - efi_start /* Pointer to raw data */ 131ca987d46SWarner Losh .long 0 /* Pointer to relocations */ 132ca987d46SWarner Losh .long 0 /* Pointer to line numbers */ 133ca987d46SWarner Losh .short 0 /* Number of relocations */ 134ca987d46SWarner Losh .short 0 /* Number of line numbers */ 135ca987d46SWarner Losh .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \ 136ca987d46SWarner Losh IMAGE_SCN_MEM_READ) /* Characteristics */ 137ca987d46SWarner Losh_end_header: 138ca987d46SWarner Losh 139ca987d46SWarner Losh .text 140ca987d46SWarner Losh .globl _start 141ca987d46SWarner Losh_start: 142ca987d46SWarner Losh /* Save the boot params to the stack */ 143ca987d46SWarner Losh stp x0, x1, [sp, #-16]! 144ca987d46SWarner Losh 145*b9aa4537SAndrew Turner adrp x0, __bss_start 146*b9aa4537SAndrew Turner add x0, x0, :lo12:__bss_start 147*b9aa4537SAndrew Turner adrp x1, __bss_end 148*b9aa4537SAndrew Turner add x1, x1, :lo12:__bss_end 149ca987d46SWarner Losh 150ca987d46SWarner Losh b 2f 151ca987d46SWarner Losh 152ca987d46SWarner Losh1: 153ca987d46SWarner Losh stp xzr, xzr, [x0], #16 154ca987d46SWarner Losh2: 155ca987d46SWarner Losh cmp x0, x1 156ca987d46SWarner Losh b.lo 1b 157ca987d46SWarner Losh 158*b9aa4537SAndrew Turner adrp x0, ImageBase 159*b9aa4537SAndrew Turner add x0, x0, :lo12:ImageBase 160*b9aa4537SAndrew Turner adrp x1, _DYNAMIC 161*b9aa4537SAndrew Turner add x1, x1, :lo12:_DYNAMIC 162ca987d46SWarner Losh 163ca987d46SWarner Losh bl self_reloc 164ca987d46SWarner Losh 165ca987d46SWarner Losh ldp x0, x1, [sp], #16 166ca987d46SWarner Losh 16778da6046SAndrew Turner#ifndef EFI_BOOT1 16878da6046SAndrew Turner /* 16978da6046SAndrew Turner * Load the stack to use. The default stack may be too small for 17078da6046SAndrew Turner * the lua loader. 17178da6046SAndrew Turner */ 172*b9aa4537SAndrew Turner adrp x2, initstack_end 173*b9aa4537SAndrew Turner add x2, x2, :lo12:initstack_end 17478da6046SAndrew Turner mov sp, x2 17578da6046SAndrew Turner#endif 17678da6046SAndrew Turner 177ca987d46SWarner Losh bl efi_main 178ca987d46SWarner Losh 179ca987d46SWarner Losh1: b 1b 18078da6046SAndrew Turner 18178da6046SAndrew Turner#ifndef EFI_BOOT1 18278da6046SAndrew Turner.bss 18378da6046SAndrew Turner .align 4 18478da6046SAndrew Turnerinitstack: 18578da6046SAndrew Turner .space (64 * 1024) 18678da6046SAndrew Turnerinitstack_end: 18778da6046SAndrew Turner#endif 188