diff --git a/sys/boot/efi/loader/reloc.c b/sys/boot/common/self_reloc.c similarity index 87% rename from sys/boot/efi/loader/reloc.c rename to sys/boot/common/self_reloc.c index fbe20431edf4..9864a4899f6a 100644 --- a/sys/boot/efi/loader/reloc.c +++ b/sys/boot/common/self_reloc.c @@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #if defined(__aarch64__) @@ -38,11 +37,11 @@ __FBSDID("$FreeBSD$"); #define ELFW_R_TYPE ELF64_R_TYPE #define ELF_RELA #elif defined(__arm__) || defined(__i386__) -#define ElfW_Rel Elf32_Rel +#define ElfW_Rel Elf32_Rel #define ElfW_Dyn Elf32_Dyn #define ELFW_R_TYPE ELF32_R_TYPE #elif defined(__amd64__) -#define ElfW_Rel Elf64_Rel +#define ElfW_Rel Elf64_Rel #define ElfW_Dyn Elf64_Dyn #define ELFW_R_TYPE ELF64_R_TYPE #else @@ -63,14 +62,13 @@ __FBSDID("$FreeBSD$"); #endif /* - * A simple relocator for EFI binaries. + * A simple elf relocator. */ -EFI_STATUS -_reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle, - EFI_SYSTEM_TABLE *system_table) +void +self_reloc(Elf_Addr baseaddr, ElfW_Dyn *dynamic) { - unsigned long relsz, relent; - unsigned long *newaddr; + Elf_Word relsz, relent; + Elf_Addr *newaddr; ElfW_Rel *rel; ElfW_Dyn *dynp; @@ -83,8 +81,7 @@ _reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle, switch (dynp->d_tag) { case DT_REL: case DT_RELA: - rel = (ElfW_Rel *) ((unsigned long) dynp->d_un.d_ptr + - ImageBase); + rel = (ElfW_Rel *)(dynp->d_un.d_ptr + baseaddr); break; case DT_RELSZ: case DT_RELASZ: @@ -110,8 +107,8 @@ _reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle, case RELOC_TYPE_RELATIVE: /* Address relative to the base address. */ - newaddr = (unsigned long *)(ImageBase + rel->r_offset); - *newaddr += ImageBase; + newaddr = (Elf_Addr *)(rel->r_offset + baseaddr); + *newaddr += baseaddr; /* Add the addend when the ABI uses them */ #ifdef ELF_RELA *newaddr += rel->r_addend; @@ -123,6 +120,4 @@ _reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle, } rel = (ElfW_Rel *) ((caddr_t) rel + relent); } - - return (EFI_SUCCESS); } diff --git a/sys/boot/efi/boot1/Makefile b/sys/boot/efi/boot1/Makefile index a955bdf38905..c6a6d59e50d1 100644 --- a/sys/boot/efi/boot1/Makefile +++ b/sys/boot/efi/boot1/Makefile @@ -13,7 +13,7 @@ PROG= loader.sym INTERNALPROG= # architecture-specific loader code -SRCS= boot1.c reloc.c start.S +SRCS= boot1.c self_reloc.c start.S CFLAGS+= -I. CFLAGS+= -I${.CURDIR}/../include diff --git a/sys/boot/efi/loader/Makefile b/sys/boot/efi/loader/Makefile index 06e76a90a051..d11021ecefb0 100644 --- a/sys/boot/efi/loader/Makefile +++ b/sys/boot/efi/loader/Makefile @@ -20,7 +20,7 @@ SRCS= autoload.c \ copy.c \ devicename.c \ main.c \ - reloc.c \ + self_reloc.c \ smbios.c \ vers.c diff --git a/sys/boot/efi/loader/arch/amd64/start.S b/sys/boot/efi/loader/arch/amd64/start.S index beaeeff29723..774ef4fa7901 100644 --- a/sys/boot/efi/loader/arch/amd64/start.S +++ b/sys/boot/efi/loader/arch/amd64/start.S @@ -53,7 +53,7 @@ _start: popq %rdx pushq %rcx pushq %rdx - call _reloc + call self_reloc popq %rdi popq %rsi diff --git a/sys/boot/efi/loader/arch/arm/start.S b/sys/boot/efi/loader/arch/arm/start.S index 41606552ebe3..443de4af1f87 100644 --- a/sys/boot/efi/loader/arch/arm/start.S +++ b/sys/boot/efi/loader/arch/arm/start.S @@ -153,7 +153,7 @@ _start: ldr r1, .Ldynamic add r1, r1, r5 - bl _C_LABEL(_reloc) + bl _C_LABEL(self_reloc) /* Zero the BSS, _reloc fixed the values for us */ ldr r0, .Lbss diff --git a/sys/boot/efi/loader/arch/arm64/start.S b/sys/boot/efi/loader/arch/arm64/start.S index a8002fa20246..cd9badb05b79 100644 --- a/sys/boot/efi/loader/arch/arm64/start.S +++ b/sys/boot/efi/loader/arch/arm64/start.S @@ -156,7 +156,7 @@ _start: adr x0, ImageBase adr x1, _DYNAMIC - bl _reloc + bl self_reloc ldp x0, x1, [sp], #16 diff --git a/sys/boot/efi/loader/arch/i386/start.S b/sys/boot/efi/loader/arch/i386/start.S index 2be2478f9dd7..e9715da23e66 100644 --- a/sys/boot/efi/loader/arch/i386/start.S +++ b/sys/boot/efi/loader/arch/i386/start.S @@ -53,7 +53,7 @@ ENTRY(_start) addl $_DYNAMIC-0b, %ebx pushl %ebx /* dynamic */ pushl %eax /* ImageBase */ - call _reloc + call self_reloc cmpl $EFI_SUCCESS, %eax jne 1f popl %ebx /* remove ImageBase from the stack */