xref: /openbsd/sys/arch/sh/include/atomic.h (revision 404b540a)
1 /*	$OpenBSD: atomic.h,v 1.3 2007/04/05 17:35:11 miod 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