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

source code of linux/arch/riscv/kernel/efi-header.S