1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (C) 2013 - 2017 Linaro, Ltd. 4*4882a593Smuzhiyun * Copyright (C) 2013, 2014 Red Hat, Inc. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#include <linux/pe.h> 8*4882a593Smuzhiyun#include <linux/sizes.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun .macro __EFI_PE_HEADER 11*4882a593Smuzhiyun .long PE_MAGIC 12*4882a593Smuzhiyuncoff_header: 13*4882a593Smuzhiyun .short IMAGE_FILE_MACHINE_ARM64 // Machine 14*4882a593Smuzhiyun .short section_count // NumberOfSections 15*4882a593Smuzhiyun .long 0 // TimeDateStamp 16*4882a593Smuzhiyun .long 0 // PointerToSymbolTable 17*4882a593Smuzhiyun .long 0 // NumberOfSymbols 18*4882a593Smuzhiyun .short section_table - optional_header // SizeOfOptionalHeader 19*4882a593Smuzhiyun .short IMAGE_FILE_DEBUG_STRIPPED | \ 20*4882a593Smuzhiyun IMAGE_FILE_EXECUTABLE_IMAGE | \ 21*4882a593Smuzhiyun IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunoptional_header: 24*4882a593Smuzhiyun .short PE_OPT_MAGIC_PE32PLUS // PE32+ format 25*4882a593Smuzhiyun .byte 0x02 // MajorLinkerVersion 26*4882a593Smuzhiyun .byte 0x14 // MinorLinkerVersion 27*4882a593Smuzhiyun .long __initdata_begin - efi_header_end // SizeOfCode 28*4882a593Smuzhiyun .long __pecoff_data_size // SizeOfInitializedData 29*4882a593Smuzhiyun .long 0 // SizeOfUninitializedData 30*4882a593Smuzhiyun .long __efistub_efi_pe_entry - _head // AddressOfEntryPoint 31*4882a593Smuzhiyun .long efi_header_end - _head // BaseOfCode 32*4882a593Smuzhiyun 33*4882a593Smuzhiyunextra_header_fields: 34*4882a593Smuzhiyun .quad 0 // ImageBase 35*4882a593Smuzhiyun .long SEGMENT_ALIGN // SectionAlignment 36*4882a593Smuzhiyun .long PECOFF_FILE_ALIGNMENT // FileAlignment 37*4882a593Smuzhiyun .short 0 // MajorOperatingSystemVersion 38*4882a593Smuzhiyun .short 0 // MinorOperatingSystemVersion 39*4882a593Smuzhiyun .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion 40*4882a593Smuzhiyun .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion 41*4882a593Smuzhiyun .short 0 // MajorSubsystemVersion 42*4882a593Smuzhiyun .short 0 // MinorSubsystemVersion 43*4882a593Smuzhiyun .long 0 // Win32VersionValue 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun .long _end - _head // SizeOfImage 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun // Everything before the kernel image is considered part of the header 48*4882a593Smuzhiyun .long efi_header_end - _head // SizeOfHeaders 49*4882a593Smuzhiyun .long 0 // CheckSum 50*4882a593Smuzhiyun .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem 51*4882a593Smuzhiyun .short 0 // DllCharacteristics 52*4882a593Smuzhiyun .quad 0 // SizeOfStackReserve 53*4882a593Smuzhiyun .quad 0 // SizeOfStackCommit 54*4882a593Smuzhiyun .quad 0 // SizeOfHeapReserve 55*4882a593Smuzhiyun .quad 0 // SizeOfHeapCommit 56*4882a593Smuzhiyun .long 0 // LoaderFlags 57*4882a593Smuzhiyun .long (section_table - .) / 8 // NumberOfRvaAndSizes 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun .quad 0 // ExportTable 60*4882a593Smuzhiyun .quad 0 // ImportTable 61*4882a593Smuzhiyun .quad 0 // ResourceTable 62*4882a593Smuzhiyun .quad 0 // ExceptionTable 63*4882a593Smuzhiyun .quad 0 // CertificationTable 64*4882a593Smuzhiyun .quad 0 // BaseRelocationTable 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun#ifdef CONFIG_DEBUG_EFI 67*4882a593Smuzhiyun .long efi_debug_table - _head // DebugTable 68*4882a593Smuzhiyun .long efi_debug_table_size 69*4882a593Smuzhiyun#endif 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun // Section table 72*4882a593Smuzhiyunsection_table: 73*4882a593Smuzhiyun .ascii ".text\0\0\0" 74*4882a593Smuzhiyun .long __initdata_begin - efi_header_end // VirtualSize 75*4882a593Smuzhiyun .long efi_header_end - _head // VirtualAddress 76*4882a593Smuzhiyun .long __initdata_begin - efi_header_end // SizeOfRawData 77*4882a593Smuzhiyun .long efi_header_end - _head // PointerToRawData 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun .long 0 // PointerToRelocations 80*4882a593Smuzhiyun .long 0 // PointerToLineNumbers 81*4882a593Smuzhiyun .short 0 // NumberOfRelocations 82*4882a593Smuzhiyun .short 0 // NumberOfLineNumbers 83*4882a593Smuzhiyun .long IMAGE_SCN_CNT_CODE | \ 84*4882a593Smuzhiyun IMAGE_SCN_MEM_READ | \ 85*4882a593Smuzhiyun IMAGE_SCN_MEM_EXECUTE // Characteristics 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun .ascii ".data\0\0\0" 88*4882a593Smuzhiyun .long __pecoff_data_size // VirtualSize 89*4882a593Smuzhiyun .long __initdata_begin - _head // VirtualAddress 90*4882a593Smuzhiyun .long __pecoff_data_rawsize // SizeOfRawData 91*4882a593Smuzhiyun .long __initdata_begin - _head // PointerToRawData 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun .long 0 // PointerToRelocations 94*4882a593Smuzhiyun .long 0 // PointerToLineNumbers 95*4882a593Smuzhiyun .short 0 // NumberOfRelocations 96*4882a593Smuzhiyun .short 0 // NumberOfLineNumbers 97*4882a593Smuzhiyun .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ 98*4882a593Smuzhiyun IMAGE_SCN_MEM_READ | \ 99*4882a593Smuzhiyun IMAGE_SCN_MEM_WRITE // Characteristics 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun .set section_count, (. - section_table) / 40 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun#ifdef CONFIG_DEBUG_EFI 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * The debug table is referenced via its Relative Virtual Address (RVA), 106*4882a593Smuzhiyun * which is only defined for those parts of the image that are covered 107*4882a593Smuzhiyun * by a section declaration. Since this header is not covered by any 108*4882a593Smuzhiyun * section, the debug table must be emitted elsewhere. So stick it in 109*4882a593Smuzhiyun * the .init.rodata section instead. 110*4882a593Smuzhiyun * 111*4882a593Smuzhiyun * Note that the EFI debug entry itself may legally have a zero RVA, 112*4882a593Smuzhiyun * which means we can simply put it right after the section headers. 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun __INITRODATA 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun .align 2 117*4882a593Smuzhiyunefi_debug_table: 118*4882a593Smuzhiyun // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY 119*4882a593Smuzhiyun .long 0 // Characteristics 120*4882a593Smuzhiyun .long 0 // TimeDateStamp 121*4882a593Smuzhiyun .short 0 // MajorVersion 122*4882a593Smuzhiyun .short 0 // MinorVersion 123*4882a593Smuzhiyun .long IMAGE_DEBUG_TYPE_CODEVIEW // Type 124*4882a593Smuzhiyun .long efi_debug_entry_size // SizeOfData 125*4882a593Smuzhiyun .long 0 // RVA 126*4882a593Smuzhiyun .long efi_debug_entry - _head // FileOffset 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun .set efi_debug_table_size, . - efi_debug_table 129*4882a593Smuzhiyun .previous 130*4882a593Smuzhiyun 131*4882a593Smuzhiyunefi_debug_entry: 132*4882a593Smuzhiyun // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY 133*4882a593Smuzhiyun .ascii "NB10" // Signature 134*4882a593Smuzhiyun .long 0 // Unknown 135*4882a593Smuzhiyun .long 0 // Unknown2 136*4882a593Smuzhiyun .long 0 // Unknown3 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun .asciz VMLINUX_PATH 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun .set efi_debug_entry_size, . - efi_debug_entry 141*4882a593Smuzhiyun#endif 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* 144*4882a593Smuzhiyun * EFI will load .text onwards at the 4k section alignment 145*4882a593Smuzhiyun * described in the PE/COFF header. To ensure that instruction 146*4882a593Smuzhiyun * sequences using an adrp and a :lo12: immediate will function 147*4882a593Smuzhiyun * correctly at this alignment, we must ensure that .text is 148*4882a593Smuzhiyun * placed at a 4k boundary in the Image to begin with. 149*4882a593Smuzhiyun */ 150*4882a593Smuzhiyun .balign SEGMENT_ALIGN 151*4882a593Smuzhiyunefi_header_end: 152*4882a593Smuzhiyun .endm 153