uclibc/gcc combined with elf2flt riscv linker file fully resolve the PC relative __global_pointer$ value at compile time and do not generate a relocation entry to set a runtime gp value. As a result, if the flatbin loader introduces a gap between the text and data sections, the gp value becomes incorrect and prevent correct execution of a flatbin executable. Avoid this problem by introducing the file asm/flat.h and defining the macro FLAT_TEXT_DATA_NO_GAP to indicate that the text and data sections must be loaded at contiguous addresses.
Signed-off-by: Damien Le Moal <damien.lem...@wdc.com> --- arch/riscv/include/asm/Kbuild | 1 - arch/riscv/include/asm/flat.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/include/asm/flat.h diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild index 445ccc97305a..a8b54a3f4c2b 100644 --- a/arch/riscv/include/asm/Kbuild +++ b/arch/riscv/include/asm/Kbuild @@ -1,7 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 generic-y += early_ioremap.h generic-y += extable.h -generic-y += flat.h generic-y += kvm_para.h generic-y += user.h generic-y += vmlinux.lds.h diff --git a/arch/riscv/include/asm/flat.h b/arch/riscv/include/asm/flat.h new file mode 100644 index 000000000000..43bccf090fd1 --- /dev/null +++ b/arch/riscv/include/asm/flat.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_RISCV_FLAT_H +#define _ASM_RISCV_FLAT_H + +#include <asm/unaligned.h> + +static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags, + u32 *addr) +{ + *addr = get_unaligned((__force u32 *)rp); + return 0; +} + +static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel) +{ + put_unaligned(addr, (__force u32 *)rp); + return 0; +} + +/* + * uclibc/gcc fully resolve the PC relative __global_pointer value + * at compile time and do not generate a relocation entry to set a + * runtime gp value. As a result, the flatbin loader must not introduce + * a gap between the text and data sections and keep them contiguous to + * avoid invalid address accesses. + */ +#define FLAT_TEXT_DATA_NO_GAP (1) + +#endif /* _ASM_RISCV_FLAT_H */ -- 2.30.2