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