blob: 8e733aa48ba6cbc2f2f62e1ac74b107b737676f6 [file] [log] [blame]
Atish Patracb7d2dd2020-09-17 15:37:13 -07001/* 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
10 .macro __EFI_PE_HEADER
11 .long PE_MAGIC
12coff_header:
13#ifdef CONFIG_64BIT
14 .short IMAGE_FILE_MACHINE_RISCV64 // Machine
15#else
16 .short IMAGE_FILE_MACHINE_RISCV32 // Machine
17#endif
18 .short section_count // NumberOfSections
19 .long 0 // TimeDateStamp
20 .long 0 // PointerToSymbolTable
21 .long 0 // NumberOfSymbols
22 .short section_table - optional_header // SizeOfOptionalHeader
23 .short IMAGE_FILE_DEBUG_STRIPPED | \
24 IMAGE_FILE_EXECUTABLE_IMAGE | \
25 IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics
26
27optional_header:
28#ifdef CONFIG_64BIT
29 .short PE_OPT_MAGIC_PE32PLUS // PE32+ format
30#else
31 .short PE_OPT_MAGIC_PE32 // PE32 format
32#endif
33 .byte 0x02 // MajorLinkerVersion
34 .byte 0x14 // MinorLinkerVersion
35 .long __pecoff_text_end - efi_header_end // SizeOfCode
36 .long __pecoff_data_virt_size // SizeOfInitializedData
37 .long 0 // SizeOfUninitializedData
38 .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint
39 .long efi_header_end - _start // BaseOfCode
40#ifdef CONFIG_32BIT
41 .long __pecoff_text_end - _start // BaseOfData
42#endif
43
44extra_header_fields:
45 .quad 0 // ImageBase
46 .long PECOFF_SECTION_ALIGNMENT // SectionAlignment
47 .long PECOFF_FILE_ALIGNMENT // FileAlignment
48 .short 0 // MajorOperatingSystemVersion
49 .short 0 // MinorOperatingSystemVersion
50 .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion
51 .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion
52 .short 0 // MajorSubsystemVersion
53 .short 0 // MinorSubsystemVersion
54 .long 0 // Win32VersionValue
55
56 .long _end - _start // SizeOfImage
57
58 // Everything before the kernel image is considered part of the header
59 .long efi_header_end - _start // SizeOfHeaders
60 .long 0 // CheckSum
61 .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
62 .short 0 // DllCharacteristics
63 .quad 0 // SizeOfStackReserve
64 .quad 0 // SizeOfStackCommit
65 .quad 0 // SizeOfHeapReserve
66 .quad 0 // SizeOfHeapCommit
67 .long 0 // LoaderFlags
68 .long (section_table - .) / 8 // NumberOfRvaAndSizes
69
70 .quad 0 // ExportTable
71 .quad 0 // ImportTable
72 .quad 0 // ResourceTable
73 .quad 0 // ExceptionTable
74 .quad 0 // CertificationTable
75 .quad 0 // BaseRelocationTable
76
77 // Section table
78section_table:
79 .ascii ".text\0\0\0"
80 .long __pecoff_text_end - efi_header_end // VirtualSize
81 .long efi_header_end - _start // VirtualAddress
82 .long __pecoff_text_end - efi_header_end // SizeOfRawData
83 .long efi_header_end - _start // PointerToRawData
84
85 .long 0 // PointerToRelocations
86 .long 0 // PointerToLineNumbers
87 .short 0 // NumberOfRelocations
88 .short 0 // NumberOfLineNumbers
89 .long IMAGE_SCN_CNT_CODE | \
90 IMAGE_SCN_MEM_READ | \
91 IMAGE_SCN_MEM_EXECUTE // Characteristics
92
93 .ascii ".data\0\0\0"
94 .long __pecoff_data_virt_size // VirtualSize
95 .long __pecoff_text_end - _start // VirtualAddress
96 .long __pecoff_data_raw_size // SizeOfRawData
97 .long __pecoff_text_end - _start // PointerToRawData
98
99 .long 0 // PointerToRelocations
100 .long 0 // PointerToLineNumbers
101 .short 0 // NumberOfRelocations
102 .short 0 // NumberOfLineNumbers
103 .long IMAGE_SCN_CNT_INITIALIZED_DATA | \
104 IMAGE_SCN_MEM_READ | \
105 IMAGE_SCN_MEM_WRITE // Characteristics
106
107 .set section_count, (. - section_table) / 40
108
109 .balign 0x1000
110efi_header_end:
111 .endm