Message ID | 20180419154923.70719-4-agraf@suse.de |
---|---|
State | New |
Headers | show |
Series | riscv: Enable efi_loader support | expand |
> The hello world binary and a few selftests require to build EFI target binaries, not just the EFI host environment. > > This patch adds all required files to generate an EFI binary for RISC-V. > > Signed-off-by: Alexander Graf <agraf@suse.de> > > --- > > new in v2 > --- > arch/riscv/config.mk | 5 ++ > arch/riscv/lib/Makefile | 11 +++++ > arch/riscv/lib/elf_riscv32_efi.lds | 70 +++++++++++++++++++++++++++ arch/riscv/lib/elf_riscv64_efi.lds | 70 +++++++++++++++++++++++++++ > arch/riscv/lib/reloc_riscv_efi.c | 97 ++++++++++++++++++++++++++++++++++++++ > 5 files changed, 253 insertions(+) > create mode 100644 arch/riscv/lib/elf_riscv32_efi.lds > create mode 100644 arch/riscv/lib/elf_riscv64_efi.lds > create mode 100644 arch/riscv/lib/reloc_riscv_efi.c > > diff --git a/arch/riscv/config.mk b/arch/riscv/config.mk index 69f4cf6ce8..9175aa765d 100644 > --- a/arch/riscv/config.mk > +++ b/arch/riscv/config.mk > @@ -19,10 +19,12 @@ endif > > ifdef CONFIG_32BIT > PLATFORM_LDFLAGS += -m $(32bit-emul) > +EFI_LDS := elf_riscv32_efi.lds > endif > > ifdef CONFIG_64BIT > PLATFORM_LDFLAGS += -m $(64bit-emul) > +EFI_LDS := elf_riscv64_efi.lds > endif > > CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ @@ -31,3 +33,6 @@ CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ > PLATFORM_CPPFLAGS += -ffixed-gp -fpic > PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 -ffunction-sections LDFLAGS_u-boot += --gc-sections -static -pie > + > +EFI_CRT0 := crt0_riscv_efi.o > +EFI_RELOC := reloc_riscv_efi.o Hi Alexander make fail as below make[1]: *** No rule to make target 'arch/riscv/lib/crt0_riscv_efi.o', needed by '__build'. Stop. Makefile:1340: recipe for target 'arch/riscv/lib' failed Shall crt0_riscv_efi.c be uploaded there ? B.R. Rick > diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index 6d97aa2719..33f80ebdca 100644 > --- a/arch/riscv/lib/Makefile > +++ b/arch/riscv/lib/Makefile > @@ -13,3 +13,14 @@ obj-$(CONFIG_CMD_GO) += boot.o > obj-y += cache.o > obj-y += interrupts.o > obj-y += setjmp.o > + > +# For building EFI apps > +CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI) > +CFLAGS_REMOVE_$(EFI_CRT0) := $(CFLAGS_NON_EFI) > + > +CFLAGS_$(EFI_RELOC) := $(CFLAGS_EFI) > +CFLAGS_REMOVE_$(EFI_RELOC) := $(CFLAGS_NON_EFI) > + > +extra-$(CONFIG_CMD_BOOTEFI_HELLO_COMPILE) += $(EFI_CRT0) $(EFI_RELOC) > +extra-$(CONFIG_CMD_BOOTEFI_SELFTEST) += $(EFI_CRT0) $(EFI_RELOC) > +extra-$(CONFIG_EFI) += $(EFI_CRT0) $(EFI_RELOC) > diff --git a/arch/riscv/lib/elf_riscv32_efi.lds b/arch/riscv/lib/elf_riscv32_efi.lds > new file mode 100644 > index 0000000000..96d11985b0 > --- /dev/null > +++ b/arch/riscv/lib/elf_riscv32_efi.lds > @@ -0,0 +1,70 @@ > +/* > + * U-Boot riscv32 EFI linker script > + * > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * Modified from arch/arm/lib/elf_aarch64_efi.lds */ > + > +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", > +"elf32-littleriscv") > +OUTPUT_ARCH(riscv) > +ENTRY(_start) > +SECTIONS > +{ > + .text 0x0 : { > + _text = .; > + *(.text.head) > + *(.text) > + *(.text.*) > + *(.gnu.linkonce.t.*) > + *(.srodata) > + *(.rodata*) > + . = ALIGN(16); > + } > + _etext = .; > + _text_size = . - _text; > + .dynamic : { *(.dynamic) } > + .data : { > + _data = .; > + *(.sdata) > + *(.data) > + *(.data1) > + *(.data.*) > + *(.got.plt) > + *(.got) > + > + /* > + * The EFI loader doesn't seem to like a .bss section, so we > + * stick it all into .data: > + */ > + . = ALIGN(16); > + _bss = .; > + *(.sbss) > + *(.scommon) > + *(.dynbss) > + *(.bss) > + *(.bss.*) > + *(COMMON) > + . = ALIGN(16); > + _bss_end = .; > + _edata = .; > + } > + .rela.dyn : { *(.rela.dyn) } > + .rela.plt : { *(.rela.plt) } > + .rela.got : { *(.rela.got) } > + .rela.data : { *(.rela.data) *(.rela.data*) } > + _data_size = . - _etext; > + > + . = ALIGN(4096); > + .dynsym : { *(.dynsym) } > + . = ALIGN(4096); > + .dynstr : { *(.dynstr) } > + . = ALIGN(4096); > + .note.gnu.build-id : { *(.note.gnu.build-id) } > + /DISCARD/ : { > + *(.rel.reloc) > + *(.eh_frame) > + *(.note.GNU-stack) > + } > + .comment 0 : { *(.comment) } > +} > diff --git a/arch/riscv/lib/elf_riscv64_efi.lds b/arch/riscv/lib/elf_riscv64_efi.lds > new file mode 100644 > index 0000000000..25c863de8a > --- /dev/null > +++ b/arch/riscv/lib/elf_riscv64_efi.lds > @@ -0,0 +1,70 @@ > +/* > + * U-Boot riscv64 EFI linker script > + * > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * Modified from arch/arm/lib/elf_aarch64_efi.lds */ > + > +OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", > +"elf64-littleriscv") > +OUTPUT_ARCH(riscv) > +ENTRY(_start) > +SECTIONS > +{ > + .text 0x0 : { > + _text = .; > + *(.text.head) > + *(.text) > + *(.text.*) > + *(.gnu.linkonce.t.*) > + *(.srodata) > + *(.rodata*) > + . = ALIGN(16); > + } > + _etext = .; > + _text_size = . - _text; > + .dynamic : { *(.dynamic) } > + .data : { > + _data = .; > + *(.sdata) > + *(.data) > + *(.data1) > + *(.data.*) > + *(.got.plt) > + *(.got) > + > + /* > + * The EFI loader doesn't seem to like a .bss section, so we > + * stick it all into .data: > + */ > + . = ALIGN(16); > + _bss = .; > + *(.sbss) > + *(.scommon) > + *(.dynbss) > + *(.bss) > + *(.bss.*) > + *(COMMON) > + . = ALIGN(16); > + _bss_end = .; > + _edata = .; > + } > + .rela.dyn : { *(.rela.dyn) } > + .rela.plt : { *(.rela.plt) } > + .rela.got : { *(.rela.got) } > + .rela.data : { *(.rela.data) *(.rela.data*) } > + _data_size = . - _etext; > + > + . = ALIGN(4096); > + .dynsym : { *(.dynsym) } > + . = ALIGN(4096); > + .dynstr : { *(.dynstr) } > + . = ALIGN(4096); > + .note.gnu.build-id : { *(.note.gnu.build-id) } > + /DISCARD/ : { > + *(.rel.reloc) > + *(.eh_frame) > + *(.note.GNU-stack) > + } > + .comment 0 : { *(.comment) } > +} > diff --git a/arch/riscv/lib/reloc_riscv_efi.c b/arch/riscv/lib/reloc_riscv_efi.c > new file mode 100644 > index 0000000000..d80ffc975c > --- /dev/null > +++ b/arch/riscv/lib/reloc_riscv_efi.c > @@ -0,0 +1,97 @@ > +/* reloc_riscv.c - position independent ELF shared object relocator > + Copyright (C) 2018 Alexander Graf <agraf@suse.de> > + Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org> > + Copyright (C) 1999 Hewlett-Packard Co. > + Contributed by David Mosberger <davidm@hpl.hp.com>. > + > + All rights reserved. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above > + copyright notice, this list of conditions and the following > + disclaimer in the documentation and/or other materials > + provided with the distribution. > + * Neither the name of Hewlett-Packard Co. nor the names of its > + contributors may be used to endorse or promote products derived > + from this software without specific prior written permission. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, > + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF > + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS > + BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, > + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, > + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR > + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR > + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF > + THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + SUCH DAMAGE. > +*/ > + > +#include <efi.h> > + > +#include <elf.h> > + > +#if __riscv_xlen == 64 > +#define Elf_Dyn Elf64_Dyn > +#define Elf_Rela Elf64_Rela > +#define ELF_R_TYPE ELF64_R_TYPE > +#else > +#define Elf_Dyn Elf32_Dyn > +#define Elf_Rela Elf32_Rela > +#define ELF_R_TYPE ELF32_R_TYPE > +#endif > + > +efi_status_t _relocate(long ldbase, Elf_Dyn *dyn, efi_handle_t image, > + struct efi_system_table *systab) { > + long relsz = 0, relent = 0; > + Elf_Rela *rel = 0; > + unsigned long *addr; > + int i; > + > + for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { > + switch (dyn[i].d_tag) { > + case DT_RELA: > + rel = (Elf_Rela *)((ulong)dyn[i].d_un.d_ptr + ldbase); > + break; > + case DT_RELASZ: > + relsz = dyn[i].d_un.d_val; > + break; > + case DT_RELAENT: > + relent = dyn[i].d_un.d_val; > + break; > + default: > + break; > + } > + } > + > + if (!rel && relent == 0) > + return EFI_SUCCESS; > + > + if (!rel || relent == 0) > + return EFI_LOAD_ERROR; > + > + while (relsz > 0) { > + /* apply the relocs */ > + switch (ELF_R_TYPE(rel->r_info)) { > + case R_RISCV_RELATIVE: > + addr = (ulong *)(ldbase + rel->r_offset); > + *addr = ldbase + rel->r_addend; > + break; > + default: > + /* Panic */ > + while (1) ; > + } > + rel = (Elf_Rela *)((char *)rel + relent); > + relsz -= relent; > + } > + return EFI_SUCCESS; > +} > -- > 2.12.3
On 23.04.18 07:54, 陳建志 wrote: >> The hello world binary and a few selftests require to build EFI target binaries, not just the EFI host environment. >> >> This patch adds all required files to generate an EFI binary for RISC-V. >> >> Signed-off-by: Alexander Graf <agraf@suse.de> >> >> --- >> >> new in v2 >> --- >> arch/riscv/config.mk | 5 ++ >> arch/riscv/lib/Makefile | 11 +++++ >> arch/riscv/lib/elf_riscv32_efi.lds | 70 +++++++++++++++++++++++++++ arch/riscv/lib/elf_riscv64_efi.lds | 70 +++++++++++++++++++++++++++ >> arch/riscv/lib/reloc_riscv_efi.c | 97 ++++++++++++++++++++++++++++++++++++++ >> 5 files changed, 253 insertions(+) >> create mode 100644 arch/riscv/lib/elf_riscv32_efi.lds >> create mode 100644 arch/riscv/lib/elf_riscv64_efi.lds >> create mode 100644 arch/riscv/lib/reloc_riscv_efi.c >> >> diff --git a/arch/riscv/config.mk b/arch/riscv/config.mk index 69f4cf6ce8..9175aa765d 100644 >> --- a/arch/riscv/config.mk >> +++ b/arch/riscv/config.mk >> @@ -19,10 +19,12 @@ endif >> >> ifdef CONFIG_32BIT >> PLATFORM_LDFLAGS += -m $(32bit-emul) >> +EFI_LDS := elf_riscv32_efi.lds >> endif >> >> ifdef CONFIG_64BIT >> PLATFORM_LDFLAGS += -m $(64bit-emul) >> +EFI_LDS := elf_riscv64_efi.lds >> endif >> >> CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ @@ -31,3 +33,6 @@ CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ >> PLATFORM_CPPFLAGS += -ffixed-gp -fpic >> PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 -ffunction-sections LDFLAGS_u-boot += --gc-sections -static -pie >> + >> +EFI_CRT0 := crt0_riscv_efi.o >> +EFI_RELOC := reloc_riscv_efi.o > > Hi Alexander > > make fail as below > > make[1]: *** No rule to make target 'arch/riscv/lib/crt0_riscv_efi.o', > needed by '__build'. Stop. > Makefile:1340: recipe for target 'arch/riscv/lib' failed > > Shall crt0_riscv_efi.c be uploaded there ? Sorry, I forgot to send out v3 where I fixed that bit :). I'll do that immediately. Alex
diff --git a/arch/riscv/config.mk b/arch/riscv/config.mk index 69f4cf6ce8..9175aa765d 100644 --- a/arch/riscv/config.mk +++ b/arch/riscv/config.mk @@ -19,10 +19,12 @@ endif ifdef CONFIG_32BIT PLATFORM_LDFLAGS += -m $(32bit-emul) +EFI_LDS := elf_riscv32_efi.lds endif ifdef CONFIG_64BIT PLATFORM_LDFLAGS += -m $(64bit-emul) +EFI_LDS := elf_riscv64_efi.lds endif CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ @@ -31,3 +33,6 @@ CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \ PLATFORM_CPPFLAGS += -ffixed-gp -fpic PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 -ffunction-sections LDFLAGS_u-boot += --gc-sections -static -pie + +EFI_CRT0 := crt0_riscv_efi.o +EFI_RELOC := reloc_riscv_efi.o diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index 6d97aa2719..33f80ebdca 100644 --- a/arch/riscv/lib/Makefile +++ b/arch/riscv/lib/Makefile @@ -13,3 +13,14 @@ obj-$(CONFIG_CMD_GO) += boot.o obj-y += cache.o obj-y += interrupts.o obj-y += setjmp.o + +# For building EFI apps +CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI) +CFLAGS_REMOVE_$(EFI_CRT0) := $(CFLAGS_NON_EFI) + +CFLAGS_$(EFI_RELOC) := $(CFLAGS_EFI) +CFLAGS_REMOVE_$(EFI_RELOC) := $(CFLAGS_NON_EFI) + +extra-$(CONFIG_CMD_BOOTEFI_HELLO_COMPILE) += $(EFI_CRT0) $(EFI_RELOC) +extra-$(CONFIG_CMD_BOOTEFI_SELFTEST) += $(EFI_CRT0) $(EFI_RELOC) +extra-$(CONFIG_EFI) += $(EFI_CRT0) $(EFI_RELOC) diff --git a/arch/riscv/lib/elf_riscv32_efi.lds b/arch/riscv/lib/elf_riscv32_efi.lds new file mode 100644 index 0000000000..96d11985b0 --- /dev/null +++ b/arch/riscv/lib/elf_riscv32_efi.lds @@ -0,0 +1,70 @@ +/* + * U-Boot riscv32 EFI linker script + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Modified from arch/arm/lib/elf_aarch64_efi.lds + */ + +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) +ENTRY(_start) +SECTIONS +{ + .text 0x0 : { + _text = .; + *(.text.head) + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.srodata) + *(.rodata*) + . = ALIGN(16); + } + _etext = .; + _text_size = . - _text; + .dynamic : { *(.dynamic) } + .data : { + _data = .; + *(.sdata) + *(.data) + *(.data1) + *(.data.*) + *(.got.plt) + *(.got) + + /* + * The EFI loader doesn't seem to like a .bss section, so we + * stick it all into .data: + */ + . = ALIGN(16); + _bss = .; + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(16); + _bss_end = .; + _edata = .; + } + .rela.dyn : { *(.rela.dyn) } + .rela.plt : { *(.rela.plt) } + .rela.got : { *(.rela.got) } + .rela.data : { *(.rela.data) *(.rela.data*) } + _data_size = . - _etext; + + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .note.gnu.build-id : { *(.note.gnu.build-id) } + /DISCARD/ : { + *(.rel.reloc) + *(.eh_frame) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} diff --git a/arch/riscv/lib/elf_riscv64_efi.lds b/arch/riscv/lib/elf_riscv64_efi.lds new file mode 100644 index 0000000000..25c863de8a --- /dev/null +++ b/arch/riscv/lib/elf_riscv64_efi.lds @@ -0,0 +1,70 @@ +/* + * U-Boot riscv64 EFI linker script + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Modified from arch/arm/lib/elf_aarch64_efi.lds + */ + +OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv") +OUTPUT_ARCH(riscv) +ENTRY(_start) +SECTIONS +{ + .text 0x0 : { + _text = .; + *(.text.head) + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.srodata) + *(.rodata*) + . = ALIGN(16); + } + _etext = .; + _text_size = . - _text; + .dynamic : { *(.dynamic) } + .data : { + _data = .; + *(.sdata) + *(.data) + *(.data1) + *(.data.*) + *(.got.plt) + *(.got) + + /* + * The EFI loader doesn't seem to like a .bss section, so we + * stick it all into .data: + */ + . = ALIGN(16); + _bss = .; + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(16); + _bss_end = .; + _edata = .; + } + .rela.dyn : { *(.rela.dyn) } + .rela.plt : { *(.rela.plt) } + .rela.got : { *(.rela.got) } + .rela.data : { *(.rela.data) *(.rela.data*) } + _data_size = . - _etext; + + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .note.gnu.build-id : { *(.note.gnu.build-id) } + /DISCARD/ : { + *(.rel.reloc) + *(.eh_frame) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} diff --git a/arch/riscv/lib/reloc_riscv_efi.c b/arch/riscv/lib/reloc_riscv_efi.c new file mode 100644 index 0000000000..d80ffc975c --- /dev/null +++ b/arch/riscv/lib/reloc_riscv_efi.c @@ -0,0 +1,97 @@ +/* reloc_riscv.c - position independent ELF shared object relocator + Copyright (C) 2018 Alexander Graf <agraf@suse.de> + Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org> + Copyright (C) 1999 Hewlett-Packard Co. + Contributed by David Mosberger <davidm@hpl.hp.com>. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + * Neither the name of Hewlett-Packard Co. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <efi.h> + +#include <elf.h> + +#if __riscv_xlen == 64 +#define Elf_Dyn Elf64_Dyn +#define Elf_Rela Elf64_Rela +#define ELF_R_TYPE ELF64_R_TYPE +#else +#define Elf_Dyn Elf32_Dyn +#define Elf_Rela Elf32_Rela +#define ELF_R_TYPE ELF32_R_TYPE +#endif + +efi_status_t _relocate(long ldbase, Elf_Dyn *dyn, efi_handle_t image, + struct efi_system_table *systab) +{ + long relsz = 0, relent = 0; + Elf_Rela *rel = 0; + unsigned long *addr; + int i; + + for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { + switch (dyn[i].d_tag) { + case DT_RELA: + rel = (Elf_Rela *)((ulong)dyn[i].d_un.d_ptr + ldbase); + break; + case DT_RELASZ: + relsz = dyn[i].d_un.d_val; + break; + case DT_RELAENT: + relent = dyn[i].d_un.d_val; + break; + default: + break; + } + } + + if (!rel && relent == 0) + return EFI_SUCCESS; + + if (!rel || relent == 0) + return EFI_LOAD_ERROR; + + while (relsz > 0) { + /* apply the relocs */ + switch (ELF_R_TYPE(rel->r_info)) { + case R_RISCV_RELATIVE: + addr = (ulong *)(ldbase + rel->r_offset); + *addr = ldbase + rel->r_addend; + break; + default: + /* Panic */ + while (1) ; + } + rel = (Elf_Rela *)((char *)rel + relent); + relsz -= relent; + } + return EFI_SUCCESS; +}
The hello world binary and a few selftests require to build EFI target binaries, not just the EFI host environment. This patch adds all required files to generate an EFI binary for RISC-V. Signed-off-by: Alexander Graf <agraf@suse.de> --- new in v2 --- arch/riscv/config.mk | 5 ++ arch/riscv/lib/Makefile | 11 +++++ arch/riscv/lib/elf_riscv32_efi.lds | 70 +++++++++++++++++++++++++++ arch/riscv/lib/elf_riscv64_efi.lds | 70 +++++++++++++++++++++++++++ arch/riscv/lib/reloc_riscv_efi.c | 97 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+) create mode 100644 arch/riscv/lib/elf_riscv32_efi.lds create mode 100644 arch/riscv/lib/elf_riscv64_efi.lds create mode 100644 arch/riscv/lib/reloc_riscv_efi.c