[U-Boot] [PATCH 8/8] efi_loader: Enable RISC-V support

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Apr 19 05:14:57 UTC 2018


On 04/18/2018 03:40 PM, Alexander Graf wrote:
> 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 at suse.de>

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

> ---
>  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(-)
> 
> diff --git a/arch/riscv/cpu/nx25/u-boot.lds b/arch/riscv/cpu/nx25/u-boot.lds
> index 936fd779aa..508fa7e58d 100644
> --- a/arch/riscv/cpu/nx25/u-boot.lds
> +++ b/arch/riscv/cpu/nx25/u-boot.lds
> @@ -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*) }
> diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
> index 83d75c4fdc..9de58bb012 100644
> --- a/lib/efi_loader/Kconfig
> +++ b/lib/efi_loader/Kconfig
> @@ -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
> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> index 573a5d6ac1..33bbc8d6cc 100644
> --- a/lib/efi_loader/efi_runtime.c
> +++ b/lib/efi_loader/efi_runtime.c
> @@ -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) ||
> 



More information about the U-Boot mailing list