root/arch/arm/boot/compressed/efi-header.S
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2013-2017 Linaro Ltd
 * Authors: Roy Franz <roy.franz@linaro.org>
 *          Ard Biesheuvel <ard.biesheuvel@linaro.org>
 */

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

                .macro  __nop
 AR_CLASS(      mov     r0, r0          )
  M_CLASS(      nop.w                   )
                .endm

                .macro __initial_nops
#ifdef CONFIG_EFI_STUB
                @ This is a two-instruction NOP, which happens to bear the
                @ PE/COFF signature "MZ" in the first two bytes, so the kernel
                @ is accepted as an EFI binary. Booting via the UEFI stub
                @ will not execute those instructions, but the ARM/Linux
                @ boot protocol does, so we need some NOPs here.
                .inst   IMAGE_DOS_SIGNATURE | (0xe225 << 16) @ eor r5, r5, 0x4d000
                eor     r5, r5, 0x4d000                 @ undo previous insn
#else
                __nop
                __nop
#endif
                .endm

                .macro  __EFI_HEADER
#ifdef CONFIG_EFI_STUB
                .set    start_offset, __efi_start - start
                .org    start + 0x3c
                @
                @ The PE header can be anywhere in the file, but for
                @ simplicity we keep it together with the MSDOS header
                @ The offset to the PE/COFF header needs to be at offset
                @ 0x3C in the MSDOS header.
                @ The only 2 fields of the MSDOS header that are used are this
                @ PE/COFF offset, and the "MZ" bytes at offset 0x0.
                @
                .long   pe_header - start               @ Offset to the PE header.

pe_header:
                .long   IMAGE_NT_SIGNATURE

coff_header:
                .short  IMAGE_FILE_MACHINE_THUMB        @ Machine
                .short  section_count                   @ NumberOfSections
                .long   0                               @ TimeDateStamp
                .long   0                               @ PointerToSymbolTable
                .long   0                               @ NumberOfSymbols
                .short  section_table - optional_header @ SizeOfOptionalHeader
                .short  IMAGE_FILE_32BIT_MACHINE | \
                        IMAGE_FILE_DEBUG_STRIPPED | \
                        IMAGE_FILE_EXECUTABLE_IMAGE | \
                        IMAGE_FILE_LINE_NUMS_STRIPPED   @ Characteristics

#define __pecoff_code_size (__pecoff_data_start - __efi_start)

optional_header:
                .short  IMAGE_NT_OPTIONAL_HDR32_MAGIC   @ PE32 format
                .byte   0x02                            @ MajorLinkerVersion
                .byte   0x14                            @ MinorLinkerVersion
                .long   __pecoff_code_size              @ SizeOfCode
                .long   __pecoff_data_size              @ SizeOfInitializedData
                .long   0                               @ SizeOfUninitializedData
                .long   efi_pe_entry - start            @ AddressOfEntryPoint
                .long   start_offset                    @ BaseOfCode
                .long   __pecoff_data_start - start     @ BaseOfData

extra_header_fields:
                .long   0                               @ ImageBase
                .long   SZ_4K                           @ SectionAlignment
                .long   SZ_512                          @ FileAlignment
                .short  0                               @ MajorOsVersion
                .short  0                               @ MinorOsVersion
                .short  LINUX_EFISTUB_MAJOR_VERSION     @ MajorImageVersion
                .short  LINUX_EFISTUB_MINOR_VERSION     @ MinorImageVersion
                .short  0                               @ MajorSubsystemVersion
                .short  0                               @ MinorSubsystemVersion
                .long   0                               @ Win32VersionValue

                .long   __pecoff_end - start            @ SizeOfImage
                .long   start_offset                    @ SizeOfHeaders
                .long   0                               @ CheckSum
                .short  IMAGE_SUBSYSTEM_EFI_APPLICATION @ Subsystem
                .short  0                               @ DllCharacteristics
                .long   0                               @ SizeOfStackReserve
                .long   0                               @ SizeOfStackCommit
                .long   0                               @ SizeOfHeapReserve
                .long   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:
                .ascii  ".text\0\0\0"
                .long   __pecoff_code_size              @ VirtualSize
                .long   __efi_start                     @ VirtualAddress
                .long   __pecoff_code_size              @ SizeOfRawData
                .long   __efi_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"
                .long   __pecoff_data_size              @ VirtualSize
                .long   __pecoff_data_start - start     @ VirtualAddress
                .long   __pecoff_data_rawsize           @ SizeOfRawData
                .long   __pecoff_data_start - 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

                .align  12
__efi_start:
#endif
                .endm