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