diff options
author | Selim Gurun <sgurun@android.com> | 2014-02-21 15:11:18 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-02-21 15:11:19 +0000 |
commit | 6439e3e534d174ee99d2fe6f508dacff53afb86c (patch) | |
tree | 1beb97cb943610e95d206eb5b8258d4e678d4c9f | |
parent | f597ab50db1ba8dc44de336d27a21c044a625f39 (diff) | |
parent | 2b74e0e94ec552b2835015e96049d06eb920bd2b (diff) | |
download | chromium-6439e3e534d174ee99d2fe6f508dacff53afb86c.tar.gz |
Merge "AArch64: Add support for arm64"
-rw-r--r-- | base/atomicops.h | 2 | ||||
-rw-r--r-- | base/atomicops_internals_arm64_gcc.h | 140 | ||||
-rw-r--r-- | base/debug/debugger_posix.cc | 2 | ||||
-rw-r--r-- | base/third_party/nspr/prcpucfg_linux.h | 46 | ||||
-rw-r--r-- | build/build_config.h | 5 | ||||
-rw-r--r-- | net/base/file_stream_posix.cc | 2 | ||||
-rw-r--r-- | net/http/http_auth_handler_ntlm_portable.cc | 3 |
7 files changed, 198 insertions, 2 deletions
diff --git a/base/atomicops.h b/base/atomicops.h index ef7fc027..02a37105 100644 --- a/base/atomicops.h +++ b/base/atomicops.h @@ -141,6 +141,8 @@ Atomic64 Release_Load(volatile const Atomic64* ptr); #include "base/atomicops_internals_x86_gcc.h" #elif defined(COMPILER_GCC) && defined(ARCH_CPU_ARM_FAMILY) #include "base/atomicops_internals_arm_gcc.h" +#elif defined(COMPILER_GCC) && defined(ARCH_CPU_ARM64_FAMILY) +#include "base/atomicops_internals_arm64_gcc.h" #elif defined(COMPILER_GCC) && defined(ARCH_CPU_MIPS_FAMILY) #include "base/atomicops_internals_mips_gcc.h" #else diff --git a/base/atomicops_internals_arm64_gcc.h b/base/atomicops_internals_arm64_gcc.h new file mode 100644 index 00000000..e832b29e --- /dev/null +++ b/base/atomicops_internals_arm64_gcc.h @@ -0,0 +1,140 @@ +// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is an internal atomic implementation, use base/atomicops.h instead. +// +// LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. + +#ifndef BASE_ATOMICOPS_INTERNALS_ARM64_GCC_H_ +#define BASE_ATOMICOPS_INTERNALS_ARM64_GCC_H_ +#pragma once + +namespace base { +namespace subtle { + +#include <cutils/atomic-arm64.h> + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev_value = *ptr; + do { + if (!android_atomic_cas(old_value, new_value, + const_cast<Atomic32*>(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev_value = *ptr; + do { + if (!android_atomic_cas64(old_value, new_value, + const_cast<Atomic64*>(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 old_value; + do { + old_value = *ptr; + } while (android_atomic_cas(old_value, new_value, + const_cast<Atomic32*>(ptr))); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return Barrier_AtomicIncrement(ptr, increment); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + for (;;) { + // Atomic exchange the old value with an incremented one. + Atomic32 old_value = *ptr; + Atomic32 new_value = old_value + increment; + if (android_atomic_cas(old_value, new_value, + const_cast<Atomic32*>(ptr)) == 0) { + // The exchange took place as expected. + return new_value; + } + // Otherwise, *ptr changed mid-loop and we need to retry. + } + +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void MemoryBarrier() { + android_memory_barrier(); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +} // namespace base::subtle +} // namespace base + +#endif // BASE_ATOMICOPS_INTERNALS_ARM64_GCC_H_ diff --git a/base/debug/debugger_posix.cc b/base/debug/debugger_posix.cc index e7560a55..1711ecd4 100644 --- a/base/debug/debugger_posix.cc +++ b/base/debug/debugger_posix.cc @@ -169,6 +169,8 @@ bool BeingDebugged() { #define DEBUG_BREAK() abort() #elif defined(ARCH_CPU_ARM_FAMILY) #define DEBUG_BREAK() asm("bkpt 0") +#elif defined(ARCH_CPU_ARM64_FAMILY) +#define DEBUG_BREAK() __asm__ __volatile__ ("brk #0" : : ) #elif defined(ARCH_CPU_MIPS_FAMILY) #define DEBUG_BREAK() asm("break 2") #else diff --git a/base/third_party/nspr/prcpucfg_linux.h b/base/third_party/nspr/prcpucfg_linux.h index 776c21e0..2a6b66f3 100644 --- a/base/third_party/nspr/prcpucfg_linux.h +++ b/base/third_party/nspr/prcpucfg_linux.h @@ -509,6 +509,52 @@ #define PR_BYTES_PER_WORD_LOG2 2 #define PR_BYTES_PER_DWORD_LOG2 3 +#elif defined(__aarch64__) + +#define IS_LITTLE_ENDIAN 1 +#undef IS_BIG_ENDIAN +#define IS_64 + +#define PR_BYTES_PER_BYTE 1 +#define PR_BYTES_PER_SHORT 2 +#define PR_BYTES_PER_INT 4 +#define PR_BYTES_PER_INT64 8 +#define PR_BYTES_PER_LONG 8 +#define PR_BYTES_PER_FLOAT 4 +#define PR_BYTES_PER_DOUBLE 8 +#define PR_BYTES_PER_WORD 8 +#define PR_BYTES_PER_DWORD 8 + +#define PR_BITS_PER_BYTE 8 +#define PR_BITS_PER_SHORT 16 +#define PR_BITS_PER_INT 32 +#define PR_BITS_PER_INT64 64 +#define PR_BITS_PER_LONG 64 +#define PR_BITS_PER_FLOAT 32 +#define PR_BITS_PER_DOUBLE 64 +#define PR_BITS_PER_WORD 64 + +#define PR_BITS_PER_BYTE_LOG2 3 +#define PR_BITS_PER_SHORT_LOG2 4 +#define PR_BITS_PER_INT_LOG2 5 +#define PR_BITS_PER_INT64_LOG2 6 +#define PR_BITS_PER_LONG_LOG2 6 +#define PR_BITS_PER_FLOAT_LOG2 5 +#define PR_BITS_PER_DOUBLE_LOG2 6 +#define PR_BITS_PER_WORD_LOG2 6 + +#define PR_ALIGN_OF_SHORT 2 +#define PR_ALIGN_OF_INT 4 +#define PR_ALIGN_OF_LONG 8 +#define PR_ALIGN_OF_INT64 8 +#define PR_ALIGN_OF_FLOAT 4 +#define PR_ALIGN_OF_DOUBLE 8 +#define PR_ALIGN_OF_POINTER 8 +#define PR_ALIGN_OF_WORD 8 + +#define PR_BYTES_PER_WORD_LOG2 3 +#define PR_BYTES_PER_DWORD_LOG2 3 + #elif defined(__hppa__) #undef IS_LITTLE_ENDIAN diff --git a/build/build_config.h b/build/build_config.h index b17531d5..9cef8dfa 100644 --- a/build/build_config.h +++ b/build/build_config.h @@ -117,6 +117,11 @@ #define ARCH_CPU_ARMEL 1 #define ARCH_CPU_32_BITS 1 #define WCHAR_T_IS_UNSIGNED 1 +#elif defined(__aarch64__) +#define ARCH_CPU_ARM64_FAMILY 1 +#define ARCH_CPU_ARM64EL 1 +#define ARCH_CPU_64_BITS 1 +#define WCHAR_T_IS_UNSIGNED 1 #elif defined(__MIPSEL__) #define ARCH_CPU_MIPS_FAMILY 1 #define ARCH_CPU_MIPSEL 1 diff --git a/net/base/file_stream_posix.cc b/net/base/file_stream_posix.cc index 4c6e063f..29e48120 100644 --- a/net/base/file_stream_posix.cc +++ b/net/base/file_stream_posix.cc @@ -30,7 +30,7 @@ namespace net { // We cast back and forth, so make sure it's the size we're expecting. -#if defined(__BIONIC__) && defined(ANDROID) +#if defined(__BIONIC__) && defined(ANDROID) && !defined(__LP64__) COMPILE_ASSERT(sizeof(int32) == sizeof(off_t), off_t_32_bit); #else COMPILE_ASSERT(sizeof(int64) == sizeof(off_t), off_t_64_bit); diff --git a/net/http/http_auth_handler_ntlm_portable.cc b/net/http/http_auth_handler_ntlm_portable.cc index 5fa078d0..f63f4c36 100644 --- a/net/http/http_auth_handler_ntlm_portable.cc +++ b/net/http/http_auth_handler_ntlm_portable.cc @@ -71,7 +71,8 @@ namespace net { // Discover the endianness by testing processor architecture. #if defined(ARCH_CPU_X86) || defined(ARCH_CPU_X86_64)\ - || defined(ARCH_CPU_ARMEL) || defined(ARCH_CPU_MIPSEL) + || defined(ARCH_CPU_ARMEL) || defined(ARCH_CPU_ARM64EL)\ + || defined(ARCH_CPU_MIPSEL) #define IS_LITTLE_ENDIAN 1 #undef IS_BIG_ENDIAN #elif defined(ARCH_CPU_MIPSEB) |