Path: blob/main/stand/efi/loader/arch/arm64/start.S
34889 views
/*-1* Copyright (c) 2014 Andrew Turner2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526/*27* We need to be a PE32+ file for EFI. On some architectures we can use28* objcopy to create the correct file, however on arm64 we need to do29* it ourselves.30*/3132#define IMAGE_FILE_MACHINE_ARM64 0xaa643334#define IMAGE_FILE_EXECUTABLE 0x00023536#define IMAGE_SCN_CNT_CODE 0x0000002037#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x0000004038#define IMAGE_SCN_MEM_DISCARDABLE 0x0200000039#define IMAGE_SCN_MEM_EXECUTE 0x2000000040#define IMAGE_SCN_MEM_READ 0x4000000041#define IMAGE_SCN_MEM_WRITE 0x800000004243.section .peheader,"a"44efi_start:45/* The MS-DOS Stub, only used to get the offset of the COFF header */46.ascii "MZ"47.short 048.space 0x3849.long pe_sig - efi_start5051/* The PE32 Signature. Needs to be 8-byte aligned */52.align 353pe_sig:54.ascii "PE"55.short 056coff_head:57.short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */58.short 2 /* 2 Sections */59.long 0 /* Timestamp */60.long 0 /* No symbol table */61.long 0 /* No symbols */62.short section_table - optional_header /* Optional header size */63.short IMAGE_FILE_EXECUTABLE /* Characteristics */6465optional_header:66.short 0x020b /* PE32+ (64-bit addressing) */67.byte 0 /* Major linker version */68.byte 0 /* Minor linker version */69.long _etext - _end_header /* Code size */70.long __data_size /* Initialized data size */71.long 0 /* No uninitialized data */72.long _start - efi_start /* Entry point */73.long _end_header - efi_start /* Start of code */7475optional_windows_header:76.quad 0 /* Image base */77.long 4096 /* Section Alignment */78.long 512 /* File alignment */79.short 0 /* Major OS version */80.short 0 /* Minor OS version */81.short 0 /* Major image version */82.short 0 /* Minor image version */83.short 0 /* Major subsystem version */84.short 0 /* Minor subsystem version */85.long 0 /* Win32 version */86.long _edata - efi_start /* Image size */87.long _end_header - efi_start /* Header size */88.long 0 /* Checksum */89.short 0xa /* Subsystem (EFI app) */90.short 0 /* DLL Characteristics */91.quad 0 /* Stack reserve */92.quad 0 /* Stack commit */93.quad 0 /* Heap reserve */94.quad 0 /* Heap commit */95.long 0 /* Loader flags */96.long 6 /* Number of RVAs */9798/* RVAs: */99.quad 0100.quad 0101.quad 0102.quad 0103.quad 0104.quad 0105106section_table:107.ascii ".text"108.byte 0109.byte 0110.byte 0 /* Pad to 8 bytes */111.long _etext - _end_header /* Virtual size */112.long _end_header - efi_start /* Virtual address */113.long _etext - _end_header /* Size of raw data */114.long _end_header - efi_start /* Pointer to raw data */115.long 0 /* Pointer to relocations */116.long 0 /* Pointer to line numbers */117.short 0 /* Number of relocations */118.short 0 /* Number of line numbers */119.long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \120IMAGE_SCN_MEM_READ) /* Characteristics */121122.ascii ".data"123.byte 0124.byte 0125.byte 0 /* Pad to 8 bytes */126.long __data_size /* Virtual size */127.long __data_start - efi_start /* Virtual address */128.long __data_size /* Size of raw data */129.long __data_start - efi_start /* Pointer to raw data */130.long 0 /* Pointer to relocations */131.long 0 /* Pointer to line numbers */132.short 0 /* Number of relocations */133.short 0 /* Number of line numbers */134.long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \135IMAGE_SCN_MEM_WRITE) /* Characteristics */136137.align 12138_end_header:139140.text141.globl _start142_start:143/* Save the boot params to the stack */144stp x0, x1, [sp, #-16]!145146adrp x0, __bss_start147add x0, x0, :lo12:__bss_start148adrp x1, __bss_end149add x1, x1, :lo12:__bss_end150151b 2f1521531:154stp xzr, xzr, [x0], #161552:156cmp x0, x1157b.lo 1b158159adrp x0, ImageBase160add x0, x0, :lo12:ImageBase161adrp x1, _DYNAMIC162add x1, x1, :lo12:_DYNAMIC163164bl self_reloc165166ldp x0, x1, [sp], #16167168#ifndef EFI_BOOT1169/*170* Load the stack to use. The default stack may be too small for171* the lua loader.172*/173adrp x2, initstack_end174add x2, x2, :lo12:initstack_end175mov sp, x2176#endif177178bl efi_main1791801: b 1b181182#ifndef EFI_BOOT1183.bss184.align 4185initstack:186.space (64 * 1024)187initstack_end:188#endif189190191