source: rtems-libbsd/rtemsbsd/rtems/freebsd/machine/atomic.h @ 1a91c05

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since 1a91c05 was 1a91c05, checked in by Joel Sherrill <joel.sherrill@…>, on 03/07/12 at 22:44:23

Preserve Sebastian's directory structure under rtemsbsd to minimize changes

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