GNU Linux-libre 4.14.290-gnu1
[releases.git] / arch / arm64 / kernel / efi-header.S
1 /*
2  * Copyright (C) 2013 - 2017 Linaro, Ltd.
3  * Copyright (C) 2013, 2014 Red Hat, Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 #include <linux/pe.h>
11 #include <linux/sizes.h>
12
13         .macro  __EFI_PE_HEADER
14         .long   PE_MAGIC
15 coff_header:
16         .short  IMAGE_FILE_MACHINE_ARM64                // Machine
17         .short  section_count                           // NumberOfSections
18         .long   0                                       // TimeDateStamp
19         .long   0                                       // PointerToSymbolTable
20         .long   0                                       // NumberOfSymbols
21         .short  section_table - optional_header         // SizeOfOptionalHeader
22         .short  IMAGE_FILE_DEBUG_STRIPPED | \
23                 IMAGE_FILE_EXECUTABLE_IMAGE | \
24                 IMAGE_FILE_LINE_NUMS_STRIPPED           // Characteristics
25
26 optional_header:
27         .short  PE_OPT_MAGIC_PE32PLUS                   // PE32+ format
28         .byte   0x02                                    // MajorLinkerVersion
29         .byte   0x14                                    // MinorLinkerVersion
30         .long   __initdata_begin - efi_header_end       // SizeOfCode
31         .long   __pecoff_data_size                      // SizeOfInitializedData
32         .long   0                                       // SizeOfUninitializedData
33         .long   __efistub_entry - _head                 // AddressOfEntryPoint
34         .long   efi_header_end - _head                  // BaseOfCode
35
36 extra_header_fields:
37         .quad   0                                       // ImageBase
38         .long   SZ_4K                                   // SectionAlignment
39         .long   PECOFF_FILE_ALIGNMENT                   // FileAlignment
40         .short  0                                       // MajorOperatingSystemVersion
41         .short  0                                       // MinorOperatingSystemVersion
42         .short  0                                       // MajorImageVersion
43         .short  0                                       // MinorImageVersion
44         .short  0                                       // MajorSubsystemVersion
45         .short  0                                       // MinorSubsystemVersion
46         .long   0                                       // Win32VersionValue
47
48         .long   _end - _head                            // SizeOfImage
49
50         // Everything before the kernel image is considered part of the header
51         .long   efi_header_end - _head                  // SizeOfHeaders
52         .long   0                                       // CheckSum
53         .short  IMAGE_SUBSYSTEM_EFI_APPLICATION         // Subsystem
54         .short  0                                       // DllCharacteristics
55         .quad   0                                       // SizeOfStackReserve
56         .quad   0                                       // SizeOfStackCommit
57         .quad   0                                       // SizeOfHeapReserve
58         .quad   0                                       // SizeOfHeapCommit
59         .long   0                                       // LoaderFlags
60         .long   (section_table - .) / 8                 // NumberOfRvaAndSizes
61
62         .quad   0                                       // ExportTable
63         .quad   0                                       // ImportTable
64         .quad   0                                       // ResourceTable
65         .quad   0                                       // ExceptionTable
66         .quad   0                                       // CertificationTable
67         .quad   0                                       // BaseRelocationTable
68
69 #ifdef CONFIG_DEBUG_EFI
70         .long   efi_debug_table - _head                 // DebugTable
71         .long   efi_debug_table_size
72 #endif
73
74         // Section table
75 section_table:
76         .ascii  ".text\0\0\0"
77         .long   __initdata_begin - efi_header_end       // VirtualSize
78         .long   efi_header_end - _head                  // VirtualAddress
79         .long   __initdata_begin - efi_header_end       // SizeOfRawData
80         .long   efi_header_end - _head                  // PointerToRawData
81
82         .long   0                                       // PointerToRelocations
83         .long   0                                       // PointerToLineNumbers
84         .short  0                                       // NumberOfRelocations
85         .short  0                                       // NumberOfLineNumbers
86         .long   IMAGE_SCN_CNT_CODE | \
87                 IMAGE_SCN_MEM_READ | \
88                 IMAGE_SCN_MEM_EXECUTE                   // Characteristics
89
90         .ascii  ".data\0\0\0"
91         .long   __pecoff_data_size                      // VirtualSize
92         .long   __initdata_begin - _head                // VirtualAddress
93         .long   __pecoff_data_rawsize                   // SizeOfRawData
94         .long   __initdata_begin - _head                // PointerToRawData
95
96         .long   0                                       // PointerToRelocations
97         .long   0                                       // PointerToLineNumbers
98         .short  0                                       // NumberOfRelocations
99         .short  0                                       // NumberOfLineNumbers
100         .long   IMAGE_SCN_CNT_INITIALIZED_DATA | \
101                 IMAGE_SCN_MEM_READ | \
102                 IMAGE_SCN_MEM_WRITE                     // Characteristics
103
104         .set    section_count, (. - section_table) / 40
105
106 #ifdef CONFIG_DEBUG_EFI
107         /*
108          * The debug table is referenced via its Relative Virtual Address (RVA),
109          * which is only defined for those parts of the image that are covered
110          * by a section declaration. Since this header is not covered by any
111          * section, the debug table must be emitted elsewhere. So stick it in
112          * the .init.rodata section instead.
113          *
114          * Note that the EFI debug entry itself may legally have a zero RVA,
115          * which means we can simply put it right after the section headers.
116          */
117         __INITRODATA
118
119         .align  2
120 efi_debug_table:
121         // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
122         .long   0                                       // Characteristics
123         .long   0                                       // TimeDateStamp
124         .short  0                                       // MajorVersion
125         .short  0                                       // MinorVersion
126         .long   IMAGE_DEBUG_TYPE_CODEVIEW               // Type
127         .long   efi_debug_entry_size                    // SizeOfData
128         .long   0                                       // RVA
129         .long   efi_debug_entry - _head                 // FileOffset
130
131         .set    efi_debug_table_size, . - efi_debug_table
132         .previous
133
134 efi_debug_entry:
135         // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
136         .ascii  "NB10"                                  // Signature
137         .long   0                                       // Unknown
138         .long   0                                       // Unknown2
139         .long   0                                       // Unknown3
140
141         .asciz  VMLINUX_PATH
142
143         .set    efi_debug_entry_size, . - efi_debug_entry
144 #endif
145
146         /*
147          * EFI will load .text onwards at the 4k section alignment
148          * described in the PE/COFF header. To ensure that instruction
149          * sequences using an adrp and a :lo12: immediate will function
150          * correctly at this alignment, we must ensure that .text is
151          * placed at a 4k boundary in the Image to begin with.
152          */
153         .align 12
154 efi_header_end:
155         .endm