xref: /openbsd-src/sys/arch/sh/include/atomic.h (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
1 /*	$OpenBSD: atomic.h,v 1.5 2014/03/29 18:09:30 guenther Exp $	*/
2 
3 /* Public Domain */
4 
5 #ifndef _SH_ATOMIC_H_
6 #define _SH_ATOMIC_H_
7 
8 #if defined(_KERNEL)
9 
10 #include <sh/psl.h>
11 
12 static __inline void
13 atomic_setbits_int(volatile unsigned int *uip, unsigned int v)
14 {
15 	unsigned int sr;
16 
17 	__asm__ volatile ("stc sr, %0" : "=r"(sr));
18 	__asm__ volatile ("ldc %0, sr" : : "r"(sr | PSL_IMASK));
19 	*uip |= v;
20 	__asm__ volatile ("ldc %0, sr" : : "r"(sr));
21 }
22 
23 static __inline void
24 atomic_clearbits_int(volatile unsigned int *uip, unsigned int v)
25 {
26 	unsigned int sr;
27 
28 	__asm__ volatile ("stc sr, %0" : "=r"(sr));
29 	__asm__ volatile ("ldc %0, sr" : : "r"(sr | PSL_IMASK));
30 	*uip &= ~v;
31 	__asm__ volatile ("ldc %0, sr" : : "r"(sr));
32 }
33 
34 #endif /* defined(_KERNEL) */
35 #endif /* _SH_ATOMIC_H_ */
36