diff options
Diffstat (limited to 'arch/arm/boot/compressed/efi-header.S')
-rw-r--r-- | arch/arm/boot/compressed/efi-header.S | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/arch/arm/boot/compressed/efi-header.S b/arch/arm/boot/compressed/efi-header.S new file mode 100644 index 000000000000..9d5dc4fda3c1 --- /dev/null +++ b/arch/arm/boot/compressed/efi-header.S | |||
@@ -0,0 +1,130 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013-2015 Linaro Ltd | ||
3 | * Authors: Roy Franz <roy.franz@linaro.org> | ||
4 | * Ard Biesheuvel <ard.biesheuvel@linaro.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
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 'M' | ('Z' << 8) | (0x1310 << 16) @ tstne r0, #0x4d000 | ||
19 | #else | ||
20 | mov r0, r0 | ||
21 | #endif | ||
22 | .endm | ||
23 | |||
24 | .macro __EFI_HEADER | ||
25 | #ifdef CONFIG_EFI_STUB | ||
26 | b __efi_start | ||
27 | |||
28 | .set start_offset, __efi_start - start | ||
29 | .org start + 0x3c | ||
30 | @ | ||
31 | @ The PE header can be anywhere in the file, but for | ||
32 | @ simplicity we keep it together with the MSDOS header | ||
33 | @ The offset to the PE/COFF header needs to be at offset | ||
34 | @ 0x3C in the MSDOS header. | ||
35 | @ The only 2 fields of the MSDOS header that are used are this | ||
36 | @ PE/COFF offset, and the "MZ" bytes at offset 0x0. | ||
37 | @ | ||
38 | .long pe_header - start @ Offset to the PE header. | ||
39 | |||
40 | pe_header: | ||
41 | .ascii "PE\0\0" | ||
42 | |||
43 | coff_header: | ||
44 | .short 0x01c2 @ ARM or Thumb | ||
45 | .short 2 @ nr_sections | ||
46 | .long 0 @ TimeDateStamp | ||
47 | .long 0 @ PointerToSymbolTable | ||
48 | .long 1 @ NumberOfSymbols | ||
49 | .short section_table - optional_header | ||
50 | @ SizeOfOptionalHeader | ||
51 | .short 0x306 @ Characteristics. | ||
52 | @ IMAGE_FILE_32BIT_MACHINE | | ||
53 | @ IMAGE_FILE_DEBUG_STRIPPED | | ||
54 | @ IMAGE_FILE_EXECUTABLE_IMAGE | | ||
55 | @ IMAGE_FILE_LINE_NUMS_STRIPPED | ||
56 | |||
57 | optional_header: | ||
58 | .short 0x10b @ PE32 format | ||
59 | .byte 0x02 @ MajorLinkerVersion | ||
60 | .byte 0x14 @ MinorLinkerVersion | ||
61 | .long _end - __efi_start @ SizeOfCode | ||
62 | .long 0 @ SizeOfInitializedData | ||
63 | .long 0 @ SizeOfUninitializedData | ||
64 | .long efi_stub_entry - start @ AddressOfEntryPoint | ||
65 | .long start_offset @ BaseOfCode | ||
66 | .long 0 @ data | ||
67 | |||
68 | extra_header_fields: | ||
69 | .long 0 @ ImageBase | ||
70 | .long 0x200 @ SectionAlignment | ||
71 | .long 0x200 @ FileAlignment | ||
72 | .short 0 @ MajorOperatingSystemVersion | ||
73 | .short 0 @ MinorOperatingSystemVersion | ||
74 | .short 0 @ MajorImageVersion | ||
75 | .short 0 @ MinorImageVersion | ||
76 | .short 0 @ MajorSubsystemVersion | ||
77 | .short 0 @ MinorSubsystemVersion | ||
78 | .long 0 @ Win32VersionValue | ||
79 | |||
80 | .long _end - start @ SizeOfImage | ||
81 | .long start_offset @ SizeOfHeaders | ||
82 | .long 0 @ CheckSum | ||
83 | .short 0xa @ Subsystem (EFI application) | ||
84 | .short 0 @ DllCharacteristics | ||
85 | .long 0 @ SizeOfStackReserve | ||
86 | .long 0 @ SizeOfStackCommit | ||
87 | .long 0 @ SizeOfHeapReserve | ||
88 | .long 0 @ SizeOfHeapCommit | ||
89 | .long 0 @ LoaderFlags | ||
90 | .long 0x6 @ NumberOfRvaAndSizes | ||
91 | |||
92 | .quad 0 @ ExportTable | ||
93 | .quad 0 @ ImportTable | ||
94 | .quad 0 @ ResourceTable | ||
95 | .quad 0 @ ExceptionTable | ||
96 | .quad 0 @ CertificationTable | ||
97 | .quad 0 @ BaseRelocationTable | ||
98 | |||
99 | section_table: | ||
100 | @ | ||
101 | @ The EFI application loader requires a relocation section | ||
102 | @ because EFI applications must be relocatable. This is a | ||
103 | @ dummy section as far as we are concerned. | ||
104 | @ | ||
105 | .ascii ".reloc\0\0" | ||
106 | .long 0 @ VirtualSize | ||
107 | .long 0 @ VirtualAddress | ||
108 | .long 0 @ SizeOfRawData | ||
109 | .long 0 @ PointerToRawData | ||
110 | .long 0 @ PointerToRelocations | ||
111 | .long 0 @ PointerToLineNumbers | ||
112 | .short 0 @ NumberOfRelocations | ||
113 | .short 0 @ NumberOfLineNumbers | ||
114 | .long 0x42100040 @ Characteristics | ||
115 | |||
116 | .ascii ".text\0\0\0" | ||
117 | .long _end - __efi_start @ VirtualSize | ||
118 | .long __efi_start @ VirtualAddress | ||
119 | .long _edata - __efi_start @ SizeOfRawData | ||
120 | .long __efi_start @ PointerToRawData | ||
121 | .long 0 @ PointerToRelocations | ||
122 | .long 0 @ PointerToLineNumbers | ||
123 | .short 0 @ NumberOfRelocations | ||
124 | .short 0 @ NumberOfLineNumbers | ||
125 | .long 0xe0500020 @ Characteristics | ||
126 | |||
127 | .align 9 | ||
128 | __efi_start: | ||
129 | #endif | ||
130 | .endm | ||