[haiku-commits] haiku: hrev52451 - in src/system/boot/platform/efi/arch: aarch64 arm src/system/boot/platform/efi x86_64

  • From: kallisti5@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 28 Oct 2018 17:44:01 -0400 (EDT)

hrev52451 adds 1 changeset to branch 'master'
old head: 8ff74b67d4a034308345e3fb9bc91a5da6e16235
new head: 8ee963f940fa98fe7dc0364a2b0fb1ab927fc811
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=8ee963f940fa+%5E8ff74b67d4a0

----------------------------------------------------------------------------

8ee963f940fa: efi: Begin sorting x86_64 to arch subfolder
  
  Change-Id: I0b724c05d527332fb6a5f4909b44d578ae1c6d0e

                          [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev52451
Commit:      8ee963f940fa98fe7dc0364a2b0fb1ab927fc811
URL:         https://git.haiku-os.org/haiku/commit/?id=8ee963f940fa
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Sun Oct 28 21:42:10 2018 UTC

----------------------------------------------------------------------------

4 files changed, 201 insertions(+), 5 deletions(-)
src/system/boot/platform/efi/Jamfile             | 10 +-
.../efi/arch/aarch64/relocation_func.cpp         | 97 ++++++++++++++++++++
.../platform/efi/arch/arm/relocation_func.cpp    | 97 ++++++++++++++++++++
.../boot/platform/efi/{ => arch/x86_64}/entry.S  |  2 -

----------------------------------------------------------------------------

diff --git a/src/system/boot/platform/efi/Jamfile 
b/src/system/boot/platform/efi/Jamfile
index f676f889fd..05001a2357 100644
--- a/src/system/boot/platform/efi/Jamfile
+++ b/src/system/boot/platform/efi/Jamfile
@@ -18,12 +18,10 @@ local efi_glue_src =
        ;
 
 local platform_src =
-       relocation_func.cpp
        start.cpp
        console.cpp
        video.cpp
        debug.cpp
-       entry.S
        mmu.cpp
        heap.cpp
        acpi.cpp
@@ -37,6 +35,11 @@ local platform_src =
        support.S
        ;
 
+local arch_src =
+       relocation_func.cpp
+       entry.S
+       ;
+
 Includes [ FGristFiles $(efi_glue_src) $(platform_src) ]
        :
        [ BuildFeatureAttribute gnuefi : headers ]
@@ -51,11 +54,12 @@ for platform in [ MultiBootSubDirSetup efi ] {
                BootMergeObject boot_platform_efi.o :
                        $(efi_glue_src)
                        $(platform_src)
+                       $(arch_src)
                        :
                        : boot_platform_generic_efi.a
                ;
 
-               SEARCH on [ FGristFiles relocation_func.cpp ]
+               SEARCH on [ FGristFiles $(arch_src) ]
                        = [ FDirName $(SUBDIR) arch $(TARGET_ARCH) ] ;
                LOCATE on [ FGristFiles $(efi_glue_src) ]
                        = [ BuildFeatureAttribute gnuefi : libdir : path ] ;
diff --git a/src/system/boot/platform/efi/arch/aarch64/relocation_func.cpp 
b/src/system/boot/platform/efi/arch/aarch64/relocation_func.cpp
new file mode 100644
index 0000000000..086727961c
--- /dev/null
+++ b/src/system/boot/platform/efi/arch/aarch64/relocation_func.cpp
@@ -0,0 +1,97 @@
+/* reloc_aarch64.c - position independent x86 ELF shared object relocator
+   Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@xxxxxxxxxx>
+   Copyright (C) 1999 Hewlett-Packard Co.
+       Contributed by David Mosberger <davidm@xxxxxxxxxx>.
+
+    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 <efilib.h>
+
+#include <elf.h>
+
+EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn,
+                     EFI_HANDLE image EFI_UNUSED,
+                     EFI_SYSTEM_TABLE *systab EFI_UNUSED)
+{
+       long relsz = 0, relent = 0;
+       Elf64_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 = (Elf64_Rela*)
+                                       ((unsigned long)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 (ELF64_R_TYPE (rel->r_info)) {
+                       case R_AARCH64_NONE:
+                               break;
+
+                       case R_AARCH64_RELATIVE:
+                               addr = (unsigned long *)
+                                       (ldbase + rel->r_offset);
+                               *addr = ldbase + rel->r_addend;
+                               break;
+
+                       default:
+                               break;
+               }
+               rel = (Elf64_Rela*) ((char *) rel + relent);
+               relsz -= relent;
+       }
+       return EFI_SUCCESS;
+}
diff --git a/src/system/boot/platform/efi/arch/arm/relocation_func.cpp 
b/src/system/boot/platform/efi/arch/arm/relocation_func.cpp
new file mode 100644
index 0000000000..7585066695
--- /dev/null
+++ b/src/system/boot/platform/efi/arch/arm/relocation_func.cpp
@@ -0,0 +1,97 @@
+/* reloc_arm.c - position independent x86 ELF shared object relocator
+   Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@xxxxxxxxxx>
+   Copyright (C) 1999 Hewlett-Packard Co.
+       Contributed by David Mosberger <davidm@xxxxxxxxxx>.
+
+    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 <efilib.h>
+
+#include <elf.h>
+
+EFI_STATUS _relocate (long ldbase, Elf32_Dyn *dyn,
+                     EFI_HANDLE image EFI_UNUSED,
+                     EFI_SYSTEM_TABLE *systab EFI_UNUSED)
+{
+       long relsz = 0, relent = 0;
+       Elf32_Rel *rel = 0;
+       unsigned long *addr;
+       int i;
+
+       for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
+               switch (dyn[i].d_tag) {
+                       case DT_REL:
+                               rel = (Elf32_Rel*)
+                                       ((unsigned long)dyn[i].d_un.d_ptr
+                                        + ldbase);
+                               break;
+
+                       case DT_RELSZ:
+                               relsz = dyn[i].d_un.d_val;
+                               break;
+
+                       case DT_RELENT:
+                               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 (ELF32_R_TYPE (rel->r_info)) {
+                       case R_ARM_NONE:
+                               break;
+
+                       case R_ARM_RELATIVE:
+                               addr = (unsigned long *)
+                                       (ldbase + rel->r_offset);
+                               *addr += ldbase;
+                               break;
+
+                       default:
+                               break;
+               }
+               rel = (Elf32_Rel*) ((char *) rel + relent);
+               relsz -= relent;
+       }
+       return EFI_SUCCESS;
+}
diff --git a/src/system/boot/platform/efi/entry.S 
b/src/system/boot/platform/efi/arch/x86_64/entry.S
similarity index 97%
rename from src/system/boot/platform/efi/entry.S
rename to src/system/boot/platform/efi/arch/x86_64/entry.S
index 75717080d8..0d874e3b6e 100644
--- a/src/system/boot/platform/efi/entry.S
+++ b/src/system/boot/platform/efi/arch/x86_64/entry.S
@@ -7,11 +7,9 @@
 
 #include <asm_defs.h>
 
-#define __x86_64__
 #include <arch/x86/descriptors.h>
 
 #include "mmu.h"
-#undef __x86_64__
 
 
 #define GDT_LIMIT 0x800


Other related posts:

  • » [haiku-commits] haiku: hrev52451 - in src/system/boot/platform/efi/arch: aarch64 arm src/system/boot/platform/efi x86_64 - kallisti5