Author: emaste Date: Tue Apr 7 21:34:49 2015 New Revision: 281237 URL: https://svnweb.freebsd.org/changeset/base/281237
Log: EFI: use common reloc.c for all architectures Much of this file is common to the architectures we support, so share an implementation by adding a little #ifdef-ery. Differential Revision: https://reviews.freebsd.org/D2241 Reviewed by: imp Sponsored by: The FreeBSD Foundation Added: head/sys/boot/efi/loader/reloc.c - copied, changed from r281235, head/sys/boot/efi/loader/arch/amd64/reloc.c Deleted: head/sys/boot/efi/loader/arch/amd64/reloc.c head/sys/boot/efi/loader/arch/arm/reloc.c Modified: head/sys/boot/efi/boot1/Makefile Modified: head/sys/boot/efi/boot1/Makefile ============================================================================== --- head/sys/boot/efi/boot1/Makefile Tue Apr 7 21:31:17 2015 (r281236) +++ head/sys/boot/efi/boot1/Makefile Tue Apr 7 21:34:49 2015 (r281237) @@ -23,7 +23,9 @@ CFLAGS+= -I${.CURDIR}/../../../contrib/d CFLAGS+= -I${.CURDIR}/../../.. # Always add MI sources and REGULAR efi loader bits -.PATH: ${.CURDIR}/../loader/arch/${MACHINE_CPUARCH} ${.CURDIR}/../../common +.PATH: ${.CURDIR}/../loader/arch/${MACHINE_CPUARCH} +.PATH: ${.CURDIR}/../loader +.PATH: ${.CURDIR}/../../common CFLAGS+= -I${.CURDIR}/../../common FILES= boot1.efi boot1.efifat Copied and modified: head/sys/boot/efi/loader/reloc.c (from r281235, head/sys/boot/efi/loader/arch/amd64/reloc.c) ============================================================================== --- head/sys/boot/efi/loader/arch/amd64/reloc.c Tue Apr 7 21:05:52 2015 (r281235, copy source) +++ head/sys/boot/efi/loader/reloc.c Tue Apr 7 21:34:49 2015 (r281237) @@ -32,18 +32,30 @@ __FBSDID("$FreeBSD$"); #include <efi.h> #include <bootstrap.h> -#ifdef __i386__ +#if defined(__arm__) || defined(__i386__) #define ElfW_Rel Elf32_Rel #define ElfW_Dyn Elf32_Dyn #define ELFW_R_TYPE ELF32_R_TYPE -#elif __amd64__ +#elif defined(__amd64__) #define ElfW_Rel Elf64_Rel #define ElfW_Dyn Elf64_Dyn #define ELFW_R_TYPE ELF64_R_TYPE +#else +#error architecture not supported +#endif +#if defined(__amd64__) +#define RELOC_TYPE_NONE R_X86_64_NONE +#define RELOC_TYPE_RELATIVE R_X86_64_RELATIVE +#elif defined(__arm__) +#define RELOC_TYPE_NONE R_ARM_NONE +#define RELOC_TYPE_RELATIVE R_ARM_RELATIVE +#elif defined(__i386__) +#define RELOC_TYPE_NONE R_386_NONE +#define RELOC_TYPE_RELATIVE R_386_RELATIVE #endif /* - * A simple relocator for IA32/AMD64 EFI binaries. + * A simple relocator for EFI binaries. */ EFI_STATUS _reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle, @@ -81,17 +93,14 @@ _reloc(unsigned long ImageBase, ElfW_Dyn /* * Perform the actual relocation. - * XXX: We are reusing code for the amd64 version of this, but - * we must make sure the relocation types are the same. */ - CTASSERT(R_386_NONE == R_X86_64_NONE); - CTASSERT(R_386_RELATIVE == R_X86_64_RELATIVE); for (; relsz > 0; relsz -= relent) { switch (ELFW_R_TYPE(rel->r_info)) { - case R_386_NONE: + case RELOC_TYPE_NONE: /* No relocation needs be performed. */ break; - case R_386_RELATIVE: + + case RELOC_TYPE_RELATIVE: /* Address relative to the base address. */ newaddr = (unsigned long *)(ImageBase + rel->r_offset); *newaddr += ImageBase; _______________________________________________ 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"