source: rtems-libbsd/rtemsbsd/include/machine/atomic.h @ e684326

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since e684326 was e684326, checked in by Sebastian Huber <sebastian.huber@…>, on 02/13/15 at 11:49:57

Change license to BSD

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup rtems_bsd_machine
5 *
6 * @brief TODO.
7 */
8
9/*
10 * Copyright (c) 2009, 2010 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Dornierstr. 4
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
20 * are met:
21 * 1. Redistributions of source code must retain the above copyright
22 *    notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 *    notice, this list of conditions and the following disclaimer in the
25 *    documentation and/or other materials provided with the distribution.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 */
39
40#ifndef _RTEMS_BSD_MACHINE_ATOMIC_H_
41#define _RTEMS_BSD_MACHINE_ATOMIC_H_
42
43#ifndef _RTEMS_BSD_MACHINE_RTEMS_BSD_KERNEL_SPACE_H_
44#error "the header file <machine/rtems-bsd-kernel-space.h> must be included first"
45#endif
46
47#include <rtems.h>
48
49#define mb() RTEMS_COMPILER_MEMORY_BARRIER()
50#define wmb() RTEMS_COMPILER_MEMORY_BARRIER()
51#define rmb() RTEMS_COMPILER_MEMORY_BARRIER()
52
53static inline void
54atomic_add_int(volatile int *p, int v)
55{
56        rtems_interrupt_level level;
57
58        rtems_interrupt_disable(level);
59        *p += v;
60        rtems_interrupt_enable(level);
61}
62
63#define atomic_add_acq_int atomic_add_int
64#define atomic_add_rel_int atomic_add_int
65
66static inline void
67atomic_subtract_int(volatile int *p, int v)
68{
69        rtems_interrupt_level level;
70
71        rtems_interrupt_disable(level);
72        *p -= v;
73        rtems_interrupt_enable(level);
74}
75
76#define atomic_subtract_acq_int atomic_subtract_int
77#define atomic_subtract_rel_int atomic_subtract_int
78
79static inline void
80atomic_set_int(volatile int *p, int v)
81{
82        rtems_interrupt_level level;
83
84        rtems_interrupt_disable(level);
85        *p |= v;
86        rtems_interrupt_enable(level);
87}
88
89#define atomic_set_acq_int atomic_set_int
90#define atomic_set_rel_int atomic_set_int
91
92static inline void
93atomic_clear_int(volatile int *p, int v)
94{
95        rtems_interrupt_level level;
96
97        rtems_interrupt_disable(level);
98        *p &= ~v;
99        rtems_interrupt_enable(level);
100}
101
102#define atomic_clear_acq_int atomic_clear_int
103#define atomic_clear_rel_int atomic_clear_int
104
105static inline int
106atomic_cmpset_int(volatile int *p, int cmp, int set)
107{
108        rtems_interrupt_level level;
109        int rv;
110
111        rtems_interrupt_disable(level);
112        rv = *p == cmp;
113        if (rv) {
114                *p = set;
115        }
116        rtems_interrupt_enable(level);
117
118        return rv;
119}
120
121#define atomic_cmpset_acq_int atomic_cmpset_int
122#define atomic_cmpset_rel_int atomic_cmpset_int
123
124static inline int
125atomic_fetchadd_int(volatile int *p, int v)
126{
127        rtems_interrupt_level level;
128        int tmp;
129
130        rtems_interrupt_disable(level);
131        tmp = *p;
132        *p += v;
133        rtems_interrupt_enable(level);
134
135        return tmp;
136}
137
138static inline int
139atomic_readandclear_int(volatile int *p)
140{
141        rtems_interrupt_level level;
142        int tmp;
143
144        rtems_interrupt_disable(level);
145        tmp = *p;
146        *p = 0;
147        rtems_interrupt_enable(level);
148
149        return tmp;
150}
151
152static inline int
153atomic_load_acq_int(volatile int *p)
154{
155        return *p;
156}
157
158static inline void
159atomic_store_rel_int(volatile int *p, int v)
160{
161        *p = v;
162}
163
164static inline void
165atomic_add_32(volatile uint32_t *p, uint32_t v)
166{
167        rtems_interrupt_level level;
168
169        rtems_interrupt_disable(level);
170        *p += v;
171        rtems_interrupt_enable(level);
172}
173
174#define atomic_add_acq_32 atomic_add_32
175#define atomic_add_rel_32 atomic_add_32
176
177static inline void
178atomic_subtract_32(volatile uint32_t *p, uint32_t v)
179{
180        rtems_interrupt_level level;
181
182        rtems_interrupt_disable(level);
183        *p -= v;
184        rtems_interrupt_enable(level);
185}
186
187#define atomic_subtract_acq_32 atomic_subtract_32
188#define atomic_subtract_rel_32 atomic_subtract_32
189
190static inline void
191atomic_set_32(volatile uint32_t *p, uint32_t v)
192{
193        rtems_interrupt_level level;
194
195        rtems_interrupt_disable(level);
196        *p |= v;
197        rtems_interrupt_enable(level);
198}
199
200#define atomic_set_acq_32 atomic_set_32
201#define atomic_set_rel_32 atomic_set_32
202
203static inline void
204atomic_clear_32(volatile uint32_t *p, uint32_t v)
205{
206        rtems_interrupt_level level;
207
208        rtems_interrupt_disable(level);
209        *p &= ~v;
210        rtems_interrupt_enable(level);
211}
212
213#define atomic_clear_acq_32 atomic_clear_32
214#define atomic_clear_rel_32 atomic_clear_32
215
216static inline int
217atomic_cmpset_32(volatile uint32_t *p, uint32_t cmp, uint32_t set)
218{
219        rtems_interrupt_level level;
220        int rv;
221
222        rtems_interrupt_disable(level);
223        rv = *p == cmp;
224        if (rv) {
225                *p = set;
226        }
227        rtems_interrupt_enable(level);
228
229        return rv;
230}
231
232#define atomic_cmpset_acq_32 atomic_cmpset_32
233#define atomic_cmpset_rel_32 atomic_cmpset_32
234
235static inline uint32_t
236atomic_fetchadd_32(volatile uint32_t *p, uint32_t v)
237{
238        rtems_interrupt_level level;
239        uint32_t tmp;
240
241        rtems_interrupt_disable(level);
242        tmp = *p;
243        *p += v;
244        rtems_interrupt_enable(level);
245
246        return tmp;
247}
248
249static inline uint32_t
250atomic_readandclear_32(volatile uint32_t *p)
251{
252        rtems_interrupt_level level;
253        uint32_t tmp;
254
255        rtems_interrupt_disable(level);
256        tmp = *p;
257        *p = 0;
258        rtems_interrupt_enable(level);
259
260        return tmp;
261}
262
263static inline uint32_t
264atomic_load_acq_32(volatile uint32_t *p)
265{
266        return *p;
267}
268
269static inline void
270atomic_store_rel_32(volatile uint32_t *p, uint32_t v)
271{
272        *p = v;
273}
274
275static inline void
276atomic_add_long(volatile long *p, long v)
277{
278        rtems_interrupt_level level;
279
280        rtems_interrupt_disable(level);
281        *p += v;
282        rtems_interrupt_enable(level);
283}
284
285#define atomic_add_acq_long atomic_add_long
286#define atomic_add_rel_long atomic_add_long
287
288static inline void
289atomic_subtract_long(volatile long *p, long v)
290{
291        rtems_interrupt_level level;
292
293        rtems_interrupt_disable(level);
294        *p -= v;
295        rtems_interrupt_enable(level);
296}
297
298#define atomic_subtract_acq_long atomic_subtract_long
299#define atomic_subtract_rel_long atomic_subtract_long
300
301static inline void
302atomic_set_long(volatile long *p, long v)
303{
304        rtems_interrupt_level level;
305
306        rtems_interrupt_disable(level);
307        *p |= v;
308        rtems_interrupt_enable(level);
309}
310
311#define atomic_set_acq_long atomic_set_long
312#define atomic_set_rel_long atomic_set_long
313
314static inline void
315atomic_clear_long(volatile long *p, long v)
316{
317        rtems_interrupt_level level;
318
319        rtems_interrupt_disable(level);
320        *p &= ~v;
321        rtems_interrupt_enable(level);
322}
323
324#define atomic_clear_acq_long atomic_clear_long
325#define atomic_clear_rel_long atomic_clear_long
326
327static inline int
328atomic_cmpset_long(volatile long *p, long cmp, long set)
329{
330        rtems_interrupt_level level;
331        int rv;
332
333        rtems_interrupt_disable(level);
334        rv = *p == cmp;
335        if (rv) {
336                *p = set;
337        }
338        rtems_interrupt_enable(level);
339
340        return rv;
341}
342
343#define atomic_cmpset_acq_long atomic_cmpset_long
344#define atomic_cmpset_rel_long atomic_cmpset_long
345
346static inline long
347atomic_fetchadd_long(volatile long *p, long v)
348{
349        rtems_interrupt_level level;
350        long tmp;
351
352        rtems_interrupt_disable(level);
353        tmp = *p;
354        *p += v;
355        rtems_interrupt_enable(level);
356
357        return tmp;
358}
359
360static inline long
361atomic_readandclear_long(volatile long *p)
362{
363        rtems_interrupt_level level;
364        long tmp;
365
366        rtems_interrupt_disable(level);
367        tmp = *p;
368        *p = 0;
369        rtems_interrupt_enable(level);
370
371        return tmp;
372}
373
374static inline long
375atomic_load_acq_long(volatile long *p)
376{
377        return *p;
378}
379
380static inline void
381atomic_store_rel_long(volatile long *p, long v)
382{
383        *p = v;
384}
385
386#endif /* _RTEMS_BSD_MACHINE_ATOMIC_H_ */
Note: See TracBrowser for help on using the repository browser.