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

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since b84c04e was f244de9, checked in by Sebastian Huber <sebastian.huber@…>, on 11/06/13 at 07:56:38

Rename rtems-bsd-config.h

Rename rtems-bsd-config.h in rtems-bsd-kernel-space.h.

  • Property mode set to 100644
File size: 6.7 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 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#ifndef _RTEMS_BSD_MACHINE_ATOMIC_H_
24#define _RTEMS_BSD_MACHINE_ATOMIC_H_
25
26#ifndef _RTEMS_BSD_MACHINE_RTEMS_BSD_KERNEL_SPACE_H_
27#error "the header file <machine/rtems-bsd-kernel-space.h> must be included first"
28#endif
29
30#include <rtems.h>
31
32#define mb() RTEMS_COMPILER_MEMORY_BARRIER()
33#define wmb() RTEMS_COMPILER_MEMORY_BARRIER()
34#define rmb() RTEMS_COMPILER_MEMORY_BARRIER()
35
36static inline void
37atomic_add_int(volatile int *p, int v)
38{
39        rtems_interrupt_level level;
40
41        rtems_interrupt_disable(level);
42        *p += v;
43        rtems_interrupt_enable(level);
44}
45
46#define atomic_add_acq_int atomic_add_int
47#define atomic_add_rel_int atomic_add_int
48
49static inline void
50atomic_subtract_int(volatile int *p, int v)
51{
52        rtems_interrupt_level level;
53
54        rtems_interrupt_disable(level);
55        *p -= v;
56        rtems_interrupt_enable(level);
57}
58
59#define atomic_subtract_acq_int atomic_subtract_int
60#define atomic_subtract_rel_int atomic_subtract_int
61
62static inline void
63atomic_set_int(volatile int *p, int v)
64{
65        rtems_interrupt_level level;
66
67        rtems_interrupt_disable(level);
68        *p |= v;
69        rtems_interrupt_enable(level);
70}
71
72#define atomic_set_acq_int atomic_set_int
73#define atomic_set_rel_int atomic_set_int
74
75static inline void
76atomic_clear_int(volatile int *p, int v)
77{
78        rtems_interrupt_level level;
79
80        rtems_interrupt_disable(level);
81        *p &= ~v;
82        rtems_interrupt_enable(level);
83}
84
85#define atomic_clear_acq_int atomic_clear_int
86#define atomic_clear_rel_int atomic_clear_int
87
88static inline int
89atomic_cmpset_int(volatile int *p, int cmp, int set)
90{
91        rtems_interrupt_level level;
92        int rv;
93
94        rtems_interrupt_disable(level);
95        rv = *p == cmp;
96        if (rv) {
97                *p = set;
98        }
99        rtems_interrupt_enable(level);
100
101        return rv;
102}
103
104#define atomic_cmpset_acq_int atomic_cmpset_int
105#define atomic_cmpset_rel_int atomic_cmpset_int
106
107static inline int
108atomic_fetchadd_int(volatile int *p, int v)
109{
110        rtems_interrupt_level level;
111        int tmp;
112
113        rtems_interrupt_disable(level);
114        tmp = *p;
115        *p += v;
116        rtems_interrupt_enable(level);
117
118        return tmp;
119}
120
121static inline int
122atomic_readandclear_int(volatile int *p)
123{
124        rtems_interrupt_level level;
125        int tmp;
126
127        rtems_interrupt_disable(level);
128        tmp = *p;
129        *p = 0;
130        rtems_interrupt_enable(level);
131
132        return tmp;
133}
134
135static inline int
136atomic_load_acq_int(volatile int *p)
137{
138        return *p;
139}
140
141static inline void
142atomic_store_rel_int(volatile int *p, int v)
143{
144        *p = v;
145}
146
147static inline void
148atomic_add_32(volatile uint32_t *p, uint32_t v)
149{
150        rtems_interrupt_level level;
151
152        rtems_interrupt_disable(level);
153        *p += v;
154        rtems_interrupt_enable(level);
155}
156
157#define atomic_add_acq_32 atomic_add_32
158#define atomic_add_rel_32 atomic_add_32
159
160static inline void
161atomic_subtract_32(volatile uint32_t *p, uint32_t v)
162{
163        rtems_interrupt_level level;
164
165        rtems_interrupt_disable(level);
166        *p -= v;
167        rtems_interrupt_enable(level);
168}
169
170#define atomic_subtract_acq_32 atomic_subtract_32
171#define atomic_subtract_rel_32 atomic_subtract_32
172
173static inline void
174atomic_set_32(volatile uint32_t *p, uint32_t v)
175{
176        rtems_interrupt_level level;
177
178        rtems_interrupt_disable(level);
179        *p |= v;
180        rtems_interrupt_enable(level);
181}
182
183#define atomic_set_acq_32 atomic_set_32
184#define atomic_set_rel_32 atomic_set_32
185
186static inline void
187atomic_clear_32(volatile uint32_t *p, uint32_t v)
188{
189        rtems_interrupt_level level;
190
191        rtems_interrupt_disable(level);
192        *p &= ~v;
193        rtems_interrupt_enable(level);
194}
195
196#define atomic_clear_acq_32 atomic_clear_32
197#define atomic_clear_rel_32 atomic_clear_32
198
199static inline int
200atomic_cmpset_32(volatile uint32_t *p, uint32_t cmp, uint32_t set)
201{
202        rtems_interrupt_level level;
203        int rv;
204
205        rtems_interrupt_disable(level);
206        rv = *p == cmp;
207        if (rv) {
208                *p = set;
209        }
210        rtems_interrupt_enable(level);
211
212        return rv;
213}
214
215#define atomic_cmpset_acq_32 atomic_cmpset_32
216#define atomic_cmpset_rel_32 atomic_cmpset_32
217
218static inline uint32_t
219atomic_fetchadd_32(volatile uint32_t *p, uint32_t v)
220{
221        rtems_interrupt_level level;
222        uint32_t tmp;
223
224        rtems_interrupt_disable(level);
225        tmp = *p;
226        *p += v;
227        rtems_interrupt_enable(level);
228
229        return tmp;
230}
231
232static inline uint32_t
233atomic_readandclear_32(volatile uint32_t *p)
234{
235        rtems_interrupt_level level;
236        uint32_t tmp;
237
238        rtems_interrupt_disable(level);
239        tmp = *p;
240        *p = 0;
241        rtems_interrupt_enable(level);
242
243        return tmp;
244}
245
246static inline uint32_t
247atomic_load_acq_32(volatile uint32_t *p)
248{
249        return *p;
250}
251
252static inline void
253atomic_store_rel_32(volatile uint32_t *p, uint32_t v)
254{
255        *p = v;
256}
257
258static inline void
259atomic_add_long(volatile long *p, long v)
260{
261        rtems_interrupt_level level;
262
263        rtems_interrupt_disable(level);
264        *p += v;
265        rtems_interrupt_enable(level);
266}
267
268#define atomic_add_acq_long atomic_add_long
269#define atomic_add_rel_long atomic_add_long
270
271static inline void
272atomic_subtract_long(volatile long *p, long v)
273{
274        rtems_interrupt_level level;
275
276        rtems_interrupt_disable(level);
277        *p -= v;
278        rtems_interrupt_enable(level);
279}
280
281#define atomic_subtract_acq_long atomic_subtract_long
282#define atomic_subtract_rel_long atomic_subtract_long
283
284static inline void
285atomic_set_long(volatile long *p, long v)
286{
287        rtems_interrupt_level level;
288
289        rtems_interrupt_disable(level);
290        *p |= v;
291        rtems_interrupt_enable(level);
292}
293
294#define atomic_set_acq_long atomic_set_long
295#define atomic_set_rel_long atomic_set_long
296
297static inline void
298atomic_clear_long(volatile long *p, long v)
299{
300        rtems_interrupt_level level;
301
302        rtems_interrupt_disable(level);
303        *p &= ~v;
304        rtems_interrupt_enable(level);
305}
306
307#define atomic_clear_acq_long atomic_clear_long
308#define atomic_clear_rel_long atomic_clear_long
309
310static inline int
311atomic_cmpset_long(volatile long *p, long cmp, long set)
312{
313        rtems_interrupt_level level;
314        int rv;
315
316        rtems_interrupt_disable(level);
317        rv = *p == cmp;
318        if (rv) {
319                *p = set;
320        }
321        rtems_interrupt_enable(level);
322
323        return rv;
324}
325
326#define atomic_cmpset_acq_long atomic_cmpset_long
327#define atomic_cmpset_rel_long atomic_cmpset_long
328
329static inline long
330atomic_fetchadd_long(volatile long *p, long v)
331{
332        rtems_interrupt_level level;
333        long tmp;
334
335        rtems_interrupt_disable(level);
336        tmp = *p;
337        *p += v;
338        rtems_interrupt_enable(level);
339
340        return tmp;
341}
342
343static inline long
344atomic_readandclear_long(volatile long *p)
345{
346        rtems_interrupt_level level;
347        long tmp;
348
349        rtems_interrupt_disable(level);
350        tmp = *p;
351        *p = 0;
352        rtems_interrupt_enable(level);
353
354        return tmp;
355}
356
357static inline long
358atomic_load_acq_long(volatile long *p)
359{
360        return *p;
361}
362
363static inline void
364atomic_store_rel_long(volatile long *p, long v)
365{
366        *p = v;
367}
368
369#endif /* _RTEMS_BSD_MACHINE_ATOMIC_H_ */
Note: See TracBrowser for help on using the repository browser.