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