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 |
13 | coff_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 | |
28 | optional_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 | |
49 | extra_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 |
83 | section_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 |
123 | efi_header_end: |
124 | .endm |
125 | |