xref: /openbmc/u-boot/arch/arm/lib/crt0_aarch64_efi.S (revision fb057880)
1/*
2 * crt0-efi-aarch64.S - PE/COFF header for aarch64 EFI applications
3 *
4 * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
5 *
6 * SPDX-License-Identifier:     GPL-2.0+     BSD-2-Clause
7 *
8 * This file is taken and modified from the gnu-efi project.
9 */
10
11	.section	.text.head
12
13	/*
14	 * Magic "MZ" signature for PE/COFF
15	 */
16	.globl	ImageBase
17ImageBase:
18	.ascii	"MZ"
19	.skip	58				/* 'MZ' + pad + offset == 64 */
20	.long	pe_header - ImageBase		/* Offset to the PE header */
21pe_header:
22	.ascii	"PE"
23	.short	0
24coff_header:
25	.short	0xaa64				/* AArch64 */
26	.short	2				/* nr_sections */
27	.long	0				/* TimeDateStamp */
28	.long	0				/* PointerToSymbolTable */
29	.long	1				/* NumberOfSymbols */
30	.short	section_table - optional_header	/* SizeOfOptionalHeader */
31	/*
32	 * Characteristics: IMAGE_FILE_DEBUG_STRIPPED |
33	 * IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED
34	 */
35	.short	0x206
36optional_header:
37	.short	0x20b				/* PE32+ format */
38	.byte	0x02				/* MajorLinkerVersion */
39	.byte	0x14				/* MinorLinkerVersion */
40	.long	_edata - _start			/* SizeOfCode */
41	.long	0				/* SizeOfInitializedData */
42	.long	0				/* SizeOfUninitializedData */
43	.long	_start - ImageBase		/* AddressOfEntryPoint */
44	.long	_start - ImageBase		/* BaseOfCode */
45
46extra_header_fields:
47	.quad	0				/* ImageBase */
48	.long	0x20				/* SectionAlignment */
49	.long	0x8				/* FileAlignment */
50	.short	0				/* MajorOperatingSystemVersion */
51	.short	0				/* MinorOperatingSystemVersion */
52	.short	0				/* MajorImageVersion */
53	.short	0				/* MinorImageVersion */
54	.short	0				/* MajorSubsystemVersion */
55	.short	0				/* MinorSubsystemVersion */
56	.long	0				/* Win32VersionValue */
57
58	.long	_edata - ImageBase		/* SizeOfImage */
59
60	/*
61	 * Everything before the kernel image is considered part of the header
62	 */
63	.long	_start - ImageBase		/* SizeOfHeaders */
64	.long	0				/* CheckSum */
65	.short	EFI_SUBSYSTEM			/* Subsystem */
66	.short	0				/* DllCharacteristics */
67	.quad	0				/* SizeOfStackReserve */
68	.quad	0				/* SizeOfStackCommit */
69	.quad	0				/* SizeOfHeapReserve */
70	.quad	0				/* SizeOfHeapCommit */
71	.long	0				/* LoaderFlags */
72	.long	0x6				/* NumberOfRvaAndSizes */
73
74	.quad	0				/* ExportTable */
75	.quad	0				/* ImportTable */
76	.quad	0				/* ResourceTable */
77	.quad	0				/* ExceptionTable */
78	.quad	0				/* CertificationTable */
79	.quad	0				/* BaseRelocationTable */
80
81	/* Section table */
82section_table:
83
84	/*
85	 * The EFI application loader requires a relocation section
86	 * because EFI applications must be relocatable.  This is a
87	 * dummy section as far as we are concerned.
88	 */
89	.ascii	".reloc"
90	.byte	0
91	.byte	0			/* end of 0 padding of section name */
92	.long	0
93	.long	0
94	.long	0			/* SizeOfRawData */
95	.long	0			/* PointerToRawData */
96	.long	0			/* PointerToRelocations */
97	.long	0			/* PointerToLineNumbers */
98	.short	0			/* NumberOfRelocations */
99	.short	0			/* NumberOfLineNumbers */
100	.long	0x42100040		/* Characteristics (section flags) */
101
102
103	.ascii	".text"
104	.byte	0
105	.byte	0
106	.byte	0			/* end of 0 padding of section name */
107	.long	_edata - _start		/* VirtualSize */
108	.long	_start - ImageBase	/* VirtualAddress */
109	.long	_edata - _start		/* SizeOfRawData */
110	.long	_start - ImageBase	/* PointerToRawData */
111
112	.long	0		/* PointerToRelocations (0 for executables) */
113	.long	0		/* PointerToLineNumbers (0 for executables) */
114	.short	0		/* NumberOfRelocations  (0 for executables) */
115	.short	0		/* NumberOfLineNumbers  (0 for executables) */
116	.long	0xe0500020	/* Characteristics (section flags) */
117
118_start:
119	stp		x29, x30, [sp, #-32]!
120	mov		x29, sp
121
122	stp		x0, x1, [sp, #16]
123	mov		x2, x0
124	mov		x3, x1
125	adr		x0, ImageBase
126	adrp		x1, _DYNAMIC
127	add		x1, x1, #:lo12:_DYNAMIC
128	bl		_relocate
129	cbnz		x0, 0f
130
131	ldp		x0, x1, [sp, #16]
132	bl		efi_main
133
1340:	ldp		x29, x30, [sp], #32
135	ret
136