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