xref: /openbmc/linux/arch/arm64/kernel/efi-header.S (revision 82e6fdd6)
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
15coff_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
26optional_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
36extra_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
75section_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
120efi_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
134efi_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
154efi_header_end:
155	.endm
156