^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2020 Western Digital Corporation or its affiliates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Adapted from arch/arm64/kernel/efi-header.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/pe.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/sizes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) .macro __EFI_PE_HEADER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) .long PE_MAGIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) coff_header:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifdef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .short IMAGE_FILE_MACHINE_RISCV64 // Machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .short IMAGE_FILE_MACHINE_RISCV32 // Machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .short section_count // NumberOfSections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .long 0 // TimeDateStamp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .long 0 // PointerToSymbolTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) .long 0 // NumberOfSymbols
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) .short section_table - optional_header // SizeOfOptionalHeader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .short IMAGE_FILE_DEBUG_STRIPPED | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) IMAGE_FILE_EXECUTABLE_IMAGE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) optional_header:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #ifdef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .short PE_OPT_MAGIC_PE32PLUS // PE32+ format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .short PE_OPT_MAGIC_PE32 // PE32 format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .byte 0x02 // MajorLinkerVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .byte 0x14 // MinorLinkerVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .long __pecoff_text_end - efi_header_end // SizeOfCode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .long __pecoff_data_virt_size // SizeOfInitializedData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .long 0 // SizeOfUninitializedData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .long efi_header_end - _start // BaseOfCode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #ifdef CONFIG_32BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .long __pecoff_text_end - _start // BaseOfData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) extra_header_fields:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .quad 0 // ImageBase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .long PECOFF_SECTION_ALIGNMENT // SectionAlignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .long PECOFF_FILE_ALIGNMENT // FileAlignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .short 0 // MajorOperatingSystemVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .short 0 // MinorOperatingSystemVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .short 0 // MajorSubsystemVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .short 0 // MinorSubsystemVersion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .long 0 // Win32VersionValue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .long _end - _start // SizeOfImage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) // Everything before the kernel image is considered part of the header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .long efi_header_end - _start // SizeOfHeaders
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .long 0 // CheckSum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .short 0 // DllCharacteristics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .quad 0 // SizeOfStackReserve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .quad 0 // SizeOfStackCommit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .quad 0 // SizeOfHeapReserve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .quad 0 // SizeOfHeapCommit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .long 0 // LoaderFlags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .long (section_table - .) / 8 // NumberOfRvaAndSizes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .quad 0 // ExportTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .quad 0 // ImportTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .quad 0 // ResourceTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .quad 0 // ExceptionTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .quad 0 // CertificationTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .quad 0 // BaseRelocationTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) // Section table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) section_table:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .ascii ".text\0\0\0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .long __pecoff_text_end - efi_header_end // VirtualSize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .long efi_header_end - _start // VirtualAddress
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .long __pecoff_text_end - efi_header_end // SizeOfRawData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .long efi_header_end - _start // PointerToRawData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .long 0 // PointerToRelocations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .long 0 // PointerToLineNumbers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .short 0 // NumberOfRelocations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .short 0 // NumberOfLineNumbers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .long IMAGE_SCN_CNT_CODE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) IMAGE_SCN_MEM_READ | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) IMAGE_SCN_MEM_EXECUTE // Characteristics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .ascii ".data\0\0\0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .long __pecoff_data_virt_size // VirtualSize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .long __pecoff_text_end - _start // VirtualAddress
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .long __pecoff_data_raw_size // SizeOfRawData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .long __pecoff_text_end - _start // PointerToRawData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .long 0 // PointerToRelocations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .long 0 // PointerToLineNumbers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .short 0 // NumberOfRelocations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .short 0 // NumberOfLineNumbers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .long IMAGE_SCN_CNT_INITIALIZED_DATA | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) IMAGE_SCN_MEM_READ | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) IMAGE_SCN_MEM_WRITE // Characteristics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .set section_count, (. - section_table) / 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .balign 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) efi_header_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .endm