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"

Reply via email to