1*a0509109SArd Biesheuvel/* SPDX-License-Identifier: GPL-2.0 */
2*a0509109SArd Biesheuvel
3*a0509109SArd Biesheuvel#include <linux/pe.h>
4*a0509109SArd Biesheuvel
5*a0509109SArd Biesheuvel#ifdef CONFIG_64BIT
6*a0509109SArd Biesheuvel	.set		.Lextra_characteristics, 0x0
7*a0509109SArd Biesheuvel	.set		.Lpe_opt_magic, PE_OPT_MAGIC_PE32PLUS
8*a0509109SArd Biesheuvel#else
9*a0509109SArd Biesheuvel	.set		.Lextra_characteristics, IMAGE_FILE_32BIT_MACHINE
10*a0509109SArd Biesheuvel	.set		.Lpe_opt_magic, PE_OPT_MAGIC_PE32
11*a0509109SArd Biesheuvel#endif
12*a0509109SArd Biesheuvel
13*a0509109SArd Biesheuvel	.section	".head", "a"
14*a0509109SArd Biesheuvel	.globl		__efistub_efi_zboot_header
15*a0509109SArd Biesheuvel__efistub_efi_zboot_header:
16*a0509109SArd Biesheuvel.Ldoshdr:
17*a0509109SArd Biesheuvel	.long		MZ_MAGIC
18*a0509109SArd Biesheuvel	.ascii		"zimg"					// image type
19*a0509109SArd Biesheuvel	.long		__efistub__gzdata_start - .Ldoshdr	// payload offset
20*a0509109SArd Biesheuvel	.long		__efistub__gzdata_size - ZBOOT_SIZE_LEN	// payload size
21*a0509109SArd Biesheuvel	.long		0, 0					// reserved
22*a0509109SArd Biesheuvel	.asciz		COMP_TYPE				// compression type
23*a0509109SArd Biesheuvel	.org		.Ldoshdr + 0x3c
24*a0509109SArd Biesheuvel	.long		.Lpehdr - .Ldoshdr			// PE header offset
25*a0509109SArd Biesheuvel
26*a0509109SArd Biesheuvel.Lpehdr:
27*a0509109SArd Biesheuvel	.long		PE_MAGIC
28*a0509109SArd Biesheuvel	.short		MACHINE_TYPE
29*a0509109SArd Biesheuvel	.short		.Lsection_count
30*a0509109SArd Biesheuvel	.long		0
31*a0509109SArd Biesheuvel	.long		0
32*a0509109SArd Biesheuvel	.long		0
33*a0509109SArd Biesheuvel	.short		.Lsection_table - .Loptional_header
34*a0509109SArd Biesheuvel	.short		IMAGE_FILE_DEBUG_STRIPPED | \
35*a0509109SArd Biesheuvel			IMAGE_FILE_EXECUTABLE_IMAGE | \
36*a0509109SArd Biesheuvel			IMAGE_FILE_LINE_NUMS_STRIPPED |\
37*a0509109SArd Biesheuvel			.Lextra_characteristics
38*a0509109SArd Biesheuvel
39*a0509109SArd Biesheuvel.Loptional_header:
40*a0509109SArd Biesheuvel	.short		.Lpe_opt_magic
41*a0509109SArd Biesheuvel	.byte		0, 0
42*a0509109SArd Biesheuvel	.long		_etext - .Lefi_header_end
43*a0509109SArd Biesheuvel	.long		__data_size
44*a0509109SArd Biesheuvel	.long		0
45*a0509109SArd Biesheuvel	.long		__efistub_efi_zboot_entry - .Ldoshdr
46*a0509109SArd Biesheuvel	.long		.Lefi_header_end - .Ldoshdr
47*a0509109SArd Biesheuvel
48*a0509109SArd Biesheuvel#ifdef CONFIG_64BIT
49*a0509109SArd Biesheuvel	.quad		0
50*a0509109SArd Biesheuvel#else
51*a0509109SArd Biesheuvel	.long		_etext - .Ldoshdr, 0x0
52*a0509109SArd Biesheuvel#endif
53*a0509109SArd Biesheuvel	.long		4096
54*a0509109SArd Biesheuvel	.long		512
55*a0509109SArd Biesheuvel	.short		0, 0
56*a0509109SArd Biesheuvel	.short		LINUX_EFISTUB_MAJOR_VERSION	// MajorImageVersion
57*a0509109SArd Biesheuvel	.short		LINUX_EFISTUB_MINOR_VERSION	// MinorImageVersion
58*a0509109SArd Biesheuvel	.short		0, 0
59*a0509109SArd Biesheuvel	.long		0
60*a0509109SArd Biesheuvel	.long		_end - .Ldoshdr
61*a0509109SArd Biesheuvel
62*a0509109SArd Biesheuvel	.long		.Lefi_header_end - .Ldoshdr
63*a0509109SArd Biesheuvel	.long		0
64*a0509109SArd Biesheuvel	.short		IMAGE_SUBSYSTEM_EFI_APPLICATION
65*a0509109SArd Biesheuvel	.short		0
66*a0509109SArd Biesheuvel#ifdef CONFIG_64BIT
67*a0509109SArd Biesheuvel	.quad		0, 0, 0, 0
68*a0509109SArd Biesheuvel#else
69*a0509109SArd Biesheuvel	.long		0, 0, 0, 0
70*a0509109SArd Biesheuvel#endif
71*a0509109SArd Biesheuvel	.long		0
72*a0509109SArd Biesheuvel	.long		(.Lsection_table - .) / 8
73*a0509109SArd Biesheuvel
74*a0509109SArd Biesheuvel	.quad		0				// ExportTable
75*a0509109SArd Biesheuvel	.quad		0				// ImportTable
76*a0509109SArd Biesheuvel	.quad		0				// ResourceTable
77*a0509109SArd Biesheuvel	.quad		0				// ExceptionTable
78*a0509109SArd Biesheuvel	.quad		0				// CertificationTable
79*a0509109SArd Biesheuvel	.quad		0				// BaseRelocationTable
80*a0509109SArd Biesheuvel#ifdef CONFIG_DEBUG_EFI
81*a0509109SArd Biesheuvel	.long		.Lefi_debug_table - .Ldoshdr	// DebugTable
82*a0509109SArd Biesheuvel	.long		.Lefi_debug_table_size
83*a0509109SArd Biesheuvel#endif
84*a0509109SArd Biesheuvel
85*a0509109SArd Biesheuvel.Lsection_table:
86*a0509109SArd Biesheuvel	.ascii		".text\0\0\0"
87*a0509109SArd Biesheuvel	.long		_etext - .Lefi_header_end
88*a0509109SArd Biesheuvel	.long		.Lefi_header_end - .Ldoshdr
89*a0509109SArd Biesheuvel	.long		_etext - .Lefi_header_end
90*a0509109SArd Biesheuvel	.long		.Lefi_header_end - .Ldoshdr
91*a0509109SArd Biesheuvel
92*a0509109SArd Biesheuvel	.long		0, 0
93*a0509109SArd Biesheuvel	.short		0, 0
94*a0509109SArd Biesheuvel	.long		IMAGE_SCN_CNT_CODE | \
95*a0509109SArd Biesheuvel			IMAGE_SCN_MEM_READ | \
96*a0509109SArd Biesheuvel			IMAGE_SCN_MEM_EXECUTE
97*a0509109SArd Biesheuvel
98*a0509109SArd Biesheuvel	.ascii		".data\0\0\0"
99*a0509109SArd Biesheuvel	.long		__data_size
100*a0509109SArd Biesheuvel	.long		_etext - .Ldoshdr
101*a0509109SArd Biesheuvel	.long		__data_rawsize
102*a0509109SArd Biesheuvel	.long		_etext - .Ldoshdr
103*a0509109SArd Biesheuvel
104*a0509109SArd Biesheuvel	.long		0, 0
105*a0509109SArd Biesheuvel	.short		0, 0
106*a0509109SArd Biesheuvel	.long		IMAGE_SCN_CNT_INITIALIZED_DATA | \
107*a0509109SArd Biesheuvel			IMAGE_SCN_MEM_READ | \
108*a0509109SArd Biesheuvel			IMAGE_SCN_MEM_WRITE
109*a0509109SArd Biesheuvel
110*a0509109SArd Biesheuvel	.set		.Lsection_count, (. - .Lsection_table) / 40
111*a0509109SArd Biesheuvel
112*a0509109SArd Biesheuvel#ifdef CONFIG_DEBUG_EFI
113*a0509109SArd Biesheuvel	.section	".rodata", "a"
114*a0509109SArd Biesheuvel	.align		2
115*a0509109SArd Biesheuvel.Lefi_debug_table:
116*a0509109SArd Biesheuvel	// EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
117*a0509109SArd Biesheuvel	.long		0				// Characteristics
118*a0509109SArd Biesheuvel	.long		0				// TimeDateStamp
119*a0509109SArd Biesheuvel	.short		0				// MajorVersion
120*a0509109SArd Biesheuvel	.short		0				// MinorVersion
121*a0509109SArd Biesheuvel	.long		IMAGE_DEBUG_TYPE_CODEVIEW	// Type
122*a0509109SArd Biesheuvel	.long		.Lefi_debug_entry_size		// SizeOfData
123*a0509109SArd Biesheuvel	.long		0				// RVA
124*a0509109SArd Biesheuvel	.long		.Lefi_debug_entry - .Ldoshdr	// FileOffset
125*a0509109SArd Biesheuvel
126*a0509109SArd Biesheuvel	.set		.Lefi_debug_table_size, . - .Lefi_debug_table
127*a0509109SArd Biesheuvel	.previous
128*a0509109SArd Biesheuvel
129*a0509109SArd Biesheuvel.Lefi_debug_entry:
130*a0509109SArd Biesheuvel	// EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
131*a0509109SArd Biesheuvel	.ascii		"NB10"				// Signature
132*a0509109SArd Biesheuvel	.long		0				// Unknown
133*a0509109SArd Biesheuvel	.long		0				// Unknown2
134*a0509109SArd Biesheuvel	.long		0				// Unknown3
135*a0509109SArd Biesheuvel
136*a0509109SArd Biesheuvel	.asciz		ZBOOT_EFI_PATH
137*a0509109SArd Biesheuvel
138*a0509109SArd Biesheuvel	.set		.Lefi_debug_entry_size, . - .Lefi_debug_entry
139*a0509109SArd Biesheuvel#endif
140*a0509109SArd Biesheuvel
141*a0509109SArd Biesheuvel	.p2align	12
142*a0509109SArd Biesheuvel.Lefi_header_end:
143*a0509109SArd Biesheuvel
144