/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2020 Western Digital Corporation or its affiliates. * Adapted from arch/arm64/kernel/efi-header.S */ #include <linux/pe.h> #include <linux/sizes.h> #include <asm/set_memory.h> .macro __EFI_PE_HEADER .long PE_MAGIC coff_header: #ifdef CONFIG_64BIT .short IMAGE_FILE_MACHINE_RISCV64 // Machine #else .short IMAGE_FILE_MACHINE_RISCV32 // Machine #endif .short section_count // NumberOfSections .long 0 // TimeDateStamp .long 0 // PointerToSymbolTable .long 0 // NumberOfSymbols .short section_table - optional_header // SizeOfOptionalHeader .short IMAGE_FILE_DEBUG_STRIPPED | \ IMAGE_FILE_EXECUTABLE_IMAGE | \ IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics optional_header: #ifdef CONFIG_64BIT .short PE_OPT_MAGIC_PE32PLUS // PE32+ format #else .short PE_OPT_MAGIC_PE32 // PE32 format #endif .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .long __pecoff_text_end - efi_header_end // SizeOfCode #ifdef __clang__ .long __pecoff_data_virt_size // SizeOfInitializedData #else .long __pecoff_data_virt_end - __pecoff_text_end // SizeOfInitializedData #endif .long 0 // SizeOfUninitializedData .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint .long efi_header_end - _start // BaseOfCode #ifdef CONFIG_32BIT .long __pecoff_text_end - _start // BaseOfData #endif extra_header_fields: .quad 0 // ImageBase .long PECOFF_SECTION_ALIGNMENT // SectionAlignment .long PECOFF_FILE_ALIGNMENT // FileAlignment .short 0 // MajorOperatingSystemVersion .short 0 // MinorOperatingSystemVersion .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion .short 0 // MajorSubsystemVersion .short 0 // MinorSubsystemVersion .long 0 // Win32VersionValue .long _end - _start // SizeOfImage // Everything before the kernel image is considered part of the header .long efi_header_end - _start // SizeOfHeaders .long 0 // CheckSum .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem .short 0 // DllCharacteristics .quad 0 // SizeOfStackReserve .quad 0 // SizeOfStackCommit .quad 0 // SizeOfHeapReserve .quad 0 // SizeOfHeapCommit .long 0 // LoaderFlags .long (section_table - .) / 8 // NumberOfRvaAndSizes .quad 0 // ExportTable .quad 0 // ImportTable .quad 0 // ResourceTable .quad 0 // ExceptionTable .quad 0 // CertificationTable .quad 0 // BaseRelocationTable // Section table section_table: .ascii ".text\0\0\0" .long __pecoff_text_end - efi_header_end // VirtualSize .long efi_header_end - _start // VirtualAddress .long __pecoff_text_end - efi_header_end // SizeOfRawData .long efi_header_end - _start // PointerToRawData .long 0 // PointerToRelocations .long 0 // PointerToLineNumbers .short 0 // NumberOfRelocations .short 0 // NumberOfLineNumbers .long IMAGE_SCN_CNT_CODE | \ IMAGE_SCN_MEM_READ | \ IMAGE_SCN_MEM_EXECUTE // Characteristics .ascii ".data\0\0\0" #ifdef __clang__ .long __pecoff_data_virt_size // VirtualSize #else .long __pecoff_data_virt_end - __pecoff_text_end // VirtualSize #endif .long __pecoff_text_end - _start // VirtualAddress #ifdef __clang__ .long __pecoff_data_raw_size // SizeOfRawData #else .long __pecoff_data_raw_end - __pecoff_text_end // SizeOfRawData #endif .long __pecoff_text_end - _start // PointerToRawData .long 0 // PointerToRelocations .long 0 // PointerToLineNumbers .short 0 // NumberOfRelocations .short 0 // NumberOfLineNumbers .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ IMAGE_SCN_MEM_READ | \ IMAGE_SCN_MEM_WRITE // Characteristics .set section_count, (. - section_table) / 40 .balign 0x1000 efi_header_end: .endm