GNU Linux-libre 5.19-rc6-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
10         .macro  __EFI_PE_HEADER
11         .long   PE_MAGIC
12 coff_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
27 optional_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
44 extra_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
78 section_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
110 efi_header_end:
111         .endm