mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
55de1e4ad4
ld does not handle relocations correctly as explained here [1], a fix for that was proposed by Nelson there but we have to support older toolchains and then provide this fix. Note that llvm does not need this fix and is then excluded. [1] https://sourceware.org/pipermail/binutils/2023-March/126690.html Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com> Link: https://lore.kernel.org/r/20230329045329.64565-2-alexghiti@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
125 lines
3.8 KiB
ArmAsm
125 lines
3.8 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2020 Western Digital Corporation or its affiliates.
|
|
* Adapted from arch/arm64/kernel/efi-header.S
|
|
*/
|
|
|
|
#include <linux/pe.h>
|
|
#include <linux/sizes.h>
|
|
#include <asm/set_memory.h>
|
|
|
|
.macro __EFI_PE_HEADER
|
|
.long PE_MAGIC
|
|
coff_header:
|
|
#ifdef CONFIG_64BIT
|
|
.short IMAGE_FILE_MACHINE_RISCV64 // Machine
|
|
#else
|
|
.short IMAGE_FILE_MACHINE_RISCV32 // Machine
|
|
#endif
|
|
.short section_count // NumberOfSections
|
|
.long 0 // TimeDateStamp
|
|
.long 0 // PointerToSymbolTable
|
|
.long 0 // NumberOfSymbols
|
|
.short section_table - optional_header // SizeOfOptionalHeader
|
|
.short IMAGE_FILE_DEBUG_STRIPPED | \
|
|
IMAGE_FILE_EXECUTABLE_IMAGE | \
|
|
IMAGE_FILE_LINE_NUMS_STRIPPED // Characteristics
|
|
|
|
optional_header:
|
|
#ifdef CONFIG_64BIT
|
|
.short PE_OPT_MAGIC_PE32PLUS // PE32+ format
|
|
#else
|
|
.short PE_OPT_MAGIC_PE32 // PE32 format
|
|
#endif
|
|
.byte 0x02 // MajorLinkerVersion
|
|
.byte 0x14 // MinorLinkerVersion
|
|
.long __pecoff_text_end - efi_header_end // SizeOfCode
|
|
#ifdef __clang__
|
|
.long __pecoff_data_virt_size // SizeOfInitializedData
|
|
#else
|
|
.long __pecoff_data_virt_end - __pecoff_text_end // SizeOfInitializedData
|
|
#endif
|
|
.long 0 // SizeOfUninitializedData
|
|
.long __efistub_efi_pe_entry - _start // AddressOfEntryPoint
|
|
.long efi_header_end - _start // BaseOfCode
|
|
#ifdef CONFIG_32BIT
|
|
.long __pecoff_text_end - _start // BaseOfData
|
|
#endif
|
|
|
|
extra_header_fields:
|
|
.quad 0 // ImageBase
|
|
.long PECOFF_SECTION_ALIGNMENT // SectionAlignment
|
|
.long PECOFF_FILE_ALIGNMENT // FileAlignment
|
|
.short 0 // MajorOperatingSystemVersion
|
|
.short 0 // MinorOperatingSystemVersion
|
|
.short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion
|
|
.short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion
|
|
.short 0 // MajorSubsystemVersion
|
|
.short 0 // MinorSubsystemVersion
|
|
.long 0 // Win32VersionValue
|
|
|
|
.long _end - _start // SizeOfImage
|
|
|
|
// Everything before the kernel image is considered part of the header
|
|
.long efi_header_end - _start // SizeOfHeaders
|
|
.long 0 // CheckSum
|
|
.short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
|
|
.short 0 // DllCharacteristics
|
|
.quad 0 // SizeOfStackReserve
|
|
.quad 0 // SizeOfStackCommit
|
|
.quad 0 // SizeOfHeapReserve
|
|
.quad 0 // SizeOfHeapCommit
|
|
.long 0 // LoaderFlags
|
|
.long (section_table - .) / 8 // NumberOfRvaAndSizes
|
|
|
|
.quad 0 // ExportTable
|
|
.quad 0 // ImportTable
|
|
.quad 0 // ResourceTable
|
|
.quad 0 // ExceptionTable
|
|
.quad 0 // CertificationTable
|
|
.quad 0 // BaseRelocationTable
|
|
|
|
// Section table
|
|
section_table:
|
|
.ascii ".text\0\0\0"
|
|
.long __pecoff_text_end - efi_header_end // VirtualSize
|
|
.long efi_header_end - _start // VirtualAddress
|
|
.long __pecoff_text_end - efi_header_end // SizeOfRawData
|
|
.long efi_header_end - _start // PointerToRawData
|
|
|
|
.long 0 // PointerToRelocations
|
|
.long 0 // PointerToLineNumbers
|
|
.short 0 // NumberOfRelocations
|
|
.short 0 // NumberOfLineNumbers
|
|
.long IMAGE_SCN_CNT_CODE | \
|
|
IMAGE_SCN_MEM_READ | \
|
|
IMAGE_SCN_MEM_EXECUTE // Characteristics
|
|
|
|
.ascii ".data\0\0\0"
|
|
#ifdef __clang__
|
|
.long __pecoff_data_virt_size // VirtualSize
|
|
#else
|
|
.long __pecoff_data_virt_end - __pecoff_text_end // VirtualSize
|
|
#endif
|
|
.long __pecoff_text_end - _start // VirtualAddress
|
|
#ifdef __clang__
|
|
.long __pecoff_data_raw_size // SizeOfRawData
|
|
#else
|
|
.long __pecoff_data_raw_end - __pecoff_text_end // SizeOfRawData
|
|
#endif
|
|
.long __pecoff_text_end - _start // PointerToRawData
|
|
|
|
.long 0 // PointerToRelocations
|
|
.long 0 // PointerToLineNumbers
|
|
.short 0 // NumberOfRelocations
|
|
.short 0 // NumberOfLineNumbers
|
|
.long IMAGE_SCN_CNT_INITIALIZED_DATA | \
|
|
IMAGE_SCN_MEM_READ | \
|
|
IMAGE_SCN_MEM_WRITE // Characteristics
|
|
|
|
.set section_count, (. - section_table) / 40
|
|
|
|
.balign 0x1000
|
|
efi_header_end:
|
|
.endm
|