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 0 // 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#ifdef CONFIG_DEBUG_EFI 85 .long .Lefi_debug_table - .L_head // DebugTable 86 .long .Lefi_debug_table_size 87#endif 88 89 // Section table 90.Lsection_table: 91 .ascii ".text\0\0\0" 92 .long __initdata_begin - .Lefi_header_end // VirtualSize 93 .long .Lefi_header_end - .L_head // VirtualAddress 94 .long __initdata_begin - .Lefi_header_end // SizeOfRawData 95 .long .Lefi_header_end - .L_head // PointerToRawData 96 97 .long 0 // PointerToRelocations 98 .long 0 // PointerToLineNumbers 99 .short 0 // NumberOfRelocations 100 .short 0 // NumberOfLineNumbers 101 .long IMAGE_SCN_CNT_CODE | \ 102 IMAGE_SCN_MEM_READ | \ 103 IMAGE_SCN_MEM_EXECUTE // Characteristics 104 105 .ascii ".data\0\0\0" 106 .long __pecoff_data_size // VirtualSize 107 .long __initdata_begin - .L_head // VirtualAddress 108 .long __pecoff_data_rawsize // SizeOfRawData 109 .long __initdata_begin - .L_head // PointerToRawData 110 111 .long 0 // PointerToRelocations 112 .long 0 // PointerToLineNumbers 113 .short 0 // NumberOfRelocations 114 .short 0 // NumberOfLineNumbers 115 .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ 116 IMAGE_SCN_MEM_READ | \ 117 IMAGE_SCN_MEM_WRITE // Characteristics 118 119 .set .Lsection_count, (. - .Lsection_table) / 40 120 121#ifdef CONFIG_DEBUG_EFI 122 /* 123 * The debug table is referenced via its Relative Virtual Address (RVA), 124 * which is only defined for those parts of the image that are covered 125 * by a section declaration. Since this header is not covered by any 126 * section, the debug table must be emitted elsewhere. So stick it in 127 * the .init.rodata section instead. 128 * 129 * Note that the EFI debug entry itself may legally have a zero RVA, 130 * which means we can simply put it right after the section headers. 131 */ 132 __INITRODATA 133 134 .align 2 135.Lefi_debug_table: 136 // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY 137 .long 0 // Characteristics 138 .long 0 // TimeDateStamp 139 .short 0 // MajorVersion 140 .short 0 // MinorVersion 141 .long IMAGE_DEBUG_TYPE_CODEVIEW // Type 142 .long .Lefi_debug_entry_size // SizeOfData 143 .long 0 // RVA 144 .long .Lefi_debug_entry - .L_head // FileOffset 145 146 .set .Lefi_debug_table_size, . - .Lefi_debug_table 147 .previous 148 149.Lefi_debug_entry: 150 // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY 151 .ascii "NB10" // Signature 152 .long 0 // Unknown 153 .long 0 // Unknown2 154 .long 0 // Unknown3 155 156 .asciz VMLINUX_PATH 157 158 .set .Lefi_debug_entry_size, . - .Lefi_debug_entry 159#endif 160 161 .balign SEGMENT_ALIGN 162.Lefi_header_end: 163#else 164 .set .Lpe_header_offset, 0x0 165#endif 166 .endm 167