1281526Sandrew/*- 2281526Sandrew * Copyright (c) 2014 Andrew Turner 3281526Sandrew * All rights reserved. 4281526Sandrew * 5281526Sandrew * Redistribution and use in source and binary forms, with or without 6281526Sandrew * modification, are permitted provided that the following conditions 7281526Sandrew * are met: 8281526Sandrew * 1. Redistributions of source code must retain the above copyright 9281526Sandrew * notice, this list of conditions and the following disclaimer. 10281526Sandrew * 2. Redistributions in binary form must reproduce the above copyright 11281526Sandrew * notice, this list of conditions and the following disclaimer in the 12281526Sandrew * documentation and/or other materials provided with the distribution. 13281526Sandrew * 14281526Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15281526Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16281526Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17281526Sandrew * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18281526Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19281526Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20281526Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21281526Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22281526Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23281526Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24281526Sandrew * SUCH DAMAGE. 25281526Sandrew * 26281526Sandrew * $FreeBSD: stable/11/stand/efi/loader/arch/arm64/start.S 344409 2019-02-21 02:46:32Z kevans $ 27281526Sandrew */ 28281526Sandrew 29281526Sandrew/* 30281526Sandrew * We need to be a PE32+ file for EFI. On some architectures we can use 31281526Sandrew * objcopy to create the correct file, however on arm64 we need to do 32281526Sandrew * it ourselves. 33281526Sandrew */ 34281526Sandrew 35281526Sandrew#define IMAGE_FILE_MACHINE_ARM64 0xaa64 36281526Sandrew 37281526Sandrew#define IMAGE_SCN_CNT_CODE 0x00000020 38281526Sandrew#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 39281526Sandrew#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 40281526Sandrew#define IMAGE_SCN_MEM_EXECUTE 0x20000000 41281526Sandrew#define IMAGE_SCN_MEM_READ 0x40000000 42281526Sandrew 43317140Sandrew .section .peheader,"a" 44281526Sandrewefi_start: 45281526Sandrew /* The MS-DOS Stub, only used to get the offset of the COFF header */ 46281526Sandrew .ascii "MZ" 47281526Sandrew .short 0 48281526Sandrew .space 0x38 49281526Sandrew .long pe_sig - efi_start 50281526Sandrew 51281526Sandrew /* The PE32 Signature. Needs to be 8-byte aligned */ 52281526Sandrew .align 3 53281526Sandrewpe_sig: 54281526Sandrew .ascii "PE" 55281526Sandrew .short 0 56281526Sandrewcoff_head: 57281526Sandrew .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */ 58281526Sandrew .short 2 /* 2 Sections */ 59281526Sandrew .long 0 /* Timestamp */ 60281526Sandrew .long 0 /* No symbol table */ 61281526Sandrew .long 0 /* No symbols */ 62281526Sandrew .short section_table - optional_header /* Optional header size */ 63281526Sandrew .short 0 /* Characteristics TODO: Fill in */ 64281526Sandrew 65281526Sandrewoptional_header: 66281526Sandrew .short 0x020b /* PE32+ (64-bit addressing) */ 67281526Sandrew .byte 0 /* Major linker version */ 68281526Sandrew .byte 0 /* Minor linker version */ 69281526Sandrew .long _edata - _end_header /* Code size */ 70281526Sandrew .long 0 /* No initialized data */ 71281526Sandrew .long 0 /* No uninitialized data */ 72281526Sandrew .long _start - efi_start /* Entry point */ 73281526Sandrew .long _end_header - efi_start /* Start of code */ 74281526Sandrew 75281526Sandrewoptional_windows_header: 76281526Sandrew .quad 0 /* Image base */ 77281526Sandrew .long 32 /* Section Alignment */ 78281526Sandrew .long 8 /* File alignment */ 79281526Sandrew .short 0 /* Major OS version */ 80281526Sandrew .short 0 /* Minor OS version */ 81281526Sandrew .short 0 /* Major image version */ 82281526Sandrew .short 0 /* Minor image version */ 83281526Sandrew .short 0 /* Major subsystem version */ 84281526Sandrew .short 0 /* Minor subsystem version */ 85281526Sandrew .long 0 /* Win32 version */ 86281526Sandrew .long _edata - efi_start /* Image size */ 87281526Sandrew .long _end_header - efi_start /* Header size */ 88281526Sandrew .long 0 /* Checksum */ 89281526Sandrew .short 0xa /* Subsystem (EFI app) */ 90281526Sandrew .short 0 /* DLL Characteristics */ 91281526Sandrew .quad 0 /* Stack reserve */ 92281526Sandrew .quad 0 /* Stack commit */ 93281526Sandrew .quad 0 /* Heap reserve */ 94281526Sandrew .quad 0 /* Heap commit */ 95281526Sandrew .long 0 /* Loader flags */ 96281526Sandrew .long 6 /* Number of RVAs */ 97281526Sandrew 98281526Sandrew /* RVAs: */ 99281526Sandrew .quad 0 100281526Sandrew .quad 0 101281526Sandrew .quad 0 102281526Sandrew .quad 0 103281526Sandrew .quad 0 104281526Sandrew .quad 0 105281526Sandrew 106281526Sandrewsection_table: 107281526Sandrew /* We need a .reloc section for EFI */ 108281526Sandrew .ascii ".reloc" 109281526Sandrew .byte 0 110281526Sandrew .byte 0 /* Pad to 8 bytes */ 111281526Sandrew .long 0 /* Virtual size */ 112281526Sandrew .long 0 /* Virtual address */ 113281526Sandrew .long 0 /* Size of raw data */ 114281526Sandrew .long 0 /* Pointer to raw data */ 115281526Sandrew .long 0 /* Pointer to relocations */ 116281526Sandrew .long 0 /* Pointer to line numbers */ 117281526Sandrew .short 0 /* Number of relocations */ 118281526Sandrew .short 0 /* Number of line numbers */ 119281526Sandrew .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \ 120281526Sandrew IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */ 121281526Sandrew 122281526Sandrew /* The contents of the loader */ 123281526Sandrew .ascii ".text" 124281526Sandrew .byte 0 125281526Sandrew .byte 0 126281526Sandrew .byte 0 /* Pad to 8 bytes */ 127281526Sandrew .long _edata - _end_header /* Virtual size */ 128281526Sandrew .long _end_header - efi_start /* Virtual address */ 129281526Sandrew .long _edata - _end_header /* Size of raw data */ 130281526Sandrew .long _end_header - efi_start /* Pointer to raw data */ 131281526Sandrew .long 0 /* Pointer to relocations */ 132281526Sandrew .long 0 /* Pointer to line numbers */ 133281526Sandrew .short 0 /* Number of relocations */ 134281526Sandrew .short 0 /* Number of line numbers */ 135281526Sandrew .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \ 136281526Sandrew IMAGE_SCN_MEM_READ) /* Characteristics */ 137281526Sandrew_end_header: 138281526Sandrew 139281526Sandrew .text 140281526Sandrew .globl _start 141281526Sandrew_start: 142281526Sandrew /* Save the boot params to the stack */ 143281526Sandrew stp x0, x1, [sp, #-16]! 144281526Sandrew 145281526Sandrew adr x0, __bss_start 146281526Sandrew adr x1, __bss_end 147281526Sandrew 148281526Sandrew b 2f 149281526Sandrew 150281526Sandrew1: 151281526Sandrew stp xzr, xzr, [x0], #16 152281526Sandrew2: 153281526Sandrew cmp x0, x1 154281526Sandrew b.lo 1b 155281526Sandrew 156281526Sandrew adr x0, ImageBase 157281526Sandrew adr x1, _DYNAMIC 158281526Sandrew 159282727Sian bl self_reloc 160281526Sandrew 161281526Sandrew ldp x0, x1, [sp], #16 162281526Sandrew 163344409Skevans#ifndef EFI_BOOT1 164344409Skevans /* 165344409Skevans * Load the stack to use. The default stack may be too small for 166344409Skevans * the lua loader. 167344409Skevans */ 168344409Skevans adr x2, initstack_end 169344409Skevans mov sp, x2 170344409Skevans#endif 171344409Skevans 172281526Sandrew bl efi_main 173281526Sandrew 174281526Sandrew1: b 1b 175344409Skevans 176344409Skevans#ifndef EFI_BOOT1 177344409Skevans.bss 178344409Skevans .align 4 179344409Skevansinitstack: 180344409Skevans .space (64 * 1024) 181344409Skevansinitstack_end: 182344409Skevans#endif 183