]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - stand/efi/loader/arch/arm64/start.S
MFC r338337: Fix lualoader on arm64
[FreeBSD/FreeBSD.git] / stand / efi / loader / arch / arm64 / start.S
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  * $FreeBSD$
27  */
28
29 /*
30  * We need to be a PE32+ file for EFI. On some architectures we can use
31  * objcopy to create the correct file, however on arm64 we need to do
32  * it ourselves.
33  */
34
35 #define IMAGE_FILE_MACHINE_ARM64        0xaa64
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
43         .section .peheader,"a"
44 efi_start:
45         /* The MS-DOS Stub, only used to get the offset of the COFF header */
46         .ascii  "MZ"
47         .short  0
48         .space  0x38
49         .long   pe_sig - efi_start
50
51         /* The PE32 Signature. Needs to be 8-byte aligned */
52         .align  3
53 pe_sig:
54         .ascii  "PE"
55         .short  0
56 coff_head:
57         .short  IMAGE_FILE_MACHINE_ARM64        /* AArch64 file */
58         .short  2                               /* 2 Sections */
59         .long   0                               /* Timestamp */
60         .long   0                               /* No symbol table */
61         .long   0                               /* No symbols */
62         .short  section_table - optional_header /* Optional header size */
63         .short  0       /* Characteristics TODO: Fill in */
64
65 optional_header:
66         .short  0x020b                          /* PE32+ (64-bit addressing) */
67         .byte   0                               /* Major linker version */
68         .byte   0                               /* Minor linker version */
69         .long   _edata - _end_header            /* Code size */
70         .long   0                               /* No initialized data */
71         .long   0                               /* No uninitialized data */
72         .long   _start - efi_start              /* Entry point */
73         .long   _end_header - efi_start         /* Start of code */
74
75 optional_windows_header:
76         .quad   0                               /* Image base */
77         .long   32                              /* Section Alignment */
78         .long   8                               /* File alignment */
79         .short  0                               /* Major OS version */
80         .short  0                               /* Minor OS version */
81         .short  0                               /* Major image version */
82         .short  0                               /* Minor image version */
83         .short  0                               /* Major subsystem version */
84         .short  0                               /* Minor subsystem version */
85         .long   0                               /* Win32 version */
86         .long   _edata - efi_start              /* Image size */
87         .long   _end_header - efi_start         /* Header size */
88         .long   0                               /* Checksum */
89         .short  0xa                             /* Subsystem (EFI app) */
90         .short  0                               /* DLL Characteristics */
91         .quad   0                               /* Stack reserve */
92         .quad   0                               /* Stack commit */
93         .quad   0                               /* Heap reserve */
94         .quad   0                               /* Heap commit */
95         .long   0                               /* Loader flags */
96         .long   6                               /* Number of RVAs */
97
98         /* RVAs: */
99         .quad   0
100         .quad   0
101         .quad   0
102         .quad   0
103         .quad   0
104         .quad   0
105
106 section_table:
107         /* We need a .reloc section for EFI */
108         .ascii  ".reloc"
109         .byte   0
110         .byte   0                               /* Pad to 8 bytes */
111         .long   0                               /* Virtual size */
112         .long   0                               /* Virtual address */
113         .long   0                               /* Size of raw data */
114         .long   0                               /* Pointer to raw data */
115         .long   0                               /* Pointer to relocations */
116         .long   0                               /* Pointer to line numbers */
117         .short  0                               /* Number of relocations */
118         .short  0                               /* Number of line numbers */
119         .long   (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
120                  IMAGE_SCN_MEM_DISCARDABLE)     /* Characteristics */
121
122         /* The contents of the loader */
123         .ascii  ".text"
124         .byte   0
125         .byte   0
126         .byte   0                               /* Pad to 8 bytes */
127         .long   _edata - _end_header            /* Virtual size */
128         .long   _end_header - efi_start         /* Virtual address */
129         .long   _edata - _end_header            /* Size of raw data */
130         .long   _end_header - 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_CODE | IMAGE_SCN_MEM_EXECUTE | \
136                  IMAGE_SCN_MEM_READ)            /* Characteristics */
137 _end_header:
138
139         .text
140         .globl  _start
141 _start:
142         /* Save the boot params to the stack */
143         stp     x0, x1, [sp, #-16]!
144
145         adr     x0, __bss_start
146         adr     x1, __bss_end
147
148         b 2f
149
150 1:
151         stp     xzr, xzr, [x0], #16
152 2:
153         cmp     x0, x1
154         b.lo    1b
155
156         adr     x0, ImageBase
157         adr     x1, _DYNAMIC
158
159         bl      self_reloc
160
161         ldp     x0, x1, [sp], #16
162
163 #ifndef EFI_BOOT1
164         /*
165          * Load the stack to use. The default stack may be too small for
166          * the lua loader.
167          */
168         adr     x2, initstack_end
169         mov     sp, x2
170 #endif
171
172         bl      efi_main
173
174 1:      b       1b
175
176 #ifndef EFI_BOOT1
177 .bss
178         .align  4
179 initstack:
180         .space  (64 * 1024)
181 initstack_end:
182 #endif