root/arch/riscv/kernel/efi-header.S
/* 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   IMAGE_NT_SIGNATURE
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  IMAGE_NT_OPTIONAL_HDR64_MAGIC           // PE32+ format
#else
        .short  IMAGE_NT_OPTIONAL_HDR32_MAGIC           // 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  IMAGE_DLLCHARACTERISTICS_NX_COMPAT      // 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