1#ifndef __ARCH_I386_ATOMIC__
2#define __ARCH_I386_ATOMIC__
3
4#include <linux/config.h>
5
6
7
8
9
10
11#ifdef CONFIG_SMP
12#define LOCK "lock ; "
13#else
14#define LOCK ""
15#endif
16
17
18
19
20
21
22typedef struct { volatile int counter; } atomic_t;
23
24#define ATOMIC_INIT(i) { (i) }
25
26
27
28
29
30
31
32#define atomic_read(v) ((v)->counter)
33
34
35
36
37
38
39
40
41#define atomic_set(v,i) (((v)->counter) = (i))
42
43
44
45
46
47
48
49
50static __inline__ void atomic_add(int i, atomic_t *v)
51{
52 __asm__ __volatile__(
53 LOCK "addl %1,%0"
54 :"=m" (v->counter)
55 :"ir" (i), "m" (v->counter));
56}
57
58
59
60
61
62
63
64
65static __inline__ void atomic_sub(int i, atomic_t *v)
66{
67 __asm__ __volatile__(
68 LOCK "subl %1,%0"
69 :"=m" (v->counter)
70 :"ir" (i), "m" (v->counter));
71}
72
73
74
75
76
77
78
79
80
81
82static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
83{
84 unsigned char c;
85
86 __asm__ __volatile__(
87 LOCK "subl %2,%0; sete %1"
88 :"=m" (v->counter), "=qm" (c)
89 :"ir" (i), "m" (v->counter) : "memory");
90 return c;
91}
92
93
94
95
96
97
98
99static __inline__ void atomic_inc(atomic_t *v)
100{
101 __asm__ __volatile__(
102 LOCK "incl %0"
103 :"=m" (v->counter)
104 :"m" (v->counter));
105}
106
107
108
109
110
111
112
113static __inline__ void atomic_dec(atomic_t *v)
114{
115 __asm__ __volatile__(
116 LOCK "decl %0"
117 :"=m" (v->counter)
118 :"m" (v->counter));
119}
120
121
122
123
124
125
126
127
128
129static __inline__ int atomic_dec_and_test(atomic_t *v)
130{
131 unsigned char c;
132
133 __asm__ __volatile__(
134 LOCK "decl %0; sete %1"
135 :"=m" (v->counter), "=qm" (c)
136 :"m" (v->counter) : "memory");
137 return c != 0;
138}
139
140
141
142
143
144
145
146
147
148static __inline__ int atomic_inc_and_test(atomic_t *v)
149{
150 unsigned char c;
151
152 __asm__ __volatile__(
153 LOCK "incl %0; sete %1"
154 :"=m" (v->counter), "=qm" (c)
155 :"m" (v->counter) : "memory");
156 return c != 0;
157}
158
159
160
161
162
163
164
165
166
167
168static __inline__ int atomic_add_negative(int i, atomic_t *v)
169{
170 unsigned char c;
171
172 __asm__ __volatile__(
173 LOCK "addl %2,%0; sets %1"
174 :"=m" (v->counter), "=qm" (c)
175 :"ir" (i), "m" (v->counter) : "memory");
176 return c;
177}
178
179
180#define atomic_clear_mask(mask, addr) \
181__asm__ __volatile__(LOCK "andl %0,%1" \
182: : "r" (~(mask)),"m" (*addr) : "memory")
183
184#define atomic_set_mask(mask, addr) \
185__asm__ __volatile__(LOCK "orl %0,%1" \
186: : "r" (mask),"m" (*(addr)) : "memory")
187
188
189#define smp_mb__before_atomic_dec() barrier()
190#define smp_mb__after_atomic_dec() barrier()
191#define smp_mb__before_atomic_inc() barrier()
192#define smp_mb__after_atomic_inc() barrier()
193
194#endif
195