xref: /openbsd/sys/arch/hppa/include/atomic.h (revision 404b540a)
1 /*	$OpenBSD: atomic.h,v 1.3 2007/04/26 20:52:48 miod Exp $	*/
2 
3 /* Public Domain */
4 
5 #ifndef __HPPA_ATOMIC_H__
6 #define __HPPA_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 	register_t eiem;
14 
15 	__asm __volatile("mfctl	%%cr15, %0": "=r" (eiem));
16 	__asm __volatile("mtctl	%r0, %cr15");
17 	*uip |= v;
18 	__asm __volatile("mtctl	%0, %%cr15":: "r" (eiem));
19 }
20 
21 static __inline void
22 atomic_clearbits_int(__volatile unsigned int *uip, unsigned int v)
23 {
24 	register_t eiem;
25 
26 	__asm __volatile("mfctl	%%cr15, %0": "=r" (eiem));
27 	__asm __volatile("mtctl	%r0, %cr15");
28 	*uip &= ~v;
29 	__asm __volatile("mtctl	%0, %%cr15":: "r" (eiem));
30 }
31 
32 static __inline void
33 atomic_setbits_long(__volatile unsigned long *uip, unsigned long v)
34 {
35 	register_t eiem;
36 
37 	__asm __volatile("mfctl	%%cr15, %0": "=r" (eiem));
38 	__asm __volatile("mtctl	%r0, %cr15");
39 	*uip |= v;
40 	__asm __volatile("mtctl	%0, %%cr15":: "r" (eiem));
41 }
42 
43 static __inline void
44 atomic_clearbits_long(__volatile unsigned long *uip, unsigned long v)
45 {
46 	register_t eiem;
47 
48 	__asm __volatile("mfctl	%%cr15, %0": "=r" (eiem));
49 	__asm __volatile("mtctl	%r0, %cr15");
50 	*uip &= ~v;
51 	__asm __volatile("mtctl	%0, %%cr15":: "r" (eiem));
52 }
53 
54 #endif /* defined(_KERNEL) */
55 #endif /* __HPPA_ATOMIC_H__ */
56