1 /* $OpenBSD: atomic.h,v 1.7 2014/06/19 11:29:21 kettenis Exp $ */ 2 3 /* Public Domain */ 4 5 #ifndef _POWERPC_ATOMIC_H_ 6 #define _POWERPC_ATOMIC_H_ 7 8 #if defined(_KERNEL) 9 10 static __inline void 11 atomic_setbits_int(volatile unsigned int *uip, unsigned int v) 12 { 13 unsigned int tmp; 14 15 __asm volatile ( 16 "1: lwarx %0, 0, %2 \n" 17 " or %0, %1, %0 \n" 18 " stwcx. %0, 0, %2 \n" 19 " bne- 1b \n" 20 " sync" : "=&r" (tmp) : "r" (v), "r" (uip) : "cc", "memory"); 21 } 22 23 static __inline void 24 atomic_clearbits_int(volatile unsigned int *uip, unsigned int v) 25 { 26 unsigned int tmp; 27 28 __asm volatile ( 29 "1: lwarx %0, 0, %2 \n" 30 " andc %0, %0, %1 \n" 31 " stwcx. %0, 0, %2 \n" 32 " bne- 1b \n" 33 " sync" : "=&r" (tmp) : "r" (v), "r" (uip) : "cc", "memory"); 34 } 35 36 #define __membar(_f) do { __asm __volatile(_f ::: "memory"); } while (0) 37 38 #ifdef MULTIPROCESSOR 39 #define membar_enter() __membar("isync") 40 #define membar_exit() __membar("sync") 41 #define membar_producer() __membar("sync") 42 #define membar_consumer() __membar("isync") 43 #define membar_sync() __membar("sync") 44 #else 45 #define membar_enter() __membar("") 46 #define membar_exit() __membar("") 47 #define membar_producer() __membar("") 48 #define membar_consumer() __membar("") 49 #define membar_sync() __membar("") 50 #endif 51 52 #endif /* defined(_KERNEL) */ 53 #endif /* _POWERPC_ATOMIC_H_ */ 54