diff --git a/headers/private/kernel/arch/arm/arch_atomic.h b/headers/private/kernel/arch/arm/arch_atomic.h index db12cadd5d..50b4bb791d 100644 --- a/headers/private/kernel/arch/arm/arch_atomic.h +++ b/headers/private/kernel/arch/arm/arch_atomic.h @@ -9,29 +9,41 @@ #define _KERNEL_ARCH_ARM_ATOMIC_H +#if __ARM_ARCH__ <= 6 +#define dsb() __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 4" \ + : : "r" (0) : "memory") +#define dmb() __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 4" \ + : : "r" (0) : "memory") +#else +#define dsb() __asm__ __volatile__("dsb" : : : "memory") +#define dmb() __asm__ __volatile__("dmb" : : : "memory") +#endif + + static inline void memory_read_barrier_inline(void) { - asm volatile ("":::"memory"); + dmb(); } static inline void memory_write_barrier_inline(void) { - asm volatile ("":::"memory"); + dmb(); } static inline void memory_full_barrier_inline(void) { - asm volatile ("":::"memory"); + dmb(); } -#define memory_read_barrier memory_read_barrier_inline -#define memory_write_barrier memory_write_barrier_inline -#define memory_full_barrier memory_full_barrier_inline +#define memory_read_barrier memory_read_barrier_inline +#define memory_write_barrier memory_write_barrier_inline +#define memory_full_barrier memory_full_barrier_inline + #endif // _KERNEL_ARCH_ARM_ATOMIC_H diff --git a/src/system/libroot/os/arch/arm/atomic.S b/src/system/libroot/os/arch/arm/atomic.S index 31068b2802..5728e5cef1 100644 --- a/src/system/libroot/os/arch/arm/atomic.S +++ b/src/system/libroot/os/arch/arm/atomic.S @@ -6,6 +6,7 @@ #include #include + .text #ifndef ATOMIC_FUNCS_ARE_SYSCALLS @@ -22,9 +23,6 @@ miss1: ldrex r12, [r0] bx lr FUNCTION_END(atomic_add) - - - /* int atomic_and(int *value, int andValue) */ FUNCTION(atomic_and): @@ -88,13 +86,6 @@ FUNCTION(atomic_get): bx lr FUNCTION_END(atomic_get) -/* void __sync_synchronize(void) - */ -FUNCTION(__sync_synchronize): - dmb - bx lr -FUNCTION_END(__sync_synchronize) - #endif /* ATOMIC_FUNCS_ARE_SYSCALLS */ #ifndef ATOMIC64_FUNCS_ARE_SYSCALLS diff --git a/src/system/libroot/os/arch/arm/thread.c b/src/system/libroot/os/arch/arm/thread.c index df90b6ad6a..cb233d4147 100644 --- a/src/system/libroot/os/arch/arm/thread.c +++ b/src/system/libroot/os/arch/arm/thread.c @@ -1,4 +1,16 @@ +/* + * Copyright 2012-2014, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Jerome Duval + * Alexander von Gluck IV + */ + + #include + +#include #include "syscalls.h" @@ -7,3 +19,13 @@ find_thread(const char *name) { return _kern_find_thread(name); } + + +/* + * Fill out gcc __sync_synchronize built-in for ARM + */ +void +__sync_synchronize(void) +{ + dsb(); +}