Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / arm / boot / compressed / efi-header.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2013-2017 Linaro Ltd
4  * Authors: Roy Franz <roy.franz@linaro.org>
5  *          Ard Biesheuvel <ard.biesheuvel@linaro.org>
6  */
7
8 #include <linux/pe.h>
9 #include <linux/sizes.h>
10
11                 .macro  __nop
12 #ifdef CONFIG_EFI_STUB
13                 @ This is almost but not quite a NOP, since it does clobber the
14                 @ condition flags. But it is the best we can do for EFI, since
15                 @ PE/COFF expects the magic string "MZ" at offset 0, while the
16                 @ ARM/Linux boot protocol expects an executable instruction
17                 @ there.
18                 .inst   MZ_MAGIC | (0x1310 << 16)       @ tstne r0, #0x4d000
19 #else
20  AR_CLASS(      mov     r0, r0          )
21   M_CLASS(      nop.w                   )
22 #endif
23                 .endm
24
25                 .macro  __EFI_HEADER
26 #ifdef CONFIG_EFI_STUB
27                 .set    start_offset, __efi_start - start
28                 .org    start + 0x3c
29                 @
30                 @ The PE header can be anywhere in the file, but for
31                 @ simplicity we keep it together with the MSDOS header
32                 @ The offset to the PE/COFF header needs to be at offset
33                 @ 0x3C in the MSDOS header.
34                 @ The only 2 fields of the MSDOS header that are used are this
35                 @ PE/COFF offset, and the "MZ" bytes at offset 0x0.
36                 @
37                 .long   pe_header - start               @ Offset to the PE header.
38
39 pe_header:
40                 .long   PE_MAGIC
41
42 coff_header:
43                 .short  IMAGE_FILE_MACHINE_THUMB        @ Machine
44                 .short  section_count                   @ NumberOfSections
45                 .long   0                               @ TimeDateStamp
46                 .long   0                               @ PointerToSymbolTable
47                 .long   0                               @ NumberOfSymbols
48                 .short  section_table - optional_header @ SizeOfOptionalHeader
49                 .short  IMAGE_FILE_32BIT_MACHINE | \
50                         IMAGE_FILE_DEBUG_STRIPPED | \
51                         IMAGE_FILE_EXECUTABLE_IMAGE | \
52                         IMAGE_FILE_LINE_NUMS_STRIPPED   @ Characteristics
53
54 #define __pecoff_code_size (__pecoff_data_start - __efi_start)
55
56 optional_header:
57                 .short  PE_OPT_MAGIC_PE32               @ PE32 format
58                 .byte   0x02                            @ MajorLinkerVersion
59                 .byte   0x14                            @ MinorLinkerVersion
60                 .long   __pecoff_code_size              @ SizeOfCode
61                 .long   __pecoff_data_size              @ SizeOfInitializedData
62                 .long   0                               @ SizeOfUninitializedData
63                 .long   efi_stub_entry - start          @ AddressOfEntryPoint
64                 .long   start_offset                    @ BaseOfCode
65                 .long   __pecoff_data_start - start     @ BaseOfData
66
67 extra_header_fields:
68                 .long   0                               @ ImageBase
69                 .long   SZ_4K                           @ SectionAlignment
70                 .long   SZ_512                          @ FileAlignment
71                 .short  0                               @ MajorOsVersion
72                 .short  0                               @ MinorOsVersion
73                 .short  0                               @ MajorImageVersion
74                 .short  0                               @ MinorImageVersion
75                 .short  0                               @ MajorSubsystemVersion
76                 .short  0                               @ MinorSubsystemVersion
77                 .long   0                               @ Win32VersionValue
78
79                 .long   __pecoff_end - start            @ SizeOfImage
80                 .long   start_offset                    @ SizeOfHeaders
81                 .long   0                               @ CheckSum
82                 .short  IMAGE_SUBSYSTEM_EFI_APPLICATION @ Subsystem
83                 .short  0                               @ DllCharacteristics
84                 .long   0                               @ SizeOfStackReserve
85                 .long   0                               @ SizeOfStackCommit
86                 .long   0                               @ SizeOfHeapReserve
87                 .long   0                               @ SizeOfHeapCommit
88                 .long   0                               @ LoaderFlags
89                 .long   (section_table - .) / 8         @ NumberOfRvaAndSizes
90
91                 .quad   0                               @ ExportTable
92                 .quad   0                               @ ImportTable
93                 .quad   0                               @ ResourceTable
94                 .quad   0                               @ ExceptionTable
95                 .quad   0                               @ CertificationTable
96                 .quad   0                               @ BaseRelocationTable
97
98 section_table:
99                 .ascii  ".text\0\0\0"
100                 .long   __pecoff_code_size              @ VirtualSize
101                 .long   __efi_start                     @ VirtualAddress
102                 .long   __pecoff_code_size              @ SizeOfRawData
103                 .long   __efi_start                     @ PointerToRawData
104                 .long   0                               @ PointerToRelocations
105                 .long   0                               @ PointerToLineNumbers
106                 .short  0                               @ NumberOfRelocations
107                 .short  0                               @ NumberOfLineNumbers
108                 .long   IMAGE_SCN_CNT_CODE | \
109                         IMAGE_SCN_MEM_READ | \
110                         IMAGE_SCN_MEM_EXECUTE           @ Characteristics
111
112                 .ascii  ".data\0\0\0"
113                 .long   __pecoff_data_size              @ VirtualSize
114                 .long   __pecoff_data_start - start     @ VirtualAddress
115                 .long   __pecoff_data_rawsize           @ SizeOfRawData
116                 .long   __pecoff_data_start - start     @ PointerToRawData
117                 .long   0                               @ PointerToRelocations
118                 .long   0                               @ PointerToLineNumbers
119                 .short  0                               @ NumberOfRelocations
120                 .short  0                               @ NumberOfLineNumbers
121                 .long   IMAGE_SCN_CNT_INITIALIZED_DATA | \
122                         IMAGE_SCN_MEM_READ | \
123                         IMAGE_SCN_MEM_WRITE             @ Characteristics
124
125                 .set    section_count, (. - section_table) / 40
126
127                 .align  12
128 __efi_start:
129 #endif
130                 .endm