1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2013 - 2017 Linaro, Ltd. 4 * Copyright (C) 2013, 2014 Red Hat, Inc. 5 */ 6 7#include <linux/pe.h> 8#include <linux/sizes.h> 9 10 .macro efi_signature_nop 11#ifdef CONFIG_EFI 12.L_head: 13 /* 14 * This ccmp instruction has no meaningful effect except that 15 * its opcode forms the magic "MZ" signature required by UEFI. 16 */ 17 ccmp x18, #0, #0xd, pl 18#else 19 /* 20 * Bootloaders may inspect the opcode at the start of the kernel 21 * image to decide if the kernel is capable of booting via UEFI. 22 * So put an ordinary NOP here, not the "MZ.." pseudo-nop above. 23 */ 24 nop 25#endif 26 .endm 27 28 .macro __EFI_PE_HEADER 29#ifdef CONFIG_EFI 30 .set .Lpe_header_offset, . - .L_head 31 .long PE_MAGIC 32 .short IMAGE_FILE_MACHINE_ARM64 // Machine 33 .short .Lsection_count // NumberOfSections 34 .long 0 // TimeDateStamp 35 .long 0 // PointerToSymbolTable 36 .long 0 // NumberOfSymbols 37 .short .Lsection_table - .Loptional_header // SizeOfOptionalHeader 38 .short IMAGE_FILE_DEBUG_STRIPPED | \ 39 IMAGE_FILE_EXECUTABLE_IMAGE | \ 40 IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics 41 42.Loptional_header: 43 .short PE_OPT_MAGIC_PE32PLUS // PE32+ format 44 .byte 0x02 // MajorLinkerVersion 45 .byte 0x14 // MinorLinkerVersion 46 .long __initdata_begin - .Lefi_header_end // SizeOfCode 47 .long __pecoff_data_size // SizeOfInitializedData 48 .long 0 // SizeOfUninitializedData 49 .long __efistub_efi_pe_entry - .L_head // AddressOfEntryPoint 50 .long .Lefi_header_end - .L_head // BaseOfCode 51 52 .quad 0 // ImageBase 53 .long SEGMENT_ALIGN // SectionAlignment 54 .long PECOFF_FILE_ALIGNMENT // FileAlignment 55 .short 0 // MajorOperatingSystemVersion 56 .short 0 // MinorOperatingSystemVersion 57 .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion 58 .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion 59 .short 0 // MajorSubsystemVersion 60 .short 0 // MinorSubsystemVersion 61 .long 0 // Win32VersionValue 62 63 .long _end - .L_head // SizeOfImage 64 65 // Everything before the kernel image is considered part of the header 66 .long .Lefi_header_end - .L_head // SizeOfHeaders 67 .long 0 // CheckSum 68 .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem 69 .short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics 70 .quad 0 // SizeOfStackReserve 71 .quad 0 // SizeOfStackCommit 72 .quad 0 // SizeOfHeapReserve 73 .quad 0 // SizeOfHeapCommit 74 .long 0 // LoaderFlags 75 .long (.Lsection_table - .) / 8 // NumberOfRvaAndSizes 76 77 .quad 0 // ExportTable 78 .quad 0 // ImportTable 79 .quad 0 // ResourceTable 80 .quad 0 // ExceptionTable 81 .quad 0 // CertificationTable 82 .quad 0 // BaseRelocationTable 83 84#if defined(CONFIG_DEBUG_EFI) || defined(CONFIG_ARM64_BTI_KERNEL) 85 .long .Lefi_debug_table - .L_head // DebugTable 86 .long .Lefi_debug_table_size 87 88 /* 89 * The debug table is referenced via its Relative Virtual Address (RVA), 90 * which is only defined for those parts of the image that are covered 91 * by a section declaration. Since this header is not covered by any 92 * section, the debug table must be emitted elsewhere. So stick it in 93 * the .init.rodata section instead. 94 * 95 * Note that the payloads themselves are permitted to have zero RVAs, 96 * which means we can simply put those right after the section headers. 97 */ 98 __INITRODATA 99 100 .align 2 101.Lefi_debug_table: 102#ifdef CONFIG_DEBUG_EFI 103 // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY 104 .long 0 // Characteristics 105 .long 0 // TimeDateStamp 106 .short 0 // MajorVersion 107 .short 0 // MinorVersion 108 .long IMAGE_DEBUG_TYPE_CODEVIEW // Type 109 .long .Lefi_debug_entry_size // SizeOfData 110 .long 0 // RVA 111 .long .Lefi_debug_entry - .L_head // FileOffset 112#endif 113#ifdef CONFIG_ARM64_BTI_KERNEL 114 .long 0 // Characteristics 115 .long 0 // TimeDateStamp 116 .short 0 // MajorVersion 117 .short 0 // MinorVersion 118 .long IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS // Type 119 .long 4 // SizeOfData 120 .long 0 // RVA 121 .long .Lefi_dll_characteristics_ex - .L_head // FileOffset 122#endif 123 .set .Lefi_debug_table_size, . - .Lefi_debug_table 124 .previous 125#endif 126 127 // Section table 128.Lsection_table: 129 .ascii ".text\0\0\0" 130 .long __initdata_begin - .Lefi_header_end // VirtualSize 131 .long .Lefi_header_end - .L_head // VirtualAddress 132 .long __initdata_begin - .Lefi_header_end // SizeOfRawData 133 .long .Lefi_header_end - .L_head // PointerToRawData 134 135 .long 0 // PointerToRelocations 136 .long 0 // PointerToLineNumbers 137 .short 0 // NumberOfRelocations 138 .short 0 // NumberOfLineNumbers 139 .long IMAGE_SCN_CNT_CODE | \ 140 IMAGE_SCN_MEM_READ | \ 141 IMAGE_SCN_MEM_EXECUTE // Characteristics 142 143 .ascii ".data\0\0\0" 144 .long __pecoff_data_size // VirtualSize 145 .long __initdata_begin - .L_head // VirtualAddress 146 .long __pecoff_data_rawsize // SizeOfRawData 147 .long __initdata_begin - .L_head // PointerToRawData 148 149 .long 0 // PointerToRelocations 150 .long 0 // PointerToLineNumbers 151 .short 0 // NumberOfRelocations 152 .short 0 // NumberOfLineNumbers 153 .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ 154 IMAGE_SCN_MEM_READ | \ 155 IMAGE_SCN_MEM_WRITE // Characteristics 156 157 .set .Lsection_count, (. - .Lsection_table) / 40 158 159#ifdef CONFIG_DEBUG_EFI 160.Lefi_debug_entry: 161 // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY 162 .ascii "NB10" // Signature 163 .long 0 // Unknown 164 .long 0 // Unknown2 165 .long 0 // Unknown3 166 167 .asciz VMLINUX_PATH 168 169 .set .Lefi_debug_entry_size, . - .Lefi_debug_entry 170#endif 171#ifdef CONFIG_ARM64_BTI_KERNEL 172.Lefi_dll_characteristics_ex: 173 .long IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 174#endif 175 176 .balign SEGMENT_ALIGN 177.Lefi_header_end: 178#else 179 .set .Lpe_header_offset, 0x0 180#endif 181 .endm 182