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