xref: /openbmc/linux/arch/riscv/kernel/efi-header.S (revision 5f8b7d4b2e9604d03ae06f1a2dd5a1f34c33e533)
1cb7d2dd5SAtish Patra/* SPDX-License-Identifier: GPL-2.0-only */
2cb7d2dd5SAtish Patra/*
3cb7d2dd5SAtish Patra * Copyright (C) 2020 Western Digital Corporation or its affiliates.
4cb7d2dd5SAtish Patra * Adapted from arch/arm64/kernel/efi-header.S
5cb7d2dd5SAtish Patra */
6cb7d2dd5SAtish Patra
7cb7d2dd5SAtish Patra#include <linux/pe.h>
8cb7d2dd5SAtish Patra#include <linux/sizes.h>
955de1e4aSAlexandre Ghiti#include <asm/set_memory.h>
10cb7d2dd5SAtish Patra
11cb7d2dd5SAtish Patra	.macro	__EFI_PE_HEADER
12cb7d2dd5SAtish Patra	.long	PE_MAGIC
13cb7d2dd5SAtish Patracoff_header:
14cb7d2dd5SAtish Patra#ifdef CONFIG_64BIT
15cb7d2dd5SAtish Patra	.short	IMAGE_FILE_MACHINE_RISCV64		// Machine
16cb7d2dd5SAtish Patra#else
17cb7d2dd5SAtish Patra	.short	IMAGE_FILE_MACHINE_RISCV32		// Machine
18cb7d2dd5SAtish Patra#endif
19cb7d2dd5SAtish Patra	.short	section_count				// NumberOfSections
20cb7d2dd5SAtish Patra	.long	0 					// TimeDateStamp
21cb7d2dd5SAtish Patra	.long	0					// PointerToSymbolTable
22cb7d2dd5SAtish Patra	.long	0					// NumberOfSymbols
23cb7d2dd5SAtish Patra	.short	section_table - optional_header		// SizeOfOptionalHeader
24cb7d2dd5SAtish Patra	.short	IMAGE_FILE_DEBUG_STRIPPED | \
25cb7d2dd5SAtish Patra		IMAGE_FILE_EXECUTABLE_IMAGE | \
26cb7d2dd5SAtish Patra		IMAGE_FILE_LINE_NUMS_STRIPPED		// Characteristics
27cb7d2dd5SAtish Patra
28cb7d2dd5SAtish Patraoptional_header:
29cb7d2dd5SAtish Patra#ifdef CONFIG_64BIT
30cb7d2dd5SAtish Patra	.short	PE_OPT_MAGIC_PE32PLUS			// PE32+ format
31cb7d2dd5SAtish Patra#else
32cb7d2dd5SAtish Patra	.short	PE_OPT_MAGIC_PE32			// PE32 format
33cb7d2dd5SAtish Patra#endif
34cb7d2dd5SAtish Patra	.byte	0x02					// MajorLinkerVersion
35cb7d2dd5SAtish Patra	.byte	0x14					// MinorLinkerVersion
36cb7d2dd5SAtish Patra	.long	__pecoff_text_end - efi_header_end	// SizeOfCode
3755de1e4aSAlexandre Ghiti#ifdef __clang__
38cb7d2dd5SAtish Patra	.long   __pecoff_data_virt_size			// SizeOfInitializedData
3955de1e4aSAlexandre Ghiti#else
4055de1e4aSAlexandre Ghiti	.long	__pecoff_data_virt_end - __pecoff_text_end	// SizeOfInitializedData
4155de1e4aSAlexandre Ghiti#endif
42cb7d2dd5SAtish Patra	.long	0					// SizeOfUninitializedData
43cb7d2dd5SAtish Patra	.long	__efistub_efi_pe_entry - _start		// AddressOfEntryPoint
44cb7d2dd5SAtish Patra	.long	efi_header_end - _start			// BaseOfCode
45cb7d2dd5SAtish Patra#ifdef CONFIG_32BIT
46cb7d2dd5SAtish Patra	.long  __pecoff_text_end - _start		// BaseOfData
47cb7d2dd5SAtish Patra#endif
48cb7d2dd5SAtish Patra
49cb7d2dd5SAtish Patraextra_header_fields:
50cb7d2dd5SAtish Patra	.quad	0					// ImageBase
51cb7d2dd5SAtish Patra	.long	PECOFF_SECTION_ALIGNMENT		// SectionAlignment
52cb7d2dd5SAtish Patra	.long	PECOFF_FILE_ALIGNMENT			// FileAlignment
53cb7d2dd5SAtish Patra	.short	0					// MajorOperatingSystemVersion
54cb7d2dd5SAtish Patra	.short	0					// MinorOperatingSystemVersion
55cb7d2dd5SAtish Patra	.short	LINUX_EFISTUB_MAJOR_VERSION		// MajorImageVersion
56cb7d2dd5SAtish Patra	.short	LINUX_EFISTUB_MINOR_VERSION		// MinorImageVersion
57cb7d2dd5SAtish Patra	.short	0					// MajorSubsystemVersion
58cb7d2dd5SAtish Patra	.short	0					// MinorSubsystemVersion
59cb7d2dd5SAtish Patra	.long	0					// Win32VersionValue
60cb7d2dd5SAtish Patra
61cb7d2dd5SAtish Patra	.long	_end - _start				// SizeOfImage
62cb7d2dd5SAtish Patra
63cb7d2dd5SAtish Patra	// Everything before the kernel image is considered part of the header
64cb7d2dd5SAtish Patra	.long	efi_header_end - _start			// SizeOfHeaders
65cb7d2dd5SAtish Patra	.long	0					// CheckSum
66cb7d2dd5SAtish Patra	.short	IMAGE_SUBSYSTEM_EFI_APPLICATION		// Subsystem
67*909e71f2SHeinrich Schuchardt	.short	IMAGE_DLL_CHARACTERISTICS_NX_COMPAT	// DllCharacteristics
68cb7d2dd5SAtish Patra	.quad	0					// SizeOfStackReserve
69cb7d2dd5SAtish Patra	.quad	0					// SizeOfStackCommit
70cb7d2dd5SAtish Patra	.quad	0					// SizeOfHeapReserve
71cb7d2dd5SAtish Patra	.quad	0					// SizeOfHeapCommit
72cb7d2dd5SAtish Patra	.long	0					// LoaderFlags
73cb7d2dd5SAtish Patra	.long	(section_table - .) / 8			// NumberOfRvaAndSizes
74cb7d2dd5SAtish Patra
75cb7d2dd5SAtish Patra	.quad	0					// ExportTable
76cb7d2dd5SAtish Patra	.quad	0					// ImportTable
77cb7d2dd5SAtish Patra	.quad	0					// ResourceTable
78cb7d2dd5SAtish Patra	.quad	0					// ExceptionTable
79cb7d2dd5SAtish Patra	.quad	0					// CertificationTable
80cb7d2dd5SAtish Patra	.quad	0					// BaseRelocationTable
81cb7d2dd5SAtish Patra
82cb7d2dd5SAtish Patra	// Section table
83cb7d2dd5SAtish Patrasection_table:
84cb7d2dd5SAtish Patra	.ascii	".text\0\0\0"
85cb7d2dd5SAtish Patra	.long	__pecoff_text_end - efi_header_end	// VirtualSize
86cb7d2dd5SAtish Patra	.long	efi_header_end - _start			// VirtualAddress
87cb7d2dd5SAtish Patra	.long	__pecoff_text_end - efi_header_end	// SizeOfRawData
88cb7d2dd5SAtish Patra	.long	efi_header_end - _start			// PointerToRawData
89cb7d2dd5SAtish Patra
90cb7d2dd5SAtish Patra	.long	0					// PointerToRelocations
91cb7d2dd5SAtish Patra	.long	0					// PointerToLineNumbers
92cb7d2dd5SAtish Patra	.short	0					// NumberOfRelocations
93cb7d2dd5SAtish Patra	.short	0					// NumberOfLineNumbers
94cb7d2dd5SAtish Patra	.long	IMAGE_SCN_CNT_CODE | \
95cb7d2dd5SAtish Patra		IMAGE_SCN_MEM_READ | \
96cb7d2dd5SAtish Patra		IMAGE_SCN_MEM_EXECUTE			// Characteristics
97cb7d2dd5SAtish Patra
98cb7d2dd5SAtish Patra	.ascii	".data\0\0\0"
9955de1e4aSAlexandre Ghiti#ifdef __clang__
100cb7d2dd5SAtish Patra	.long   __pecoff_data_virt_size			// VirtualSize
10155de1e4aSAlexandre Ghiti#else
10255de1e4aSAlexandre Ghiti	.long	__pecoff_data_virt_end - __pecoff_text_end	// VirtualSize
10355de1e4aSAlexandre Ghiti#endif
104cb7d2dd5SAtish Patra	.long	__pecoff_text_end - _start		// VirtualAddress
10555de1e4aSAlexandre Ghiti#ifdef __clang__
106cb7d2dd5SAtish Patra	.long   __pecoff_data_raw_size			// SizeOfRawData
10755de1e4aSAlexandre Ghiti#else
10855de1e4aSAlexandre Ghiti	.long	__pecoff_data_raw_end - __pecoff_text_end	// SizeOfRawData
10955de1e4aSAlexandre Ghiti#endif
110cb7d2dd5SAtish Patra	.long	__pecoff_text_end - _start		// PointerToRawData
111cb7d2dd5SAtish Patra
112cb7d2dd5SAtish Patra	.long	0					// PointerToRelocations
113cb7d2dd5SAtish Patra	.long	0					// PointerToLineNumbers
114cb7d2dd5SAtish Patra	.short	0					// NumberOfRelocations
115cb7d2dd5SAtish Patra	.short	0					// NumberOfLineNumbers
116cb7d2dd5SAtish Patra	.long	IMAGE_SCN_CNT_INITIALIZED_DATA | \
117cb7d2dd5SAtish Patra		IMAGE_SCN_MEM_READ | \
118cb7d2dd5SAtish Patra		IMAGE_SCN_MEM_WRITE			// Characteristics
119cb7d2dd5SAtish Patra
120cb7d2dd5SAtish Patra	.set	section_count, (. - section_table) / 40
121cb7d2dd5SAtish Patra
122cb7d2dd5SAtish Patra	.balign	0x1000
123cb7d2dd5SAtish Patraefi_header_end:
124cb7d2dd5SAtish Patra	.endm
125