1 /* $OpenBSD: atomic.h,v 1.3 2007/03/23 21:07:36 miod Exp $ */ 2 3 /* Public Domain */ 4 5 #ifndef __MIPS64_ATOMIC_H__ 6 #define __MIPS64_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: ll %0, 0(%1)\n" 17 " or %0, %2, %0\n" 18 " sc %0, 0(%1)\n" 19 " beqz %0, 1b\n" 20 " nop\n" : 21 "+r"(tmp) : 22 "r"(uip), "r"(v) : "memory"); 23 } 24 25 static __inline void 26 atomic_clearbits_int(__volatile unsigned int *uip, unsigned int v) 27 { 28 unsigned int tmp; 29 30 __asm__ __volatile__ ( 31 "1: ll %0, 0(%1)\n" 32 " and %0, %2, %0\n" 33 " sc %0, 0(%1)\n" 34 " beqz %0, 1b\n" 35 " nop\n" : 36 "+r"(tmp) : 37 "r"(uip), "r"(~v) : "memory"); 38 } 39 40 #endif /* defined(_KERNEL) */ 41 #endif /* __MIPS64_ATOMIC_H__ */ 42