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