Author: ian Date: Sun May 10 13:24:26 2015 New Revision: 282727 URL: https://svnweb.freebsd.org/changeset/base/282727
Log: The self-relocation code is not efi-specific, move it to boot/common. The function was defined as taking 4 parameters and returning EFI_STATUS, but all existing callers (in asm code) passed only two parameters and don't use the return value. The function signature now matches that usage, and doesn't refer to efi-specific types. Parameters and variables now use the cannonical typenames set up by elf.h (Elf_Word, Elf_Addr, etc) instead of raw C types. Hopefully this will prevent suprises as new platforms come along and use this code. The function was renamed from _reloc() to self_reloc() to emphasize its difference from the other elf relocation code found in boot/common. Differential Revision: https://reviews.freebsd.org/D2490 Added: head/sys/boot/common/self_reloc.c - copied, changed from r282653, head/sys/boot/efi/loader/reloc.c Deleted: head/sys/boot/efi/loader/reloc.c Modified: head/sys/boot/efi/boot1/Makefile head/sys/boot/efi/loader/Makefile head/sys/boot/efi/loader/arch/amd64/start.S head/sys/boot/efi/loader/arch/arm/start.S head/sys/boot/efi/loader/arch/arm64/start.S head/sys/boot/efi/loader/arch/i386/start.S Copied and modified: head/sys/boot/common/self_reloc.c (from r282653, head/sys/boot/efi/loader/reloc.c) ============================================================================== --- head/sys/boot/efi/loader/reloc.c Fri May 8 17:53:44 2015 (r282653, copy source) +++ head/sys/boot/common/self_reloc.c Sun May 10 13:24:26 2015 (r282727) @@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <elf.h> -#include <efi.h> #include <bootstrap.h> #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 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 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 } rel = (ElfW_Rel *) ((caddr_t) rel + relent); } - - return (EFI_SUCCESS); } Modified: head/sys/boot/efi/boot1/Makefile ============================================================================== --- head/sys/boot/efi/boot1/Makefile Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/boot1/Makefile Sun May 10 13:24:26 2015 (r282727) @@ -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 Modified: head/sys/boot/efi/loader/Makefile ============================================================================== --- head/sys/boot/efi/loader/Makefile Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/loader/Makefile Sun May 10 13:24:26 2015 (r282727) @@ -20,7 +20,7 @@ SRCS= autoload.c \ copy.c \ devicename.c \ main.c \ - reloc.c \ + self_reloc.c \ smbios.c \ vers.c Modified: head/sys/boot/efi/loader/arch/amd64/start.S ============================================================================== --- head/sys/boot/efi/loader/arch/amd64/start.S Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/loader/arch/amd64/start.S Sun May 10 13:24:26 2015 (r282727) @@ -53,7 +53,7 @@ _start: popq %rdx pushq %rcx pushq %rdx - call _reloc + call self_reloc popq %rdi popq %rsi Modified: head/sys/boot/efi/loader/arch/arm/start.S ============================================================================== --- head/sys/boot/efi/loader/arch/arm/start.S Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/loader/arch/arm/start.S Sun May 10 13:24:26 2015 (r282727) @@ -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 Modified: head/sys/boot/efi/loader/arch/arm64/start.S ============================================================================== --- head/sys/boot/efi/loader/arch/arm64/start.S Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/loader/arch/arm64/start.S Sun May 10 13:24:26 2015 (r282727) @@ -156,7 +156,7 @@ _start: adr x0, ImageBase adr x1, _DYNAMIC - bl _reloc + bl self_reloc ldp x0, x1, [sp], #16 Modified: head/sys/boot/efi/loader/arch/i386/start.S ============================================================================== --- head/sys/boot/efi/loader/arch/i386/start.S Sun May 10 13:21:36 2015 (r282726) +++ head/sys/boot/efi/loader/arch/i386/start.S Sun May 10 13:24:26 2015 (r282727) @@ -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 */ _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"