xref: /freebsd/stand/efi/loader/arch/arm/start.S (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1ca987d46SWarner Losh/*-
2ca987d46SWarner Losh * Copyright (c) 2014, 2015 Andrew Turner
3ca987d46SWarner Losh * All rights reserved.
4ca987d46SWarner Losh *
5ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without
6ca987d46SWarner Losh * modification, are permitted provided that the following conditions
7ca987d46SWarner Losh * are met:
8ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright
9ca987d46SWarner Losh *    notice, this list of conditions and the following disclaimer.
10ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright
11ca987d46SWarner Losh *    notice, this list of conditions and the following disclaimer in the
12ca987d46SWarner Losh *    documentation and/or other materials provided with the distribution.
13ca987d46SWarner Losh *
14ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17ca987d46SWarner Losh * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24ca987d46SWarner Losh * SUCH DAMAGE.
25ca987d46SWarner Losh */
26ca987d46SWarner Losh
27ca987d46SWarner Losh#include <machine/asm.h>
28ca987d46SWarner Losh
29ca987d46SWarner Losh/*
30ca987d46SWarner Losh * We need to be a PE32 file for EFI. On some architectures we can use
31ca987d46SWarner Losh * objcopy to create the correct file, however on arm we need to do
32ca987d46SWarner Losh * it ourselves.
33ca987d46SWarner Losh */
34ca987d46SWarner Losh
35ca987d46SWarner Losh#define	IMAGE_FILE_MACHINE_ARM		0x01c2
36ca987d46SWarner Losh
37ca987d46SWarner Losh#define	IMAGE_SCN_CNT_CODE		0x00000020
38ca987d46SWarner Losh#define	IMAGE_SCN_CNT_INITIALIZED_DATA	0x00000040
39ca987d46SWarner Losh#define	IMAGE_SCN_MEM_DISCARDABLE	0x02000000
40ca987d46SWarner Losh#define	IMAGE_SCN_MEM_EXECUTE		0x20000000
41ca987d46SWarner Losh#define	IMAGE_SCN_MEM_READ		0x40000000
42ca987d46SWarner Losh
43ca987d46SWarner Losh	.section .peheader,"a"
44ca987d46SWarner Loshefi_start:
45ca987d46SWarner Losh	/* The MS-DOS Stub, only used to get the offset of the COFF header */
46ca987d46SWarner Losh	.ascii	"MZ"
47ca987d46SWarner Losh	.short	0
48ca987d46SWarner Losh	.space	0x38
49ca987d46SWarner Losh	.long	pe_sig - efi_start
50ca987d46SWarner Losh
51ca987d46SWarner Losh	/* The PE32 Signature. Needs to be 8-byte aligned */
52ca987d46SWarner Losh	.align	3
53ca987d46SWarner Loshpe_sig:
54ca987d46SWarner Losh	.ascii	"PE"
55ca987d46SWarner Losh	.short	0
56ca987d46SWarner Loshcoff_head:
57ca987d46SWarner Losh	.short	IMAGE_FILE_MACHINE_ARM		/* ARM file */
58ca987d46SWarner Losh	.short	2				/* 2 Sections */
59ca987d46SWarner Losh	.long	0				/* Timestamp */
60ca987d46SWarner Losh	.long	0				/* No symbol table */
61ca987d46SWarner Losh	.long	0				/* No symbols */
62ca987d46SWarner Losh	.short	section_table - optional_header	/* Optional header size */
63ca987d46SWarner Losh	.short	0	/* Characteristics TODO: Fill in */
64ca987d46SWarner Losh
65ca987d46SWarner Loshoptional_header:
66ca987d46SWarner Losh	.short	0x010b				/* PE32 (32-bit addressing) */
67ca987d46SWarner Losh	.byte	0				/* Major linker version */
68ca987d46SWarner Losh	.byte	0				/* Minor linker version */
69ca987d46SWarner Losh	.long	_edata - _end_header		/* Code size */
70ca987d46SWarner Losh	.long	0				/* No initialized data */
71ca987d46SWarner Losh	.long	0				/* No uninitialized data */
72ca987d46SWarner Losh	.long	_start - efi_start		/* Entry point */
73ca987d46SWarner Losh	.long	_end_header - efi_start		/* Start of code */
74ca987d46SWarner Losh	.long	0				/* Start of data */
75ca987d46SWarner Losh
76ca987d46SWarner Loshoptional_windows_header:
77ca987d46SWarner Losh	.long	0				/* Image base */
78ca987d46SWarner Losh	.long	32				/* Section Alignment */
79ca987d46SWarner Losh	.long	8				/* File alignment */
80ca987d46SWarner Losh	.short	0				/* Major OS version */
81ca987d46SWarner Losh	.short	0				/* Minor OS version */
82ca987d46SWarner Losh	.short	0				/* Major image version */
83ca987d46SWarner Losh	.short	0				/* Minor image version */
84ca987d46SWarner Losh	.short	0				/* Major subsystem version */
85ca987d46SWarner Losh	.short	0				/* Minor subsystem version */
86ca987d46SWarner Losh	.long	0				/* Win32 version */
87ca987d46SWarner Losh	.long	_edata - efi_start		/* Image size */
88ca987d46SWarner Losh	.long	_end_header - efi_start		/* Header size */
89ca987d46SWarner Losh	.long	0				/* Checksum */
90ca987d46SWarner Losh	.short	0xa				/* Subsystem (EFI app) */
91ca987d46SWarner Losh	.short	0				/* DLL Characteristics */
92ca987d46SWarner Losh	.long	0				/* Stack reserve */
93ca987d46SWarner Losh	.long	0				/* Stack commit */
94ca987d46SWarner Losh	.long	0				/* Heap reserve */
95ca987d46SWarner Losh	.long	0				/* Heap commit */
96ca987d46SWarner Losh	.long	0				/* Loader flags */
97ca987d46SWarner Losh	.long	6				/* Number of RVAs */
98ca987d46SWarner Losh
99ca987d46SWarner Losh	/* RVAs: */
100ca987d46SWarner Losh	.quad	0
101ca987d46SWarner Losh	.quad	0
102ca987d46SWarner Losh	.quad	0
103ca987d46SWarner Losh	.quad	0
104ca987d46SWarner Losh	.quad	0
105ca987d46SWarner Losh	.quad	0
106ca987d46SWarner Losh
107ca987d46SWarner Loshsection_table:
108ca987d46SWarner Losh	/* We need a .reloc section for EFI */
109ca987d46SWarner Losh	.ascii	".reloc"
110ca987d46SWarner Losh	.byte	0
111ca987d46SWarner Losh	.byte	0				/* Pad to 8 bytes */
112ca987d46SWarner Losh	.long	0				/* Virtual size */
113ca987d46SWarner Losh	.long	0				/* Virtual address */
114ca987d46SWarner Losh	.long	0				/* Size of raw data */
115ca987d46SWarner Losh	.long	0				/* Pointer to raw data */
116ca987d46SWarner Losh	.long	0				/* Pointer to relocations */
117ca987d46SWarner Losh	.long	0				/* Pointer to line numbers */
118ca987d46SWarner Losh	.short	0				/* Number of relocations */
119ca987d46SWarner Losh	.short	0				/* Number of line numbers */
120ca987d46SWarner Losh	.long	(IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
121ca987d46SWarner Losh		 IMAGE_SCN_MEM_DISCARDABLE)	/* Characteristics */
122ca987d46SWarner Losh
123ca987d46SWarner Losh	/* The contents of the loader */
124ca987d46SWarner Losh	.ascii	".text"
125ca987d46SWarner Losh	.byte	0
126ca987d46SWarner Losh	.byte	0
127ca987d46SWarner Losh	.byte	0				/* Pad to 8 bytes */
128ca987d46SWarner Losh	.long	_edata - _end_header		/* Virtual size */
129ca987d46SWarner Losh	.long	_end_header - efi_start		/* Virtual address */
130ca987d46SWarner Losh	.long	_edata - _end_header		/* Size of raw data */
131ca987d46SWarner Losh	.long	_end_header - efi_start		/* Pointer to raw data */
132ca987d46SWarner Losh	.long	0				/* Pointer to relocations */
133ca987d46SWarner Losh	.long	0				/* Pointer to line numbers */
134ca987d46SWarner Losh	.short	0				/* Number of relocations */
135ca987d46SWarner Losh	.short	0				/* Number of line numbers */
136ca987d46SWarner Losh	.long	(IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
137ca987d46SWarner Losh		 IMAGE_SCN_MEM_READ)		/* Characteristics */
138ca987d46SWarner Losh_end_header:
139ca987d46SWarner Losh
140ca987d46SWarner Losh	.text
141*106c9ff5SJessica Clarke	.globl	_start
142ca987d46SWarner Losh_start:
143ca987d46SWarner Losh	/* Save the boot params to the stack */
144ca987d46SWarner Losh	push	{r0, r1}
145ca987d46SWarner Losh
146ca987d46SWarner Losh	adr	r0, .Lbase
147ca987d46SWarner Losh	ldr	r1, [r0]
148ca987d46SWarner Losh	sub	r5, r0, r1
149ca987d46SWarner Losh
150ca987d46SWarner Losh	ldr	r0, .Limagebase
151ca987d46SWarner Losh	add	r0, r0, r5
152ca987d46SWarner Losh	ldr	r1, .Ldynamic
153ca987d46SWarner Losh	add	r1, r1, r5
154ca987d46SWarner Losh
155ca987d46SWarner Losh	bl	_C_LABEL(self_reloc)
156ca987d46SWarner Losh
157ca987d46SWarner Losh	/* Zero the BSS, _reloc fixed the values for us */
158ca987d46SWarner Losh	ldr	r0, .Lbss
159ca987d46SWarner Losh	ldr	r1, .Lbssend
160ca987d46SWarner Losh	mov	r2, #0
161ca987d46SWarner Losh
162ca987d46SWarner Losh1:	cmp	r0, r1
163ca987d46SWarner Losh	bge	2f
164ca987d46SWarner Losh	str	r2, [r0], #4
165ca987d46SWarner Losh	b	1b
166ca987d46SWarner Losh2:
167ca987d46SWarner Losh
168ca987d46SWarner Losh	pop	{r0, r1}
169ca987d46SWarner Losh	bl	_C_LABEL(efi_main)
170ca987d46SWarner Losh
171ca987d46SWarner Losh1:	b	1b
172ca987d46SWarner Losh
173ca987d46SWarner Losh.Lbase:
174ca987d46SWarner Losh	.word	.
175ca987d46SWarner Losh.Limagebase:
176ca987d46SWarner Losh	.word	ImageBase
177ca987d46SWarner Losh.Ldynamic:
178ca987d46SWarner Losh	.word	_DYNAMIC
179ca987d46SWarner Losh.Lbss:
180ca987d46SWarner Losh	.word	__bss_start
181ca987d46SWarner Losh.Lbssend:
182ca987d46SWarner Losh	.word	__bss_end
183ca987d46SWarner Losh
184ca987d46SWarner Losh.align	3
185ca987d46SWarner Loshstack:
186ca987d46SWarner Losh	.space 512
187ca987d46SWarner Loshstack_end:
188ca987d46SWarner Losh
189