Basic arm64 support.
authorLeif Lindholm <leif.lindholm@linaro.org>
Wed, 16 Oct 2013 13:16:00 +0000 (14:16 +0100)
committerAlastair McKinstry <mckinstry@debian.org>
Fri, 21 Oct 2016 18:01:25 +0000 (18:01 +0000)
Gbp-Pq: Name basic-arm64-support.diff

config/opal_config_asm.m4
opal/include/opal/sys/Makefile.am
opal/include/opal/sys/arm64/Makefile.am [new file with mode: 0644]
opal/include/opal/sys/arm64/atomic.h [new file with mode: 0644]
opal/include/opal/sys/arm64/timer.h [new file with mode: 0644]
opal/include/opal/sys/atomic.h
opal/include/opal/sys/timer.h

index 19a64052377063d03901b08f6582722d8225348c..34fba986b2ba62f12725522d789a99bb04e0c754 100644 (file)
@@ -916,6 +916,12 @@ AC_DEFUN([OPAL_CONFIG_ASM],[
             OPAL_GCC_INLINE_ASSIGN='"mov %0=r0\n;;\n" : "=&r"(ret)'
             ;;
 
+        aarch64*)
+            opal_cv_asm_arch="ARM64"
+            OPAL_ASM_SUPPORT_64BIT=1
+           OPAL_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
+            ;;
+
         armv7*)
             opal_cv_asm_arch="ARM"
             OPAL_ASM_SUPPORT_64BIT=1
index 01985a9badcf839128b7662bb7371a4b905deca1..8b66ab467e45cb3f73e575e6b0cc864895bc50c7 100644 (file)
@@ -29,6 +29,7 @@ headers += \
 
 include opal/sys/amd64/Makefile.am
 include opal/sys/arm/Makefile.am
+include opal/sys/arm64/Makefile.am
 include opal/sys/ia32/Makefile.am
 include opal/sys/ia64/Makefile.am
 include opal/sys/mips/Makefile.am
diff --git a/opal/include/opal/sys/arm64/Makefile.am b/opal/include/opal/sys/arm64/Makefile.am
new file mode 100644 (file)
index 0000000..5cfbc8d
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+#                         University Research and Technology
+#                         Corporation.  All rights reserved.
+# Copyright (c) 2004-2008 The University of Tennessee and The University
+#                         of Tennessee Research Foundation.  All rights
+#                         reserved.
+# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
+#                         University of Stuttgart.  All rights reserved.
+# Copyright (c) 2004-2005 The Regents of the University of California.
+#                         All rights reserved.
+# $COPYRIGHT$
+# 
+# Additional copyrights may follow
+# 
+# $HEADER$
+#
+
+# This makefile.am does not stand on its own - it is included from opal/include/Makefile.am
+
+headers += \
+       opal/sys/arm64/atomic.h \
+       opal/sys/arm64/timer.h
+
diff --git a/opal/include/opal/sys/arm64/atomic.h b/opal/include/opal/sys/arm64/atomic.h
new file mode 100644 (file)
index 0000000..3a61806
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2005 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2010      IBM Corporation.  All rights reserved.
+ * Copyright (c) 2010      ARM ltd.  All rights reserved.
+ * Copyright (c) 2013      Linaro ltd.  All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#ifndef OPAL_SYS_ARCH_ATOMIC_H
+#define OPAL_SYS_ARCH_ATOMIC_H 1
+
+
+#define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
+
+#define MB()  __asm__ __volatile__ ("dmb ish" : : : "memory")
+#define RMB() __asm__ __volatile__ ("dmb ish" : : : "memory")
+#define WMB() __asm__ __volatile__ ("dmb ish" : : : "memory")
+
+
+/**********************************************************************
+ *
+ * Memory Barriers
+ *
+ *********************************************************************/
+
+#if OPAL_GCC_INLINE_ASSEMBLY
+
+static inline
+void opal_atomic_mb(void)
+{
+    MB();
+}
+
+
+static inline
+void opal_atomic_rmb(void)
+{
+    RMB();
+}
+
+
+static inline
+void opal_atomic_wmb(void)
+{
+    WMB();
+}
+
+#else
+
+static inline
+void opal_atomic_mb(void) {}
+
+static inline
+void opal_atomic_rmb(void){}
+
+static inline
+void opal_atomic_wmb(void) {}
+
+#endif
+
+
+/**********************************************************************
+ *
+ * Atomic math operations
+ *
+ *********************************************************************/
+
+#define OPAL_HAVE_ATOMIC_CMPSET_32 1
+static inline int opal_atomic_cmpset_32(volatile int32_t *addr,
+                                        int32_t oldval, int32_t newval)
+{
+  int32_t ret;
+  int32_t tmp;
+
+   __asm__ __volatile__ (
+                         "1:  ldxr   %w0, [%2]        \n"
+                         "    cmp    %w0, %w3          \n"
+                         "    bne    2f              \n"
+                         "    stxr   %w1, %w4, [%2]    \n"
+                         "    cmp    %w1, #0          \n"
+                         "    bne    1b              \n"
+                         "2:                          \n"
+
+                         : "=&r" (ret), "=&r" (tmp)
+                         : "r" (addr), "r" (oldval), "r" (newval)
+                         : "cc", "memory");
+
+   return (ret == oldval);
+}
+
+static inline int opal_atomic_cmpset_acq_32(volatile int32_t *addr,
+                                            int32_t oldval, int32_t newval)
+{
+    int rc;
+
+    rc = opal_atomic_cmpset_32(addr, oldval, newval);
+    opal_atomic_rmb();
+
+    return rc;
+}
+
+
+static inline int opal_atomic_cmpset_rel_32(volatile int32_t *addr,
+                                            int32_t oldval, int32_t newval)
+{
+    opal_atomic_wmb();
+    return opal_atomic_cmpset_32(addr, oldval, newval);
+}
+
+#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+static inline int opal_atomic_cmpset_64(volatile int64_t *addr,
+                                        int64_t oldval, int64_t newval)
+{
+  int64_t ret;
+  int32_t tmp;
+
+   __asm__ __volatile__ (
+                         "1:  ldxr   %0, [%2]        \n"
+                         "    cmp    %0, %3          \n"
+                         "    bne    2f              \n"
+                         "    stxr   %w1, %4, [%2]   \n"
+                         "    cmp    %w1, #0         \n"
+                         "    bne    1b              \n"
+                         "2:                         \n"
+
+                         : "=&r" (ret), "=&r" (tmp)
+                         : "r" (addr), "r" (oldval), "r" (newval)
+                         : "cc", "memory");
+
+   return (ret == oldval);
+}
+
+/* these two functions aren't inlined in the non-gcc case because then
+   there would be two function calls (since neither cmpset_64 nor
+   atomic_?mb can be inlined).  Instead, we "inline" them by hand in
+   the assembly, meaning there is one function call overhead instead
+   of two */
+static inline int opal_atomic_cmpset_acq_64(volatile int64_t *addr,
+                                            int64_t oldval, int64_t newval)
+{
+    int rc;
+
+    rc = opal_atomic_cmpset_64(addr, oldval, newval);
+    opal_atomic_rmb();
+
+    return rc;
+}
+
+
+static inline int opal_atomic_cmpset_rel_64(volatile int64_t *addr,
+                                            int64_t oldval, int64_t newval)
+{
+    opal_atomic_wmb();
+    return opal_atomic_cmpset_64(addr, oldval, newval);
+}
+
+#endif /* ! OPAL_SYS_ARCH_ATOMIC_H */
diff --git a/opal/include/opal/sys/arm64/timer.h b/opal/include/opal/sys/arm64/timer.h
new file mode 100644 (file)
index 0000000..646f974
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2008      The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * $COPYRIGHT$
+ * 
+ * Additional copyrights may follow
+ * 
+ * $HEADER$
+ */
+
+#ifndef OPAL_SYS_ARCH_TIMER_H
+#define OPAL_SYS_ARCH_TIMER_H 1
+
+#include <sys/times.h>
+
+typedef uint64_t opal_timer_t;
+
+static inline opal_timer_t
+opal_sys_timer_get_cycles(void)
+{
+    opal_timer_t ret;
+    struct tms accurate_clock;
+
+    times(&accurate_clock);
+    ret = accurate_clock.tms_utime + accurate_clock.tms_stime;
+
+    return ret;
+}
+
+#define OPAL_HAVE_SYS_TIMER_GET_CYCLES 1
+
+#endif /* ! OPAL_SYS_ARCH_TIMER_H */
index 2a273722878125218bee5f7883dcc7f31e35e306..3c2745cbccb638d857040ec6ca7c002cffb07d74 100644 (file)
@@ -145,6 +145,8 @@ typedef struct opal_atomic_lock_t opal_atomic_lock_t;
 #include "opal/sys/osx/atomic.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_AMD64
 #include "opal/sys/amd64/atomic.h"
+#elif OPAL_ASSEMBLY_ARCH == OPAL_ARM64
+#include "opal/sys/arm64/atomic.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_ARM
 #include "opal/sys/arm/atomic.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_IA32
index fe97aef3ef956477635cdadaac590bcb449d1fa4..3d9587ced50f7176ea1b8f78b7e3e558ae1479b8 100644 (file)
@@ -84,6 +84,8 @@ BEGIN_C_DECLS
 #include "opal/sys/amd64/timer.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_ARM
 #include "opal/sys/arm/timer.h"
+#elif OPAL_ASSEMBLY_ARCH == OPAL_ARM64
+#include "opal/sys/arm64/timer.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_IA32
 #include "opal/sys/ia32/timer.h"
 #elif OPAL_ASSEMBLY_ARCH == OPAL_IA64