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