xref: /OK3568_Linux_fs/u-boot/arch/arm/lib/crt0_arm_efi.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * crt0-efi-arm.S - PE/COFF header for ARM 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	image_base
17*4882a593Smuzhiyunimage_base:
18*4882a593Smuzhiyun	.ascii	"MZ"
19*4882a593Smuzhiyun	.skip	58				/* 'MZ' + pad + offset == 64 */
20*4882a593Smuzhiyun	.long	pe_header - image_base		/* Offset to the PE header */
21*4882a593Smuzhiyunpe_header:
22*4882a593Smuzhiyun	.ascii	"PE"
23*4882a593Smuzhiyun	.short	0
24*4882a593Smuzhiyuncoff_header:
25*4882a593Smuzhiyun	.short	0x1c2				/* Mixed ARM/Thumb */
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_32BIT_MACHINE |
33*4882a593Smuzhiyun	 * IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
34*4882a593Smuzhiyun	 * IMAGE_FILE_LINE_NUMS_STRIPPED
35*4882a593Smuzhiyun	 */
36*4882a593Smuzhiyun	.short	0x306
37*4882a593Smuzhiyunoptional_header:
38*4882a593Smuzhiyun	.short	0x10b				/* PE32+ format */
39*4882a593Smuzhiyun	.byte	0x02				/* MajorLinkerVersion */
40*4882a593Smuzhiyun	.byte	0x14				/* MinorLinkerVersion */
41*4882a593Smuzhiyun	.long	_edata - _start			/* SizeOfCode */
42*4882a593Smuzhiyun	.long	0				/* SizeOfInitializedData */
43*4882a593Smuzhiyun	.long	0				/* SizeOfUninitializedData */
44*4882a593Smuzhiyun	.long	_start - image_base		/* AddressOfEntryPoint */
45*4882a593Smuzhiyun	.long	_start - image_base		/* BaseOfCode */
46*4882a593Smuzhiyun	.long	0				/* BaseOfData */
47*4882a593Smuzhiyun
48*4882a593Smuzhiyunextra_header_fields:
49*4882a593Smuzhiyun	.long	0				/* image_base */
50*4882a593Smuzhiyun	.long	0x20				/* SectionAlignment */
51*4882a593Smuzhiyun	.long	0x8				/* FileAlignment */
52*4882a593Smuzhiyun	.short	0				/* MajorOperatingSystemVersion */
53*4882a593Smuzhiyun	.short	0				/* MinorOperatingSystemVersion */
54*4882a593Smuzhiyun	.short	0				/* MajorImageVersion */
55*4882a593Smuzhiyun	.short	0				/* MinorImageVersion */
56*4882a593Smuzhiyun	.short	0				/* MajorSubsystemVersion */
57*4882a593Smuzhiyun	.short	0				/* MinorSubsystemVersion */
58*4882a593Smuzhiyun	.long	0				/* Win32VersionValue */
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun	.long	_edata - image_base		/* SizeOfImage */
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun	/*
63*4882a593Smuzhiyun	 * Everything before the kernel image is considered part of the header
64*4882a593Smuzhiyun	 */
65*4882a593Smuzhiyun	.long	_start - image_base		/* SizeOfHeaders */
66*4882a593Smuzhiyun	.long	0				/* CheckSum */
67*4882a593Smuzhiyun	.short	EFI_SUBSYSTEM			/* Subsystem */
68*4882a593Smuzhiyun	.short	0				/* DllCharacteristics */
69*4882a593Smuzhiyun	.long	0				/* SizeOfStackReserve */
70*4882a593Smuzhiyun	.long	0				/* SizeOfStackCommit */
71*4882a593Smuzhiyun	.long	0				/* SizeOfHeapReserve */
72*4882a593Smuzhiyun	.long	0				/* SizeOfHeapCommit */
73*4882a593Smuzhiyun	.long	0				/* LoaderFlags */
74*4882a593Smuzhiyun	.long	0x6				/* NumberOfRvaAndSizes */
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun	.quad	0				/* ExportTable */
77*4882a593Smuzhiyun	.quad	0				/* ImportTable */
78*4882a593Smuzhiyun	.quad	0				/* ResourceTable */
79*4882a593Smuzhiyun	.quad	0				/* ExceptionTable */
80*4882a593Smuzhiyun	.quad	0				/* CertificationTable */
81*4882a593Smuzhiyun	.quad	0				/* BaseRelocationTable */
82*4882a593Smuzhiyun
83*4882a593Smuzhiyunsection_table:
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	/*
86*4882a593Smuzhiyun	 * The EFI application loader requires a relocation section
87*4882a593Smuzhiyun	 * because EFI applications must be relocatable.  This is a
88*4882a593Smuzhiyun	 * dummy section as far as we are concerned.
89*4882a593Smuzhiyun	 */
90*4882a593Smuzhiyun	.ascii	".reloc"
91*4882a593Smuzhiyun	.byte	0
92*4882a593Smuzhiyun	.byte	0			/* end of 0 padding of section name */
93*4882a593Smuzhiyun	.long	0
94*4882a593Smuzhiyun	.long	0
95*4882a593Smuzhiyun	.long	0			/* SizeOfRawData */
96*4882a593Smuzhiyun	.long	0			/* PointerToRawData */
97*4882a593Smuzhiyun	.long	0			/* PointerToRelocations */
98*4882a593Smuzhiyun	.long	0			/* PointerToLineNumbers */
99*4882a593Smuzhiyun	.short	0			/* NumberOfRelocations */
100*4882a593Smuzhiyun	.short	0			/* NumberOfLineNumbers */
101*4882a593Smuzhiyun	.long	0x42100040		/* Characteristics (section flags) */
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 - image_base	/* VirtualAddress */
109*4882a593Smuzhiyun	.long	_edata - _start		/* SizeOfRawData */
110*4882a593Smuzhiyun	.long	_start - image_base	/* 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	stmfd		sp!, {r0-r2, lr}
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	mov		r2, r0
122*4882a593Smuzhiyun	mov		r3, r1
123*4882a593Smuzhiyun	adr		r1, .L_DYNAMIC
124*4882a593Smuzhiyun	ldr		r0, [r1]
125*4882a593Smuzhiyun	add		r1, r0, r1
126*4882a593Smuzhiyun	adr		r0, image_base
127*4882a593Smuzhiyun	bl		_relocate
128*4882a593Smuzhiyun	teq		r0, #0
129*4882a593Smuzhiyun	bne		0f
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	ldmfd		sp, {r0-r1}
132*4882a593Smuzhiyun	bl		efi_main
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun0:	add		sp, sp, #12
135*4882a593Smuzhiyun	ldr		pc, [sp], #4
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun.L_DYNAMIC:
138*4882a593Smuzhiyun	.word		_DYNAMIC - .
139