root/arch/loongarch/kernel/efi-header.S
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
 */

#include <linux/pe.h>
#include <linux/sizes.h>

        .macro  __EFI_PE_HEADER
        .long   IMAGE_NT_SIGNATURE
.Lcoff_header:
#ifdef CONFIG_32BIT
        .short  IMAGE_FILE_MACHINE_LOONGARCH32          /* Machine */
#else
        .short  IMAGE_FILE_MACHINE_LOONGARCH64          /* Machine */
#endif
        .short  .Lsection_count                         /* NumberOfSections */
        .long   0                                       /* TimeDateStamp */
        .long   0                                       /* PointerToSymbolTable */
        .long   0                                       /* NumberOfSymbols */
        .short  .Lsection_table - .Loptional_header     /* SizeOfOptionalHeader */
        .short  IMAGE_FILE_DEBUG_STRIPPED | \
                IMAGE_FILE_EXECUTABLE_IMAGE | \
                IMAGE_FILE_LINE_NUMS_STRIPPED           /* Characteristics */

.Loptional_header:
        .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC           /* PE32+ format */
        .byte   0x02                                    /* MajorLinkerVersion */
        .byte   0x14                                    /* MinorLinkerVersion */
        .long   __inittext_end - .Lefi_header_end       /* SizeOfCode */
        .long   _kernel_vsize                           /* SizeOfInitializedData */
        .long   0                                       /* SizeOfUninitializedData */
        .long   __efistub_efi_pe_entry - _head          /* AddressOfEntryPoint */
        .long   .Lefi_header_end - _head                /* BaseOfCode */

.Lextra_header_fields:
        .quad   0                                       /* ImageBase */
        .long   PECOFF_SEGMENT_ALIGN                    /* SectionAlignment */
        .long   PECOFF_FILE_ALIGN                       /* 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 - _head                            /* SizeOfImage */

        /* Everything before the kernel image is considered part of the header */
        .long   .Lefi_header_end - _head                /* 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   (.Lsection_table - .) / 8               /* NumberOfRvaAndSizes */

        .quad   0                                       /* ExportTable */
        .quad   0                                       /* ImportTable */
        .quad   0                                       /* ResourceTable */
        .quad   0                                       /* ExceptionTable */
        .quad   0                                       /* CertificationTable */
        .quad   0                                       /* BaseRelocationTable */

        /* Section table */
.Lsection_table:
        .ascii  ".text\0\0\0"
        .long   __inittext_end - .Lefi_header_end       /* VirtualSize */
        .long   .Lefi_header_end - _head                /* VirtualAddress */
        .long   __inittext_end - .Lefi_header_end       /* SizeOfRawData */
        .long   .Lefi_header_end - _head                /* 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"
        .long   _kernel_vsize                           /* VirtualSize */
        .long   __initdata_begin - _head                /* VirtualAddress */
        .long   _kernel_rsize                           /* SizeOfRawData */
        .long   __initdata_begin - _head                /* 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    .Lsection_count, (. - .Lsection_table) / 40

        .balign 0x10000                                 /* PECOFF_SEGMENT_ALIGN */
.Lefi_header_end:
        .endm