L4Re Operating System Framework – Interface and Usage Documentation
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1/*****************************************************************************/
10/*
11 * (c) 2000-2009 Author(s)
12 * economic rights: Technische Universität Dresden (Germany)
13 * This file is part of TUD:OS and distributed under the terms of the
14 * GNU Lesser General Public License 2.1.
15 * Please see the COPYING-LGPL-2.1 file for details.
16 */
17
18/*****************************************************************************/
19#ifndef __L4UTIL__INCLUDE__ATOMIC_H__
20#define __L4UTIL__INCLUDE__ATOMIC_H__
21
22#include <l4/sys/l4int.h>
23#include <l4/sys/compiler.h>
24
25/*****************************************************************************
26 *** Prototypes
27 *****************************************************************************/
28
30
49L4_INLINE int
50l4util_cmpxchg64(volatile l4_uint64_t * dest,
51 l4_uint64_t cmp_val, l4_uint64_t new_val);
52
66L4_INLINE int
67l4util_cmpxchg32(volatile l4_uint32_t * dest,
68 l4_uint32_t cmp_val, l4_uint32_t new_val);
69
83L4_INLINE int
84l4util_cmpxchg16(volatile l4_uint16_t * dest,
85 l4_uint16_t cmp_val, l4_uint16_t new_val);
86
100L4_INLINE int
101l4util_cmpxchg8(volatile l4_uint8_t * dest,
102 l4_uint8_t cmp_val, l4_uint8_t new_val);
103
117L4_INLINE int
118l4util_cmpxchg(volatile l4_umword_t * dest,
119 l4_umword_t cmp_val, l4_umword_t new_val);
120
131l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val);
132
143l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val);
144
155l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val);
156
167l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val);
168
170
176L4_INLINE void
177l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val);
179L4_INLINE void
180l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val);
182L4_INLINE void
183l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val);
185L4_INLINE void
186l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val);
188L4_INLINE void
189l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val);
191L4_INLINE void
192l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val);
194L4_INLINE void
195l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val);
197L4_INLINE void
198l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val);
200L4_INLINE void
201l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val);
203L4_INLINE void
204l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val);
206L4_INLINE void
207l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val);
209L4_INLINE void
210l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val);
212
214
222l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
225l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
228l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
231l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
234l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
237l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
240l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
243l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
246l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
249l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
252l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
255l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
257
259
264L4_INLINE void
265l4util_inc8(volatile l4_uint8_t *dest);
267L4_INLINE void
268l4util_inc16(volatile l4_uint16_t *dest);
270L4_INLINE void
271l4util_inc32(volatile l4_uint32_t *dest);
273L4_INLINE void
274l4util_dec8(volatile l4_uint8_t *dest);
276L4_INLINE void
277l4util_dec16(volatile l4_uint16_t *dest);
279L4_INLINE void
280l4util_dec32(volatile l4_uint32_t *dest);
282
284
291l4util_inc8_res(volatile l4_uint8_t *dest);
294l4util_inc16_res(volatile l4_uint16_t *dest);
297l4util_inc32_res(volatile l4_uint32_t *dest);
300l4util_dec8_res(volatile l4_uint8_t *dest);
303l4util_dec16_res(volatile l4_uint16_t *dest);
306l4util_dec32_res(volatile l4_uint32_t *dest);
308
316L4_INLINE void
317l4util_atomic_add(volatile long *dest, long val);
318
325L4_INLINE void
326l4util_atomic_inc(volatile long *dest);
327
329
330/*****************
331 * IMPLEMENTAION *
332 *****************/
333
334L4_INLINE int
336 l4_uint64_t cmp_val, l4_uint64_t new_val)
337{
338 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
339 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
340}
341
342L4_INLINE int
344 l4_uint32_t cmp_val, l4_uint32_t new_val)
345{
346 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
347 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
348}
349
350L4_INLINE int
352 l4_uint16_t cmp_val, l4_uint16_t new_val)
353{
354 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
355 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
356}
357
358L4_INLINE int
360 l4_uint8_t cmp_val, l4_uint8_t new_val)
361{
362 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
363 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
364}
365
366L4_INLINE int
368 l4_umword_t cmp_val, l4_umword_t new_val)
369{
370 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
371 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
372}
373
376{
377 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
378}
379
382{
383 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
384}
385
387l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val)
388{
389 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
390}
391
394{
395 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
396}
397
398L4_INLINE void
399l4util_inc8(volatile l4_uint8_t *dest)
400{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
401
402L4_INLINE void
404{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
405
406L4_INLINE void
408{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
409
410L4_INLINE void
411l4util_atomic_inc(volatile long *dest)
412{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
413
414L4_INLINE void
415l4util_dec8(volatile l4_uint8_t *dest)
416{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
417
418L4_INLINE void
420{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
421
422L4_INLINE void
424{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
425
426
429{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
430
433{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
434
437{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
438
441{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
442
445{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
446
449{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
450
452l4util_dec_res(volatile l4_umword_t *dest)
453{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
454
455L4_INLINE void
457{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
458
459L4_INLINE void
461{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
462
463L4_INLINE void
465{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
466
467L4_INLINE void
468l4util_atomic_add(volatile long *dest, long val)
469{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
470
471L4_INLINE void
473{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
474
475L4_INLINE void
477{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
478
479L4_INLINE void
481{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
482
483L4_INLINE void
485{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
486
487L4_INLINE void
489{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
490
491L4_INLINE void
493{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
494
495L4_INLINE void
496l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
497{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
498
499L4_INLINE void
501{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
502
503L4_INLINE void
505{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
506
509{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
510
513{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
514
517{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
518
521{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
522
525{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
526
529{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
530
533{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
534
537{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
538
541{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
542
545{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
546
549{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
550
553{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
554
555#endif /* ! __L4UTIL__INCLUDE__ATOMIC_H__ */
L4 compiler related defines.
unsigned long l4_umword_t
Unsigned machine word.
Definition l4int.h:51
unsigned char l4_uint8_t
Unsigned 8bit value.
Definition l4int.h:36
unsigned int l4_uint32_t
Unsigned 32bit value.
Definition l4int.h:40
unsigned short int l4_uint16_t
Unsigned 16bit value.
Definition l4int.h:38
unsigned long long l4_uint64_t
Unsigned 64bit value.
Definition l4int.h:42
#define L4_INLINE
L4 Inline function attribute.
Definition compiler.h:62
#define EXTERN_C_BEGIN
Start section with C types and functions.
Definition compiler.h:192
#define EXTERN_C_END
End section with C types and functions.
Definition compiler.h:193
l4_uint32_t l4util_inc32_res(volatile l4_uint32_t *dest)
Definition atomic.h:436
void l4util_inc32(volatile l4_uint32_t *dest)
Definition atomic.h:407
void l4util_atomic_add(volatile long *dest, long val)
Atomic add.
Definition atomic.h:468
void l4util_dec16(volatile l4_uint16_t *dest)
Definition atomic.h:419
void l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:492
l4_uint32_t l4util_xchg32(volatile l4_uint32_t *dest, l4_uint32_t val)
Atomic exchange (32 bit version)
Definition atomic.h:375
l4_uint16_t l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:548
l4_uint32_t l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:516
l4_uint8_t l4util_xchg8(volatile l4_uint8_t *dest, l4_uint8_t val)
Atomic exchange (8 bit version)
Definition atomic.h:387
int l4util_cmpxchg8(volatile l4_uint8_t *dest, l4_uint8_t cmp_val, l4_uint8_t new_val)
Atomic compare and exchange (8 bit version)
Definition atomic.h:359
int l4util_cmpxchg16(volatile l4_uint16_t *dest, l4_uint16_t cmp_val, l4_uint16_t new_val)
Atomic compare and exchange (16 bit version)
Definition atomic.h:351
l4_uint32_t l4util_dec32_res(volatile l4_uint32_t *dest)
Definition atomic.h:448
l4_uint32_t l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:540
void l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:456
l4_uint8_t l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:508
int l4util_cmpxchg64(volatile l4_uint64_t *dest, l4_uint64_t cmp_val, l4_uint64_t new_val)
Atomic compare and exchange (64 bit version)
Definition atomic.h:335
l4_uint8_t l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:532
void l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:504
void l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:500
void l4util_inc8(volatile l4_uint8_t *dest)
Definition atomic.h:399
void l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:476
void l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:464
l4_uint16_t l4util_xchg16(volatile l4_uint16_t *dest, l4_uint16_t val)
Atomic exchange (16 bit version)
Definition atomic.h:381
void l4util_dec32(volatile l4_uint32_t *dest)
Definition atomic.h:423
int l4util_cmpxchg(volatile l4_umword_t *dest, l4_umword_t cmp_val, l4_umword_t new_val)
Atomic compare and exchange (machine wide fields)
Definition atomic.h:367
l4_umword_t l4util_xchg(volatile l4_umword_t *dest, l4_umword_t val)
Atomic exchange (machine wide fields)
Definition atomic.h:393
l4_uint16_t l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:536
l4_uint16_t l4util_dec16_res(volatile l4_uint16_t *dest)
Definition atomic.h:444
void l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:484
void l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:496
l4_uint32_t l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:552
void l4util_atomic_inc(volatile long *dest)
Atomic increment.
Definition atomic.h:411
void l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:460
l4_uint8_t l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:520
void l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:472
l4_uint8_t l4util_inc8_res(volatile l4_uint8_t *dest)
Definition atomic.h:428
int l4util_cmpxchg32(volatile l4_uint32_t *dest, l4_uint32_t cmp_val, l4_uint32_t new_val)
Atomic compare and exchange (32 bit version)
Definition atomic.h:343
l4_uint16_t l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:512
l4_uint16_t l4util_inc16_res(volatile l4_uint16_t *dest)
Definition atomic.h:432
void l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:480
l4_uint16_t l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:524
void l4util_inc16(volatile l4_uint16_t *dest)
Definition atomic.h:403
void l4util_dec8(volatile l4_uint8_t *dest)
Definition atomic.h:415
void l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:488
l4_uint8_t l4util_dec8_res(volatile l4_uint8_t *dest)
Definition atomic.h:440
l4_uint8_t l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:544
l4_uint32_t l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:528