1*fd00acebSpatrick/* $OpenBSD: start.S,v 1.5 2022/07/30 21:06:54 patrick Exp $ */ 2f24071e5Spatrick/*- 3f24071e5Spatrick * Copyright (c) 2014 Andrew Turner 4f24071e5Spatrick * All rights reserved. 5f24071e5Spatrick * 6f24071e5Spatrick * Redistribution and use in source and binary forms, with or without 7f24071e5Spatrick * modification, are permitted provided that the following conditions 8f24071e5Spatrick * are met: 9f24071e5Spatrick * 1. Redistributions of source code must retain the above copyright 10f24071e5Spatrick * notice, this list of conditions and the following disclaimer. 11f24071e5Spatrick * 2. Redistributions in binary form must reproduce the above copyright 12f24071e5Spatrick * notice, this list of conditions and the following disclaimer in the 13f24071e5Spatrick * documentation and/or other materials provided with the distribution. 14f24071e5Spatrick * 15f24071e5Spatrick * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16f24071e5Spatrick * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17f24071e5Spatrick * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18f24071e5Spatrick * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19f24071e5Spatrick * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20f24071e5Spatrick * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21f24071e5Spatrick * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22f24071e5Spatrick * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23f24071e5Spatrick * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24f24071e5Spatrick * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25f24071e5Spatrick * SUCH DAMAGE. 26f24071e5Spatrick * 27a2d40921Spatrick * $FreeBSD: head/sys/boot/efi/loader/arch/arm64/start.S 282727 2015-05-10 13:24:26Z ian $ 28f24071e5Spatrick */ 29f24071e5Spatrick 30f24071e5Spatrick/* 31f24071e5Spatrick * We need to be a PE32+ file for EFI. On some architectures we can use 32f24071e5Spatrick * objcopy to create the correct file, however on arm64 we need to do 33f24071e5Spatrick * it ourselves. 34f24071e5Spatrick */ 35f24071e5Spatrick 36f24071e5Spatrick#define IMAGE_FILE_MACHINE_ARM64 0xaa64 37f24071e5Spatrick 38f24071e5Spatrick#define IMAGE_SCN_CNT_CODE 0x00000020 39f24071e5Spatrick#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 40f24071e5Spatrick#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 41f24071e5Spatrick#define IMAGE_SCN_MEM_EXECUTE 0x20000000 42f24071e5Spatrick#define IMAGE_SCN_MEM_READ 0x40000000 4309ce6c06Skettenis#define IMAGE_SCN_MEM_WRITE 0x80000000 4409ce6c06Skettenis 4509ce6c06Skettenis .globl __data_start 46f24071e5Spatrick 4713298266Skettenis .section .peheader, "a" 48f24071e5Spatrickefi_start: 49f24071e5Spatrick /* The MS-DOS Stub, only used to get the offset of the COFF header */ 50f24071e5Spatrick .ascii "MZ" 51f24071e5Spatrick .short 0 52f24071e5Spatrick .space 0x38 53f24071e5Spatrick .long pe_sig - efi_start 54f24071e5Spatrick 55f24071e5Spatrick /* The PE32 Signature. Needs to be 8-byte aligned */ 56f24071e5Spatrick .align 3 57f24071e5Spatrickpe_sig: 58f24071e5Spatrick .ascii "PE" 59f24071e5Spatrick .short 0 60f24071e5Spatrickcoff_head: 61f24071e5Spatrick .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */ 62f24071e5Spatrick .short 2 /* 2 Sections */ 63f24071e5Spatrick .long 0 /* Timestamp */ 64f24071e5Spatrick .long 0 /* No symbol table */ 65f24071e5Spatrick .long 0 /* No symbols */ 66f24071e5Spatrick .short section_table - optional_header /* Optional header size */ 6709ce6c06Skettenis .short 0x0206 /* Characteristics */ 68f24071e5Spatrick 69f24071e5Spatrickoptional_header: 70f24071e5Spatrick .short 0x020b /* PE32+ (64-bit addressing) */ 71f24071e5Spatrick .byte 0 /* Major linker version */ 72f24071e5Spatrick .byte 0 /* Minor linker version */ 7309ce6c06Skettenis .long _etext - _end_header /* Code size */ 7409ce6c06Skettenis .long __data_size /* Initialized data size */ 75f24071e5Spatrick .long 0 /* No uninitialized data */ 76f24071e5Spatrick .long _start - efi_start /* Entry point */ 77f24071e5Spatrick .long _end_header - efi_start /* Start of code */ 78f24071e5Spatrick 79f24071e5Spatrickoptional_windows_header: 80f24071e5Spatrick .quad 0 /* Image base */ 8109ce6c06Skettenis .long 4096 /* Section Alignment */ 8209ce6c06Skettenis .long 512 /* File alignment */ 83f24071e5Spatrick .short 0 /* Major OS version */ 84f24071e5Spatrick .short 0 /* Minor OS version */ 85f24071e5Spatrick .short 0 /* Major image version */ 86f24071e5Spatrick .short 0 /* Minor image version */ 87f24071e5Spatrick .short 0 /* Major subsystem version */ 88f24071e5Spatrick .short 0 /* Minor subsystem version */ 89f24071e5Spatrick .long 0 /* Win32 version */ 90f24071e5Spatrick .long _edata - efi_start /* Image size */ 91f24071e5Spatrick .long _end_header - efi_start /* Header size */ 92f24071e5Spatrick .long 0 /* Checksum */ 93f24071e5Spatrick .short 0xa /* Subsystem (EFI app) */ 94f24071e5Spatrick .short 0 /* DLL Characteristics */ 95f24071e5Spatrick .quad 0 /* Stack reserve */ 96f24071e5Spatrick .quad 0 /* Stack commit */ 97f24071e5Spatrick .quad 0 /* Heap reserve */ 98f24071e5Spatrick .quad 0 /* Heap commit */ 99f24071e5Spatrick .long 0 /* Loader flags */ 100f24071e5Spatrick .long 6 /* Number of RVAs */ 101f24071e5Spatrick 102f24071e5Spatrick /* RVAs: */ 103f24071e5Spatrick .quad 0 104f24071e5Spatrick .quad 0 105f24071e5Spatrick .quad 0 106f24071e5Spatrick .quad 0 107f24071e5Spatrick .quad 0 108f24071e5Spatrick .quad 0 109f24071e5Spatrick 110f24071e5Spatricksection_table: 111f24071e5Spatrick /* The contents of the loader */ 112f24071e5Spatrick .ascii ".text" 113f24071e5Spatrick .byte 0 114f24071e5Spatrick .byte 0 115f24071e5Spatrick .byte 0 /* Pad to 8 bytes */ 11609ce6c06Skettenis .long _etext - _end_header /* Virtual size */ 117f24071e5Spatrick .long _end_header - efi_start /* Virtual address */ 11809ce6c06Skettenis .long _etext - _end_header /* Size of raw data */ 119f24071e5Spatrick .long _end_header - efi_start /* Pointer to raw data */ 120f24071e5Spatrick .long 0 /* Pointer to relocations */ 121f24071e5Spatrick .long 0 /* Pointer to line numbers */ 122f24071e5Spatrick .short 0 /* Number of relocations */ 123f24071e5Spatrick .short 0 /* Number of line numbers */ 124f24071e5Spatrick .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \ 125f24071e5Spatrick IMAGE_SCN_MEM_READ) /* Characteristics */ 12609ce6c06Skettenis 12709ce6c06Skettenis /* The contents of the loader */ 12809ce6c06Skettenis .ascii ".data" 12909ce6c06Skettenis .byte 0 13009ce6c06Skettenis .byte 0 13109ce6c06Skettenis .byte 0 /* Pad to 8 bytes */ 13209ce6c06Skettenis .long __data_size /* Virtual size */ 13309ce6c06Skettenis .long __data_start - efi_start /* Virtual address */ 13409ce6c06Skettenis .long __data_size /* Size of raw data */ 13509ce6c06Skettenis .long __data_start - efi_start /* Pointer to raw data */ 13609ce6c06Skettenis .long 0 /* Pointer to relocations */ 13709ce6c06Skettenis .long 0 /* Pointer to line numbers */ 13809ce6c06Skettenis .short 0 /* Number of relocations */ 13909ce6c06Skettenis .short 0 /* Number of line numbers */ 14009ce6c06Skettenis .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \ 14109ce6c06Skettenis IMAGE_SCN_MEM_WRITE) /* Characteristics */ 14209ce6c06Skettenis 14309ce6c06Skettenis .align 12 144f24071e5Spatrick_end_header: 145f24071e5Spatrick 146f24071e5Spatrick .text 147f24071e5Spatrick .globl _start 148f24071e5Spatrick_start: 149f24071e5Spatrick /* Save the boot params to the stack */ 150f24071e5Spatrick stp x0, x1, [sp, #-16]! 151f24071e5Spatrick 152f24071e5Spatrick adr x0, __bss_start 153f24071e5Spatrick adr x1, __bss_end 154f24071e5Spatrick 155f24071e5Spatrick b 2f 156f24071e5Spatrick 157f24071e5Spatrick1: 158f24071e5Spatrick stp xzr, xzr, [x0], #16 159f24071e5Spatrick2: 160f24071e5Spatrick cmp x0, x1 161f24071e5Spatrick b.lo 1b 162f24071e5Spatrick 163f24071e5Spatrick adr x0, ImageBase 164f24071e5Spatrick adr x1, _DYNAMIC 165f24071e5Spatrick 166f24071e5Spatrick bl self_reloc 167f24071e5Spatrick 168f24071e5Spatrick ldp x0, x1, [sp], #16 169f24071e5Spatrick 170f24071e5Spatrick bl efi_main 171f24071e5Spatrick 172f24071e5Spatrick1: b 1b 173*fd00acebSpatrick 174*fd00acebSpatrick .data 175*fd00acebSpatrick .align 4 176*fd00acebSpatrick#include "dt_blob.S" 177