xref: /openbsd-src/sys/arch/powerpc/include/atomic.h (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
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