1cb7d2dd5SAtish Patra/* SPDX-License-Identifier: GPL-2.0-only */ 2cb7d2dd5SAtish Patra/* 3cb7d2dd5SAtish Patra * Copyright (C) 2020 Western Digital Corporation or its affiliates. 4cb7d2dd5SAtish Patra * Adapted from arch/arm64/kernel/efi-header.S 5cb7d2dd5SAtish Patra */ 6cb7d2dd5SAtish Patra 7cb7d2dd5SAtish Patra#include <linux/pe.h> 8cb7d2dd5SAtish Patra#include <linux/sizes.h> 955de1e4aSAlexandre Ghiti#include <asm/set_memory.h> 10cb7d2dd5SAtish Patra 11cb7d2dd5SAtish Patra .macro __EFI_PE_HEADER 12cb7d2dd5SAtish Patra .long PE_MAGIC 13cb7d2dd5SAtish Patracoff_header: 14cb7d2dd5SAtish Patra#ifdef CONFIG_64BIT 15cb7d2dd5SAtish Patra .short IMAGE_FILE_MACHINE_RISCV64 // Machine 16cb7d2dd5SAtish Patra#else 17cb7d2dd5SAtish Patra .short IMAGE_FILE_MACHINE_RISCV32 // Machine 18cb7d2dd5SAtish Patra#endif 19cb7d2dd5SAtish Patra .short section_count // NumberOfSections 20cb7d2dd5SAtish Patra .long 0 // TimeDateStamp 21cb7d2dd5SAtish Patra .long 0 // PointerToSymbolTable 22cb7d2dd5SAtish Patra .long 0 // NumberOfSymbols 23cb7d2dd5SAtish Patra .short section_table - optional_header // SizeOfOptionalHeader 24cb7d2dd5SAtish Patra .short IMAGE_FILE_DEBUG_STRIPPED | \ 25cb7d2dd5SAtish Patra IMAGE_FILE_EXECUTABLE_IMAGE | \ 26cb7d2dd5SAtish Patra IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics 27cb7d2dd5SAtish Patra 28cb7d2dd5SAtish Patraoptional_header: 29cb7d2dd5SAtish Patra#ifdef CONFIG_64BIT 30cb7d2dd5SAtish Patra .short PE_OPT_MAGIC_PE32PLUS // PE32+ format 31cb7d2dd5SAtish Patra#else 32cb7d2dd5SAtish Patra .short PE_OPT_MAGIC_PE32 // PE32 format 33cb7d2dd5SAtish Patra#endif 34cb7d2dd5SAtish Patra .byte 0x02 // MajorLinkerVersion 35cb7d2dd5SAtish Patra .byte 0x14 // MinorLinkerVersion 36cb7d2dd5SAtish Patra .long __pecoff_text_end - efi_header_end // SizeOfCode 3755de1e4aSAlexandre Ghiti#ifdef __clang__ 38cb7d2dd5SAtish Patra .long __pecoff_data_virt_size // SizeOfInitializedData 3955de1e4aSAlexandre Ghiti#else 4055de1e4aSAlexandre Ghiti .long __pecoff_data_virt_end - __pecoff_text_end // SizeOfInitializedData 4155de1e4aSAlexandre Ghiti#endif 42cb7d2dd5SAtish Patra .long 0 // SizeOfUninitializedData 43cb7d2dd5SAtish Patra .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint 44cb7d2dd5SAtish Patra .long efi_header_end - _start // BaseOfCode 45cb7d2dd5SAtish Patra#ifdef CONFIG_32BIT 46cb7d2dd5SAtish Patra .long __pecoff_text_end - _start // BaseOfData 47cb7d2dd5SAtish Patra#endif 48cb7d2dd5SAtish Patra 49cb7d2dd5SAtish Patraextra_header_fields: 50cb7d2dd5SAtish Patra .quad 0 // ImageBase 51cb7d2dd5SAtish Patra .long PECOFF_SECTION_ALIGNMENT // SectionAlignment 52cb7d2dd5SAtish Patra .long PECOFF_FILE_ALIGNMENT // FileAlignment 53cb7d2dd5SAtish Patra .short 0 // MajorOperatingSystemVersion 54cb7d2dd5SAtish Patra .short 0 // MinorOperatingSystemVersion 55cb7d2dd5SAtish Patra .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion 56cb7d2dd5SAtish Patra .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion 57cb7d2dd5SAtish Patra .short 0 // MajorSubsystemVersion 58cb7d2dd5SAtish Patra .short 0 // MinorSubsystemVersion 59cb7d2dd5SAtish Patra .long 0 // Win32VersionValue 60cb7d2dd5SAtish Patra 61cb7d2dd5SAtish Patra .long _end - _start // SizeOfImage 62cb7d2dd5SAtish Patra 63cb7d2dd5SAtish Patra // Everything before the kernel image is considered part of the header 64cb7d2dd5SAtish Patra .long efi_header_end - _start // SizeOfHeaders 65cb7d2dd5SAtish Patra .long 0 // CheckSum 66cb7d2dd5SAtish Patra .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem 67*909e71f2SHeinrich Schuchardt .short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics 68cb7d2dd5SAtish Patra .quad 0 // SizeOfStackReserve 69cb7d2dd5SAtish Patra .quad 0 // SizeOfStackCommit 70cb7d2dd5SAtish Patra .quad 0 // SizeOfHeapReserve 71cb7d2dd5SAtish Patra .quad 0 // SizeOfHeapCommit 72cb7d2dd5SAtish Patra .long 0 // LoaderFlags 73cb7d2dd5SAtish Patra .long (section_table - .) / 8 // NumberOfRvaAndSizes 74cb7d2dd5SAtish Patra 75cb7d2dd5SAtish Patra .quad 0 // ExportTable 76cb7d2dd5SAtish Patra .quad 0 // ImportTable 77cb7d2dd5SAtish Patra .quad 0 // ResourceTable 78cb7d2dd5SAtish Patra .quad 0 // ExceptionTable 79cb7d2dd5SAtish Patra .quad 0 // CertificationTable 80cb7d2dd5SAtish Patra .quad 0 // BaseRelocationTable 81cb7d2dd5SAtish Patra 82cb7d2dd5SAtish Patra // Section table 83cb7d2dd5SAtish Patrasection_table: 84cb7d2dd5SAtish Patra .ascii ".text\0\0\0" 85cb7d2dd5SAtish Patra .long __pecoff_text_end - efi_header_end // VirtualSize 86cb7d2dd5SAtish Patra .long efi_header_end - _start // VirtualAddress 87cb7d2dd5SAtish Patra .long __pecoff_text_end - efi_header_end // SizeOfRawData 88cb7d2dd5SAtish Patra .long efi_header_end - _start // PointerToRawData 89cb7d2dd5SAtish Patra 90cb7d2dd5SAtish Patra .long 0 // PointerToRelocations 91cb7d2dd5SAtish Patra .long 0 // PointerToLineNumbers 92cb7d2dd5SAtish Patra .short 0 // NumberOfRelocations 93cb7d2dd5SAtish Patra .short 0 // NumberOfLineNumbers 94cb7d2dd5SAtish Patra .long IMAGE_SCN_CNT_CODE | \ 95cb7d2dd5SAtish Patra IMAGE_SCN_MEM_READ | \ 96cb7d2dd5SAtish Patra IMAGE_SCN_MEM_EXECUTE // Characteristics 97cb7d2dd5SAtish Patra 98cb7d2dd5SAtish Patra .ascii ".data\0\0\0" 9955de1e4aSAlexandre Ghiti#ifdef __clang__ 100cb7d2dd5SAtish Patra .long __pecoff_data_virt_size // VirtualSize 10155de1e4aSAlexandre Ghiti#else 10255de1e4aSAlexandre Ghiti .long __pecoff_data_virt_end - __pecoff_text_end // VirtualSize 10355de1e4aSAlexandre Ghiti#endif 104cb7d2dd5SAtish Patra .long __pecoff_text_end - _start // VirtualAddress 10555de1e4aSAlexandre Ghiti#ifdef __clang__ 106cb7d2dd5SAtish Patra .long __pecoff_data_raw_size // SizeOfRawData 10755de1e4aSAlexandre Ghiti#else 10855de1e4aSAlexandre Ghiti .long __pecoff_data_raw_end - __pecoff_text_end // SizeOfRawData 10955de1e4aSAlexandre Ghiti#endif 110cb7d2dd5SAtish Patra .long __pecoff_text_end - _start // PointerToRawData 111cb7d2dd5SAtish Patra 112cb7d2dd5SAtish Patra .long 0 // PointerToRelocations 113cb7d2dd5SAtish Patra .long 0 // PointerToLineNumbers 114cb7d2dd5SAtish Patra .short 0 // NumberOfRelocations 115cb7d2dd5SAtish Patra .short 0 // NumberOfLineNumbers 116cb7d2dd5SAtish Patra .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ 117cb7d2dd5SAtish Patra IMAGE_SCN_MEM_READ | \ 118cb7d2dd5SAtish Patra IMAGE_SCN_MEM_WRITE // Characteristics 119cb7d2dd5SAtish Patra 120cb7d2dd5SAtish Patra .set section_count, (. - section_table) / 40 121cb7d2dd5SAtish Patra 122cb7d2dd5SAtish Patra .balign 0x1000 123cb7d2dd5SAtish Patraefi_header_end: 124cb7d2dd5SAtish Patra .endm 125