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