1 /* $OpenBSD: atomic.h,v 1.4 2011/03/23 16:54:36 pirofti 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