xref: /haiku/headers/private/kernel/arch/arm/arch_atomic.h (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Alexander von Gluck IV <kallisti5@unixzen.com>
7  */
8 #ifndef _KERNEL_ARCH_ARM_ATOMIC_H
9 #define _KERNEL_ARCH_ARM_ATOMIC_H
10 
11 
12 #if __ARM_ARCH__ <= 5
13 #define isb() __asm__ __volatile__("" : : : "memory")
14 #define dsb() __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 4" \
15 	: : "r" (0) : "memory")
16 #define dmb() __asm__ __volatile__("" : : : "memory")
17 #elif __ARM_ARCH__ == 6
18 #define isb() __asm__ __volatile__("mcr p15, 0, %0, c7, c5, 4" \
19 	: : "r" (0) : "memory")
20 #define dsb() __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 4" \
21 	: : "r" (0) : "memory")
22 #define dmb() __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 5" \
23 	: : "r" (0) : "memory")
24 #else /* ARMv7+ */
25 #define isb() __asm__ __volatile__("isb" : : : "memory")
26 #define dsb() __asm__ __volatile__("dsb" : : : "memory")
27 #define dmb() __asm__ __volatile__("dmb" : : : "memory")
28 #endif
29 
30 
31 static inline void
32 memory_read_barrier_inline(void)
33 {
34 	dmb();
35 }
36 
37 
38 static inline void
39 memory_write_barrier_inline(void)
40 {
41 	dmb();
42 }
43 
44 
45 static inline void
46 memory_full_barrier_inline(void)
47 {
48 	dmb();
49 }
50 
51 
52 #define memory_read_barrier memory_read_barrier_inline
53 #define memory_write_barrier memory_write_barrier_inline
54 #define memory_full_barrier memory_full_barrier_inline
55 
56 
57 #endif	// _KERNEL_ARCH_ARM_ATOMIC_H
58