riscv: Enable efi_loader support
cover riscv: Enable efi_loader support
We now have RISC-V support in U-Boot - which is great!
However, not that we're finally making progress to converge on efi_loader and distro boot for booting on ARM platforms, we really want to make sure there is no technical reason not to do the same on RISC-V as well.
So this patch set introduces distro boot and efi_loader support for RISC-V!
So far, I've only tested it with the selftest, as the number of target binaries to run is still slim. But it should at least give us a good starting point.
Alexander Graf (8):
riscv: Add setjmp/longjmp code
riscv: Enable function sections
efi_loader: selftest: Do not build relocation tests for risc-v
riscv: Add board_quiesce_devices stub
efi_loader: Use EFI_CACHELINE_SIZE in the image loader too
distro: Extend with RISC-V defines
riscv: nx25: Enable distro boot
efi_loader: Enable RISC-V support
arch/riscv/config.mk | 2 +- arch/riscv/cpu/nx25/u-boot.lds | 16 +++++++++++ arch/riscv/include/asm/setjmp.h | 24 ++++++++++++++++ arch/riscv/include/asm/u-boot-riscv.h | 1 + arch/riscv/lib/Makefile | 1 + arch/riscv/lib/bootm.c | 4 +++ arch/riscv/lib/setjmp.S | 54 +++++++++++++++++++++++++++++++++++ configs/nx25-ae250_defconfig | 1 + include/config_distro_bootcmd.h | 14 ++++++++- include/configs/nx25-ae250.h | 17 +++++++++++ include/efi_loader.h | 7 +++++ lib/efi_loader/Kconfig | 2 +- lib/efi_loader/efi_image_loader.c | 2 +- lib/efi_loader/efi_runtime.c | 48 +++++++++++++++++++++++-------- lib/efi_selftest/Makefile | 11 ++++--- 15 files changed, 184 insertions(+), 20 deletions(-) create mode 100644 arch/riscv/include/asm/setjmp.h create mode 100644 arch/riscv/lib/setjmp.S
Signature · 1 line
2.12.3
PATCH 1/8 riscv: Add setjmp/longjmp code
To support efi_loader we need to have platform support for setjmp/longjmp. Add it here.
--- arch/riscv/include/asm/setjmp.h | 24 ++++++++++++++++++ arch/riscv/lib/Makefile | 1 + arch/riscv/lib/setjmp.S | 54 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 arch/riscv/include/asm/setjmp.h create mode 100644 arch/riscv/lib/setjmp.S
arch/riscv/include/asm/setjmp.h new file +24 -0
@@ -0,0 +1,24 @@ +/* +* (C) Copyright 2018 Alexander Graf <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef _SETJMP_H_ +#define _SETJMP_H_ 1 + +/* +* This really should be opaque, but the EFI implementation wrongly +* assumes that a 'struct jmp_buf_data' is defined. +*/ +struct jmp_buf_data { +/* x2, x8, x9, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27 */ +u64 regs[13 ]; +}; + +typedef struct jmp_buf_data jmp_buf [1 ]; + +int setjmp (jmp_buf jmp); +void longjmp (jmp_buf jmp,int ret); + +#endif /* _SETJMP_H_ */
arch/riscv/lib/Makefile +1 -0
@@ -12,3 +12,4 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_GO) += boot.o obj-y += cache.o obj-y += interrupts.o +obj-y += setjmp.o
arch/riscv/lib/setjmp.S new file +54 -0
54 lines not on this page · raw message
Signature · 1 line
2.12.3
PATCH 2/8 riscv: Enable function sections
In reply to Alexander GrafThe linker can remove sections that are never addressed, so it makes a lot of sense to declare every function as an individual section.
This reduces the output U-Boot code size by ~30kb for me.
--- arch/riscv/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/config.mk +1 -1
@@ -29,5 +29,5 @@ CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ -T $(srctree)/examples/standalone/riscv.lds PLATFORM_CPPFLAGS += -ffixed-gp -fpic -PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 +PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 -ffunction-sections LDFLAGS_u-boot += --gc-sections -static -pie
Signature · 1 line
2.12.3
PATCH 3/8 efi_loader: selftest: Do not build relocation tests for risc-v
In reply to Alexander GrafThe relocation selftest doesn't compile for me on RISC-V. Disable for now.
--- lib/efi_selftest/Makefile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
lib/efi_selftest/Makefile +7 -4
@@ -35,9 +35,10 @@ ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy) obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest_block_device.o endif -# TODO: As of v2018.01 the relocation code for the EFI application cannot -# be built on x86_64. +# TODO: As of v2018.05 the relocation code for the EFI application cannot +# be built on x86_64 / RISC-V. ifeq ($(CONFIG_X86_64),) +ifeq ($(CONFIG_RISCV),) ifneq ($(CONFIG_CMD_BOOTEFI_SELFTEST),)
@@ -63,6 +64,8 @@ $(obj)/efi_selftest_startimage_exit.o: $(obj)/efi_miniapp_file_image_exit.h $(obj)/efi_selftest_startimage_return.o: $(obj)/efi_miniapp_file_image_return.h -endif +endif # CONFIG_CMD_BOOTEFI_SELFTEST -endif +endif # !CONFIG_RISCV + +endif # !CONFIG_X86_64
Signature · 1 line
2.12.3
PATCH 3/8 efi_loader: selftest: Do not build relocation tests for risc-v
Quoted 1 line · Alexander Graf
The relocation selftest doesn't compile for me on RISC-V. Disable for now.
Can this problem be reproduced with one of the qemu targets? Does loading a binary work?
Quoted 11 lines
Signed-off-by Alexander Graf <[email protected]>--- lib/efi_selftest/Makefile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)lib/efi_selftest/Makefile +0
-0
lib/efi_selftest/Makefile ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy) · line 41
Quoted 9 lines
lib/efi_selftest/Makefile +3
-2@@ -35,9 +35,10 @@ ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy) obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest_block_device.o endif -# TODO: As of v2018.01 the relocation code for the EFI application cannot -# be built on x86_64. +# TODO: As of v2018.05 the relocation code for the EFI application cannot +# be built on x86_64 / RISC-V. ifeq ($(CONFIG_X86_64),) +ifeq ($(CONFIG_RISCV),)
Elsewhere we abbreviate (!A && !B) as:
ifeq ($(CONFIG_X86_64)$(CONFIG_RISCV),)
Regards
Heinrich
Quoted 15 lines
lib/efi_selftest/Makefile +4
-2ifneq ($(CONFIG_CMD_BOOTEFI_SELFTEST),)@@ -63,6 +64,8 @@ $(obj)/efi_selftest_startimage_exit.o: $(obj)/efi_miniapp_file_image_exit.h $(obj)/efi_selftest_startimage_return.o: $(obj)/efi_miniapp_file_image_return.h -endif +endif # CONFIG_CMD_BOOTEFI_SELFTEST -endif +endif # !CONFIG_RISCV + +endif # !CONFIG_X86_64
PATCH 3/8 efi_loader: selftest: Do not build relocation tests for risc-v
Quoted 8 lines
Am 18.04.2018 um 17:48 schrieb Heinrich Schuchardt <[email protected]>:
Quoted 2 lines · Alexander Graf
The relocation selftest doesn't compile for me on RISC-V. Disable for now.
Can this problem be reproduced with one of the qemu targets?
It already fails to compile, you don‘t need to run it ;).
Quoted 1 line
Does loading a binary work?
That‘s the next step. I wanted to get this out as a first step, then see what binary I could make work. The goal is obviously a grub port.
Alex
PATCH 3/8 efi_loader: selftest: Do not build relocation tests for risc-v
In reply to Alexander GrafQuoted 1 line · Alexander Graf
The relocation selftest doesn't compile for me on RISC-V. Disable for now.
This is the command that fails:
riscv64-linux-gnu-ld.bfd -nostdlib -znocombreloc -T ./arch/riscv/lib/ \
-shared -Bsymbolic lib/efi_selftest/efi_selftest_miniapp_return.o \arch/riscv/lib/ -o lib/efi_selftest/efi_selftest_miniapp_return_efi.so riscv64-linux-gnu-ld.bfd: read in flex scanner failed
In arch/riscv/lib/ the linker scripts (*.lds) are missing.
So I suggest instead of not building the unit test the missing files should be created.
Best regards
Heinrich
Quoted 35 lines
Signed-off-by Alexander Graf <[email protected]>--- lib/efi_selftest/Makefile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)lib/efi_selftest/Makefile +7
-4@@ -35,9 +35,10 @@ ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy) obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest_block_device.o endif -# TODO: As of v2018.01 the relocation code for the EFI application cannot -# be built on x86_64. +# TODO: As of v2018.05 the relocation code for the EFI application cannot +# be built on x86_64 / RISC-V. ifeq ($(CONFIG_X86_64),) +ifeq ($(CONFIG_RISCV),) ifneq ($(CONFIG_CMD_BOOTEFI_SELFTEST),)@@ -63,6 +64,8 @@ $(obj)/efi_selftest_startimage_exit.o: $(obj)/efi_miniapp_file_image_exit.h $(obj)/efi_selftest_startimage_return.o: $(obj)/efi_miniapp_file_image_return.h -endif +endif # CONFIG_CMD_BOOTEFI_SELFTEST -endif +endif # !CONFIG_RISCV + +endif # !CONFIG_X86_64
PATCH 4/8 riscv: Add board_quiesce_devices stub
In reply to Alexander GrafThis patch adds an empty stub for board_quiesce_devices() which allows boards to quiesce their devices before we boot into an OS in a platform agnostic way.
--- arch/riscv/include/asm/u-boot-riscv.h | 1 + arch/riscv/lib/bootm.c | 4 ++++ 2 files changed, 5 insertions(+)
arch/riscv/include/asm/u-boot-riscv.h +1 -0
@@ -17,5 +17,6 @@ int cleanup_before_linux(void);/* board/.../... */ int board_init (void ); +void board_quiesce_devices (void );#endif /* _U_BOOT_RISCV_H_ */
arch/riscv/lib/bootm.c +4 -0
@@ -16,6 +16,10 @@DECLARE_GLOBAL_DATA_PTR ; +__weak void board_quiesce_devices (void ) +{ +} +int arch_fixup_fdt (void *blob) {return 0 ;
Signature · 1 line
2.12.3
PATCH 5/8 efi_loader: Use EFI_CACHELINE_SIZE in the image loader too
In reply to Alexander GrafWe were using our EFI_CACHELINE_SIZE define only in the runtime service code, but left the image loader to use plain CONFIG_SYS_CACHELINE_SIZE.
This patch moves EFI_CACHELINE_SIZE into efi_loader.h and converts the image loader to use it.
--- include/efi_loader.h | 7 +++++++ lib/efi_loader/efi_image_loader.c | 2 +- lib/efi_loader/efi_runtime.c | 7 ------- 3 files changed, 8 insertions(+), 8 deletions(-)
include/efi_loader.h +7 -0
@@ -76,6 +76,13 @@ const char *__efi_nesting_dec(void); ##__VA_ARGS__); \ }) +#ifdef CONFIG_SYS_CACHELINE_SIZE +#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE +#else +/* Just use the greatest cache flush alignment requirement I'm aware of */ +#define EFI_CACHELINE_SIZE 128 +#endif +extern struct efi_runtime_services efi_runtime_services;extern struct efi_system_table systab;
lib/efi_loader/efi_image_loader.c +1 -1
@@ -290,7 +290,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)/* Flush cache */ flush_cache ((ulong )efi_reloc, -ALIGN (virt_size,CONFIG_SYS_CACHELINE_SIZE )); +ALIGN (virt_size,EFI_CACHELINE_SIZE ));invalidate_icache_all ();/* Populate the loaded image interface bits */
lib/efi_loader/efi_runtime.c +0 -7
@@ -30,13 +30,6 @@ static efi_status_t __efi_runtime EFIAPI efi_unimplemented(void); static efi_status_t __efi_runtime EFIAPI efi_device_error(void); static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void); -#ifdef CONFIG_SYS_CACHELINE_SIZE -#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE -#else -/* Just use the greatest cache flush alignment requirement I'm aware of */ -#define EFI_CACHELINE_SIZE 128 -#endif -#if defined(CONFIG_ARM64 )#define R_RELATIVE 1027#define R_MASK 0xffffffffULL
Signature · 1 line
2.12.3
PATCH 6/8 distro: Extend with RISC-V defines
In reply to Alexander GrafWhile we don't have VCI or UEFI naming conventions for RISC-V file paths yet, we need to search for something. So let's make up a few defines that at least allow us to get started until the specs officially include RISC-V.
--- include/config_distro_bootcmd.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
include/config_distro_bootcmd.h +13 -1
@@ -100,6 +100,10 @@#define BOOTEFI_NAME "bootia32.efi"#elif defined(CONFIG_X86_RUN_64BIT )#define BOOTEFI_NAME "bootx64.efi" +#elif defined(CONFIG_CPU_RISCV_32 ) +#define BOOTEFI_NAME "bootrv32.efi" +#elif defined(CONFIG_CPU_RISCV_64 ) +#define BOOTEFI_NAME "bootrv64.efi"#endif #endif
@@ -250,7 +254,15 @@#elif defined(CONFIG_X86 )/* Always assume we're running 64bit */ #define BOOTENV_EFI_PXE_ARCH "0x7" -#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:0000:UNDI:003000" +#elif defined(CONFIG_CPU_RISCV_32 ) +/* TODO: Register VCI identifier via RFC */ +#define BOOTENV_EFI_PXE_ARCH "0x5032" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:5032:UNDI:003000" +#elif defined(CONFIG_CPU_RISCV_64 ) +/* TODO: Register VCI identifier via RFC */ +#define BOOTENV_EFI_PXE_ARCH "0x5064" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:5064:UNDI:003000"#else #error Please specify an EFI client identifier#endif
Signature · 1 line
2.12.3
PATCH 6/8 distro: Extend with RISC-V defines
Quoted 14 lines · Alexander Graf
While we don't have VCI or UEFI naming conventions for RISC-V file paths yet, we need to search for something. So let's make up a few defines that at least allow us to get started until the specs officially include RISC-V.
Signed-off-by Alexander Graf <[email protected]>--- include/config_distro_bootcmd.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)include/config_distro_bootcmd.h +0
-0
include/config_distro_bootcmd.h line 106
Quoted 7 lines
include/config_distro_bootcmd.h +4
-0@@ -100,6 +100,10 @@#define BOOTEFI_NAME "bootia32.efi"#elif defined(CONFIG_X86_RUN_64BIT )#define BOOTEFI_NAME "bootx64.efi" +#elif defined(CONFIG_CPU_RISCV_32 ) +#define BOOTEFI_NAME "bootrv32.efi" +#elif defined(CONFIG_CPU_RISCV_64 ) +#define BOOTEFI_NAME "bootrv64.efi"
Hello Alex,
I suggest to use the same values as the RISC-V branch of EDK2.
https://github.com/tianocore/edk2-staging/blob/RISC-V/MdePkg/Include/Uefi/UefiSpec.h#L2171
BOOTRISCV32.EFI
BOOTRISCV64.EFI
These values are not standardized yet. But we have not better hint of what to expect in the next version of the spec.
Best regards
Heinrich
Quoted 21 lines
include/config_distro_bootcmd.h +9
-1#endif #endif @@ -250,7 +254,15 @@#elif defined(CONFIG_X86 )/* Always assume we're running 64bit */ #define BOOTENV_EFI_PXE_ARCH "0x7" -#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:0000:UNDI:003000" +#elif defined(CONFIG_CPU_RISCV_32 ) +/* TODO: Register VCI identifier via RFC */ +#define BOOTENV_EFI_PXE_ARCH "0x5032" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:5032:UNDI:003000" +#elif defined(CONFIG_CPU_RISCV_64 ) +/* TODO: Register VCI identifier via RFC */ +#define BOOTENV_EFI_PXE_ARCH "0x5064" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:5064:UNDI:003000"#else #error Please specify an EFI client identifier#endif
PATCH 7/8 riscv: nx25: Enable distro boot
In reply to Alexander GrafDistro boot allows for a common boot path on systems that allow distributions to easily boot from a default configuration.
This patch enables distro boot for the nx25-ae250. Hopefully this can serve as a good example for new boards, so they enable it as well.
--- configs/nx25-ae250_defconfig | 1 + include/configs/nx25-ae250.h | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
configs/nx25-ae250_defconfig +1 -0
@@ -37,3 +37,4 @@ CONFIG_DM_SPI=y CONFIG_ATCSPI200_SPI=y CONFIG_TIMER=y CONFIG_ATCPIT100_TIMER=y +CONFIG_DISTRO_DEFAULTS=y
include/configs/nx25-ae250.h +17 -0
@@ -105,4 +105,21 @@/* Increase max gunzip size */ #define CONFIG_SYS_BOOTM_LEN (64 << 20) +/* When we use RAM as ENV */ +#define CONFIG_ENV_SIZE 0x2000 + +/* Enable distro boot */ +#define BOOT_TARGET_DEVICES (func) \ + func(MMC, mmc, 0) \ + func(DHCP, dhcp, na) +#include <config_distro_bootcmd.h> + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "kernel_addr_r=0x00080000\0" \ + "pxefile_addr_r=0x01f00000\0" \ + "scriptaddr=0x01f00000\0" \ + "fdt_addr_r=0x02000000\0" \ + "ramdisk_addr_r=0x02800000\0" \ + BOOTENV +#endif /* __CONFIG_H */
Signature · 1 line
2.12.3
PATCH 8/8 efi_loader: Enable RISC-V support
In reply to Alexander GrafWe have almost all pieces needed to support RISC-V UEFI binaries in place already. The only missing piece are ELF relocations for runtime code and data.
This patch adds respective support in the linker script and the runtime relocation code. It also allows users to enable the EFI_LOADER configuration switch on RISC-V platforms.
--- arch/riscv/cpu/nx25/u-boot.lds | 16 ++++++++++++++++ lib/efi_loader/Kconfig | 2 +- lib/efi_loader/efi_runtime.c | 41 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 6 deletions(-)
arch/riscv/cpu/nx25/u-boot.lds +16 -0
@@ -38,6 +38,22 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); } + . = ALIGN(4); + + .efi_runtime : { + __efi_runtime_start = .; + *(efi_runtime_text) + *(efi_runtime_data) + __efi_runtime_stop = .; + } + + .efi_runtime_rel : { + __efi_runtime_rel_start = .; + *(.relaefi_runtime_text) + *(.relaefi_runtime_data) + __efi_runtime_rel_stop = .; + } + . = ALIGN(4); /DISCARD/ : { *(.rela.plt*) }
lib/efi_loader/Kconfig +1 -1
@@ -1,6 +1,6 @@ config EFI_LOADER bool "Support running EFI Applications in U-Boot" - depends on (ARM || X86) && OF_LIBFDT + depends on (ARM || X86 || RISCV) && OF_LIBFDT # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT # We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUB
lib/efi_loader/efi_runtime.c +36 -5
57 lines not on this page · raw message
Signature · 1 line
2.12.3
PATCH 8/8 efi_loader: Enable RISC-V support
Quoted 9 lines · Alexander Graf
We have almost all pieces needed to support RISC-V UEFI binaries in place already. The only missing piece are ELF relocations for runtime code and data.
This patch adds respective support in the linker script and the runtime relocation code. It also allows users to enable the
EFI_LOADERconfiguration switch on RISC-V platforms.Signed-off-by Alexander Graf <[email protected]>
The patch is not applicable after my pending patch for ARMV7_NONSEC. Could you, please, have a look at
"efi_loader: no support for ARMV7_NONSEC=y"
https://patchwork.ozlabs.org/patch/896962/
and decide if you will accept it. This is only a question of sequence in efi_next.
Best regards
Heinrich
Quoted 109 lines
--- arch/riscv/cpu/nx25/u-boot.lds | 16 ++++++++++++++++ lib/efi_loader/Kconfig | 2 +- lib/efi_loader/efi_runtime.c | 41 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 6 deletions(-)arch/riscv/cpu/nx25/u-boot.lds +16
-0@@ -38,6 +38,22 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); } + . = ALIGN(4); + + .efi_runtime : { + __efi_runtime_start = .; + *(efi_runtime_text) + *(efi_runtime_data) + __efi_runtime_stop = .; + } + + .efi_runtime_rel : { + __efi_runtime_rel_start = .; + *(.relaefi_runtime_text) + *(.relaefi_runtime_data) + __efi_runtime_rel_stop = .; + } + . = ALIGN(4); /DISCARD/ : { *(.rela.plt*) }lib/efi_loader/Kconfig +1
-1@@ -1,6 +1,6 @@ config EFI_LOADER bool "Support running EFI Applications in U-Boot" - depends on (ARM || X86) && OF_LIBFDT + depends on (ARM || X86 || RISCV) && OF_LIBFDT # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT # We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUBlib/efi_loader/efi_runtime.c +36
-5@@ -41,6 +41,25 @@ static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);#include <asm/elf.h> #define R_RELATIVE R_386_RELATIVE#define R_MASK 0xffULL +#elif defined(CONFIG_RISCV ) +#include <elf.h> +#define R_RELATIVE R_RISCV_RELATIVE +#define R_MASK 0xffULL +#define IS_RELA 1 + +struct dyn_sym { +ulong foo1; +ulong addr; +u32 foo2; +u32 foo3; +}; +#ifdef CONFIG_CPU_RISCV_32 +#define R_ABSOLUTE R_RISCV_32 +#define SYM_INDEX 8 +#else +#define R_ABSOLUTE R_RISCV_64 +#define SYM_INDEX 32 +#endif #else #error Need to add relocation awareness#endif @@ -247,15 +266,27 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map) p = (void *)((ulong )rel->offset - base) + gd->relocaddr; -if ((rel->info &R_MASK ) !=R_RELATIVE ) { -continue ; - } +debug ("%s: rel->info=%#lx *p=%#lx rel->offset=%p\n" , __func__, rel->info, *p, rel->offset); +switch (rel->info &R_MASK ) { +case R_RELATIVE :#ifdef IS_RELA - newaddr = rel->addend + offset -CONFIG_SYS_TEXT_BASE ; + newaddr = rel->addend + offset -CONFIG_SYS_TEXT_BASE ;#else - newaddr = *p - lastoff + offset; + newaddr = *p - lastoff + offset;#endif +break ; +#ifdef R_ABSOLUTE +case R_ABSOLUTE : { +ulong symidx = rel->info >>SYM_INDEX ; +extern struct dyn_sym __dyn_sym_start[]; + newaddr = __dyn_sym_start[symidx].addr + offset; +break ; + } +#endif +default : +continue ; + }/* Check if the relocation is inside bounds */ if (map && ((newaddr < map->virtual_start) ||