efi_loader: Enable RISC-V support

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_LOADER configuration
switch on RISC-V platforms.

Signed-off-by: Alexander Graf <agraf@suse.de>
lime2-spi
Rick Chen 7 years ago committed by Andes
parent 0979f7ce1e
commit 6836adbe75
  1. 16
      arch/riscv/cpu/nx25/u-boot.lds
  2. 2
      cmd/Kconfig
  3. 2
      lib/efi_loader/Kconfig
  4. 37
      lib/efi_loader/efi_runtime.c

@ -39,6 +39,22 @@ SECTIONS
. = ALIGN(4); . = 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*) } /DISCARD/ : { *(.rela.plt*) }
.rela.dyn : { .rela.dyn : {
__rel_dyn_start = .; __rel_dyn_start = .;

@ -228,7 +228,7 @@ config CMD_BOOTEFI
config CMD_BOOTEFI_HELLO_COMPILE config CMD_BOOTEFI_HELLO_COMPILE
bool "Compile a standard EFI hello world binary for testing" bool "Compile a standard EFI hello world binary for testing"
depends on CMD_BOOTEFI && (ARM || X86) depends on CMD_BOOTEFI && (ARM || X86 || RISCV)
default y default y
help help
This compiles a standard EFI hello world application with U-Boot so This compiles a standard EFI hello world application with U-Boot so

@ -1,6 +1,6 @@
config EFI_LOADER config EFI_LOADER
bool "Support running EFI Applications in U-Boot" bool "Support running EFI Applications in U-Boot"
depends on (ARM || X86) && OF_LIBFDT depends on (ARM || X86 || RISCV) && OF_LIBFDT
# We do not support bootefi booting ARMv7 in non-secure mode # We do not support bootefi booting ARMv7 in non-secure mode
depends on !ARMV7_NONSEC depends on !ARMV7_NONSEC
# We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB

@ -40,6 +40,25 @@ static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);
#include <asm/elf.h> #include <asm/elf.h>
#define R_RELATIVE R_386_RELATIVE #define R_RELATIVE R_386_RELATIVE
#define R_MASK 0xffULL #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 #else
#error Need to add relocation awareness #error Need to add relocation awareness
#endif #endif
@ -246,15 +265,27 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
p = (void*)((ulong)rel->offset - base) + gd->relocaddr; p = (void*)((ulong)rel->offset - base) + gd->relocaddr;
if ((rel->info & R_MASK) != R_RELATIVE) { debug("%s: rel->info=%#lx *p=%#lx rel->offset=%p\n", __func__, rel->info, *p, rel->offset);
continue;
}
switch (rel->info & R_MASK) {
case R_RELATIVE:
#ifdef IS_RELA #ifdef IS_RELA
newaddr = rel->addend + offset - CONFIG_SYS_TEXT_BASE; newaddr = rel->addend + offset - CONFIG_SYS_TEXT_BASE;
#else #else
newaddr = *p - lastoff + offset; newaddr = *p - lastoff + offset;
#endif #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 */ /* Check if the relocation is inside bounds */
if (map && ((newaddr < map->virtual_start) || if (map && ((newaddr < map->virtual_start) ||

Loading…
Cancel
Save