xref: /openbsd-src/sys/arch/mips64/include/atomic.h (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
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