From 72c02af6258db04bb858b3fe870333fe5d17a06f Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Wed, 16 Oct 2013 14:16:00 +0100 Subject: [PATCH] Basic arm64 support. Gbp-Pq: Name basic-arm64-support.diff --- config/opal_config_asm.m4 | 6 + opal/include/opal/sys/Makefile.am | 1 + opal/include/opal/sys/arm64/Makefile.am | 24 ++++ opal/include/opal/sys/arm64/atomic.h | 170 ++++++++++++++++++++++++ opal/include/opal/sys/arm64/timer.h | 33 +++++ opal/include/opal/sys/atomic.h | 2 + opal/include/opal/sys/timer.h | 2 + 7 files changed, 238 insertions(+) create mode 100644 opal/include/opal/sys/arm64/Makefile.am create mode 100644 opal/include/opal/sys/arm64/atomic.h create mode 100644 opal/include/opal/sys/arm64/timer.h diff --git a/config/opal_config_asm.m4 b/config/opal_config_asm.m4 index 19a64052..34fba986 100644 --- a/config/opal_config_asm.m4 +++ b/config/opal_config_asm.m4 @@ -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 diff --git a/opal/include/opal/sys/Makefile.am b/opal/include/opal/sys/Makefile.am index 01985a9b..8b66ab46 100644 --- a/opal/include/opal/sys/Makefile.am +++ b/opal/include/opal/sys/Makefile.am @@ -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 index 00000000..5cfbc8d5 --- /dev/null +++ b/opal/include/opal/sys/arm64/Makefile.am @@ -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 index 00000000..3a618064 --- /dev/null +++ b/opal/include/opal/sys/arm64/atomic.h @@ -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 index 00000000..646f974a --- /dev/null +++ b/opal/include/opal/sys/arm64/timer.h @@ -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 + +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 */ diff --git a/opal/include/opal/sys/atomic.h b/opal/include/opal/sys/atomic.h index 2a273722..3c2745cb 100644 --- a/opal/include/opal/sys/atomic.h +++ b/opal/include/opal/sys/atomic.h @@ -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 diff --git a/opal/include/opal/sys/timer.h b/opal/include/opal/sys/timer.h index fe97aef3..3d9587ce 100644 --- a/opal/include/opal/sys/timer.h +++ b/opal/include/opal/sys/timer.h @@ -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 -- 2.30.2