Unverified Commit 55de1e4a authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Palmer Dabbelt
Browse files

riscv: Prepare EFI header for relocatable kernels

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: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Link: https://lore.kernel.org/r/20230329045329.64565-2-alexghiti@rivosinc.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent fe15c26e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -56,4 +56,7 @@ bool kernel_page_present(struct page *page);
#define SECTION_ALIGN L1_CACHE_BYTES
#endif /* CONFIG_STRICT_KERNEL_RWX */

#define PECOFF_SECTION_ALIGNMENT        0x1000
#define PECOFF_FILE_ALIGNMENT           0x200

#endif /* _ASM_RISCV_SET_MEMORY_H */
+16 −3
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@

#include <linux/pe.h>
#include <linux/sizes.h>
#include <asm/set_memory.h>

	.macro	__EFI_PE_HEADER
	.long	PE_MAGIC
@@ -33,7 +34,11 @@ optional_header:
	.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
@@ -91,9 +96,17 @@ section_table:
		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
+2 −3
Original line number Diff line number Diff line
@@ -27,9 +27,6 @@ ENTRY(_start)

jiffies = jiffies_64;

PECOFF_SECTION_ALIGNMENT = 0x1000;
PECOFF_FILE_ALIGNMENT = 0x200;

SECTIONS
{
	/* Beginning of code and text segment */
@@ -132,6 +129,7 @@ SECTIONS
#ifdef CONFIG_EFI
	.pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
	__pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end);
	__pecoff_data_raw_end = ABSOLUTE(.);
#endif

	/* End of data section */
@@ -142,6 +140,7 @@ SECTIONS
#ifdef CONFIG_EFI
	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
	__pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
	__pecoff_data_virt_end = ABSOLUTE(.);
#endif
	_end = .;