GNU Linux-libre 6.7.9-gnu
[releases.git] / arch / riscv / kernel / efi-header.S
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