1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * The header provides default implementations for every xen/atomic.h-provided
4  * forward inline declaration that can be synthesized from other atomic
5  * functions or being created from scratch.
6  */
7 #ifndef _ASM_GENERIC_ATOMIC_OPS_H_
8 #define _ASM_GENERIC_ATOMIC_OPS_H_
9 
10 #include <xen/atomic.h>
11 #include <xen/lib.h>
12 
13 #ifndef ATOMIC_READ
atomic_read(const atomic_t * v)14 static inline int atomic_read(const atomic_t *v)
15 {
16     return ACCESS_ONCE(v->counter);
17 }
18 #endif
19 
20 #ifndef _ATOMIC_READ
_atomic_read(atomic_t v)21 static inline int _atomic_read(atomic_t v)
22 {
23     return v.counter;
24 }
25 #endif
26 
27 #ifndef ATOMIC_SET
atomic_set(atomic_t * v,int i)28 static inline void atomic_set(atomic_t *v, int i)
29 {
30     ACCESS_ONCE(v->counter) = i;
31 }
32 #endif
33 
34 #ifndef _ATOMIC_SET
_atomic_set(atomic_t * v,int i)35 static inline void _atomic_set(atomic_t *v, int i)
36 {
37     v->counter = i;
38 }
39 #endif
40 
41 #ifndef ATOMIC_SUB_AND_TEST
atomic_sub_and_test(int i,atomic_t * v)42 static inline int atomic_sub_and_test(int i, atomic_t *v)
43 {
44     return atomic_sub_return(i, v) == 0;
45 }
46 #endif
47 
48 #ifndef ATOMIC_INC_AND_TEST
atomic_inc_and_test(atomic_t * v)49 static inline int atomic_inc_and_test(atomic_t *v)
50 {
51     return atomic_add_return(1, v) == 0;
52 }
53 #endif
54 
55 #ifndef ATOMIC_INC
atomic_inc(atomic_t * v)56 static inline void atomic_inc(atomic_t *v)
57 {
58     atomic_add(1, v);
59 }
60 #endif
61 
62 #ifndef ATOMIC_INC_RETURN
atomic_inc_return(atomic_t * v)63 static inline int atomic_inc_return(atomic_t *v)
64 {
65     return atomic_add_return(1, v);
66 }
67 #endif
68 
69 #ifndef ATOMIC_DEC
atomic_dec(atomic_t * v)70 static inline void atomic_dec(atomic_t *v)
71 {
72     atomic_sub(1, v);
73 }
74 #endif
75 
76 #ifndef ATOMIC_DEC_RETURN
atomic_dec_return(atomic_t * v)77 static inline int atomic_dec_return(atomic_t *v)
78 {
79     return atomic_sub_return(1, v);
80 }
81 #endif
82 
83 #ifndef ATOMIC_DEC_AND_TEST
atomic_dec_and_test(atomic_t * v)84 static inline int atomic_dec_and_test(atomic_t *v)
85 {
86     return atomic_sub_return(1, v) == 0;
87 }
88 #endif
89 
90 #ifndef ATOMIC_ADD_NEGATIVE
atomic_add_negative(int i,atomic_t * v)91 static inline int atomic_add_negative(int i, atomic_t *v)
92 {
93     return atomic_add_return(i, v) < 0;
94 }
95 #endif
96 
97 #endif /* _ASM_GENERIC_ATOMIC_OPS_H_ */
98