Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/efi/loader/arch/arm64/start.S
34889 views
1
/*-
2
* Copyright (c) 2014 Andrew Turner
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
/*
28
* We need to be a PE32+ file for EFI. On some architectures we can use
29
* objcopy to create the correct file, however on arm64 we need to do
30
* it ourselves.
31
*/
32
33
#define IMAGE_FILE_MACHINE_ARM64 0xaa64
34
35
#define IMAGE_FILE_EXECUTABLE 0x0002
36
37
#define IMAGE_SCN_CNT_CODE 0x00000020
38
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
39
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
40
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
41
#define IMAGE_SCN_MEM_READ 0x40000000
42
#define IMAGE_SCN_MEM_WRITE 0x80000000
43
44
.section .peheader,"a"
45
efi_start:
46
/* The MS-DOS Stub, only used to get the offset of the COFF header */
47
.ascii "MZ"
48
.short 0
49
.space 0x38
50
.long pe_sig - efi_start
51
52
/* The PE32 Signature. Needs to be 8-byte aligned */
53
.align 3
54
pe_sig:
55
.ascii "PE"
56
.short 0
57
coff_head:
58
.short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */
59
.short 2 /* 2 Sections */
60
.long 0 /* Timestamp */
61
.long 0 /* No symbol table */
62
.long 0 /* No symbols */
63
.short section_table - optional_header /* Optional header size */
64
.short IMAGE_FILE_EXECUTABLE /* Characteristics */
65
66
optional_header:
67
.short 0x020b /* PE32+ (64-bit addressing) */
68
.byte 0 /* Major linker version */
69
.byte 0 /* Minor linker version */
70
.long _etext - _end_header /* Code size */
71
.long __data_size /* Initialized data size */
72
.long 0 /* No uninitialized data */
73
.long _start - efi_start /* Entry point */
74
.long _end_header - efi_start /* Start of code */
75
76
optional_windows_header:
77
.quad 0 /* Image base */
78
.long 4096 /* Section Alignment */
79
.long 512 /* File alignment */
80
.short 0 /* Major OS version */
81
.short 0 /* Minor OS version */
82
.short 0 /* Major image version */
83
.short 0 /* Minor image version */
84
.short 0 /* Major subsystem version */
85
.short 0 /* Minor subsystem version */
86
.long 0 /* Win32 version */
87
.long _edata - efi_start /* Image size */
88
.long _end_header - efi_start /* Header size */
89
.long 0 /* Checksum */
90
.short 0xa /* Subsystem (EFI app) */
91
.short 0 /* DLL Characteristics */
92
.quad 0 /* Stack reserve */
93
.quad 0 /* Stack commit */
94
.quad 0 /* Heap reserve */
95
.quad 0 /* Heap commit */
96
.long 0 /* Loader flags */
97
.long 6 /* Number of RVAs */
98
99
/* RVAs: */
100
.quad 0
101
.quad 0
102
.quad 0
103
.quad 0
104
.quad 0
105
.quad 0
106
107
section_table:
108
.ascii ".text"
109
.byte 0
110
.byte 0
111
.byte 0 /* Pad to 8 bytes */
112
.long _etext - _end_header /* Virtual size */
113
.long _end_header - efi_start /* Virtual address */
114
.long _etext - _end_header /* Size of raw data */
115
.long _end_header - efi_start /* Pointer to raw data */
116
.long 0 /* Pointer to relocations */
117
.long 0 /* Pointer to line numbers */
118
.short 0 /* Number of relocations */
119
.short 0 /* Number of line numbers */
120
.long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
121
IMAGE_SCN_MEM_READ) /* Characteristics */
122
123
.ascii ".data"
124
.byte 0
125
.byte 0
126
.byte 0 /* Pad to 8 bytes */
127
.long __data_size /* Virtual size */
128
.long __data_start - efi_start /* Virtual address */
129
.long __data_size /* Size of raw data */
130
.long __data_start - efi_start /* Pointer to raw data */
131
.long 0 /* Pointer to relocations */
132
.long 0 /* Pointer to line numbers */
133
.short 0 /* Number of relocations */
134
.short 0 /* Number of line numbers */
135
.long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
136
IMAGE_SCN_MEM_WRITE) /* Characteristics */
137
138
.align 12
139
_end_header:
140
141
.text
142
.globl _start
143
_start:
144
/* Save the boot params to the stack */
145
stp x0, x1, [sp, #-16]!
146
147
adrp x0, __bss_start
148
add x0, x0, :lo12:__bss_start
149
adrp x1, __bss_end
150
add x1, x1, :lo12:__bss_end
151
152
b 2f
153
154
1:
155
stp xzr, xzr, [x0], #16
156
2:
157
cmp x0, x1
158
b.lo 1b
159
160
adrp x0, ImageBase
161
add x0, x0, :lo12:ImageBase
162
adrp x1, _DYNAMIC
163
add x1, x1, :lo12:_DYNAMIC
164
165
bl self_reloc
166
167
ldp x0, x1, [sp], #16
168
169
#ifndef EFI_BOOT1
170
/*
171
* Load the stack to use. The default stack may be too small for
172
* the lua loader.
173
*/
174
adrp x2, initstack_end
175
add x2, x2, :lo12:initstack_end
176
mov sp, x2
177
#endif
178
179
bl efi_main
180
181
1: b 1b
182
183
#ifndef EFI_BOOT1
184
.bss
185
.align 4
186
initstack:
187
.space (64 * 1024)
188
initstack_end:
189
#endif
190
191