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