ARM: Add ARMv6 or older __sync_synchronize built-in

* On ARMv6 or older, we do a simulated dsb.
* Move __sync_synchronize into thread.c in libroot
  and use the new arch_atomic.h dsb/dmb defines.
* Gets arm @bootstrap-raw to end of bootstrap.
This commit is contained in:
Alexander von Gluck IV
2014-02-26 12:51:51 -06:00
parent cb7de03cca
commit a21611e439
3 changed files with 41 additions and 16 deletions
+15 -3
View File
@@ -9,24 +9,35 @@
#define _KERNEL_ARCH_ARM_ATOMIC_H #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 static inline void
memory_read_barrier_inline(void) memory_read_barrier_inline(void)
{ {
asm volatile ("":::"memory"); dmb();
} }
static inline void static inline void
memory_write_barrier_inline(void) memory_write_barrier_inline(void)
{ {
asm volatile ("":::"memory"); dmb();
} }
static inline void static inline void
memory_full_barrier_inline(void) memory_full_barrier_inline(void)
{ {
asm volatile ("":::"memory"); dmb();
} }
@@ -34,4 +45,5 @@ memory_full_barrier_inline(void)
#define memory_write_barrier memory_write_barrier_inline #define memory_write_barrier memory_write_barrier_inline
#define memory_full_barrier memory_full_barrier_inline #define memory_full_barrier memory_full_barrier_inline
#endif // _KERNEL_ARCH_ARM_ATOMIC_H #endif // _KERNEL_ARCH_ARM_ATOMIC_H
+1 -10
View File
@@ -6,6 +6,7 @@
#include <asm_defs.h> #include <asm_defs.h>
#include <arch_config.h> #include <arch_config.h>
.text .text
#ifndef ATOMIC_FUNCS_ARE_SYSCALLS #ifndef ATOMIC_FUNCS_ARE_SYSCALLS
@@ -22,9 +23,6 @@ miss1: ldrex r12, [r0]
bx lr bx lr
FUNCTION_END(atomic_add) FUNCTION_END(atomic_add)
/* int atomic_and(int *value, int andValue) /* int atomic_and(int *value, int andValue)
*/ */
FUNCTION(atomic_and): FUNCTION(atomic_and):
@@ -88,13 +86,6 @@ FUNCTION(atomic_get):
bx lr bx lr
FUNCTION_END(atomic_get) FUNCTION_END(atomic_get)
/* void __sync_synchronize(void)
*/
FUNCTION(__sync_synchronize):
dmb
bx lr
FUNCTION_END(__sync_synchronize)
#endif /* ATOMIC_FUNCS_ARE_SYSCALLS */ #endif /* ATOMIC_FUNCS_ARE_SYSCALLS */
#ifndef ATOMIC64_FUNCS_ARE_SYSCALLS #ifndef ATOMIC64_FUNCS_ARE_SYSCALLS
+22
View File
@@ -1,4 +1,16 @@
/*
* Copyright 2012-2014, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Jerome Duval <[email protected]>
* Alexander von Gluck IV <[email protected]>
*/
#include <OS.h> #include <OS.h>
#include <arch_atomic.h>
#include "syscalls.h" #include "syscalls.h"
@@ -7,3 +19,13 @@ find_thread(const char *name)
{ {
return _kern_find_thread(name); return _kern_find_thread(name);
} }
/*
* Fill out gcc __sync_synchronize built-in for ARM
*/
void
__sync_synchronize(void)
{
dsb();
}