xref: /openbsd/sys/arch/arm64/stand/efiboot/start.S (revision fd00aceb)
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