L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 * License: see LICENSE.spdx (in this directory or the directories above)
14 */
15
16/*****************************************************************************/
17#ifndef __L4UTIL__INCLUDE__ATOMIC_H__
18#define __L4UTIL__INCLUDE__ATOMIC_H__
19
20#include <l4/sys/l4int.h>
21#include <l4/sys/compiler.h>
22
23/*****************************************************************************
24 *** Prototypes
25 *****************************************************************************/
26
28
34#if __SIZEOF_LONG__ == 8
35
55L4_INLINE int
56l4util_cmpxchg64(volatile l4_uint64_t * dest,
57 l4_uint64_t cmp_val, l4_uint64_t new_val);
58
59#endif
60
74L4_INLINE int
75l4util_cmpxchg32(volatile l4_uint32_t * dest,
76 l4_uint32_t cmp_val, l4_uint32_t new_val);
77
91L4_INLINE int
92l4util_cmpxchg16(volatile l4_uint16_t * dest,
93 l4_uint16_t cmp_val, l4_uint16_t new_val);
94
108L4_INLINE int
109l4util_cmpxchg8(volatile l4_uint8_t * dest,
110 l4_uint8_t cmp_val, l4_uint8_t new_val);
111
125L4_INLINE int
126l4util_cmpxchg(volatile l4_umword_t * dest,
127 l4_umword_t cmp_val, l4_umword_t new_val);
128
139l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val);
140
151l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val);
152
163l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val);
164
175l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val);
176
178
184L4_INLINE void
185l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val);
187L4_INLINE void
188l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val);
190L4_INLINE void
191l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val);
193L4_INLINE void
194l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val);
196L4_INLINE void
197l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val);
199L4_INLINE void
200l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val);
202L4_INLINE void
203l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val);
205L4_INLINE void
206l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val);
208L4_INLINE void
209l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val);
211L4_INLINE void
212l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val);
214L4_INLINE void
215l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val);
217L4_INLINE void
218l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val);
220
222
230l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
233l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
236l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
239l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
242l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
245l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
248l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
251l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
254l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
257l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
260l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
263l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
265
267
272L4_INLINE void
273l4util_inc8(volatile l4_uint8_t *dest);
275L4_INLINE void
276l4util_inc16(volatile l4_uint16_t *dest);
278L4_INLINE void
279l4util_inc32(volatile l4_uint32_t *dest);
281L4_INLINE void
282l4util_dec8(volatile l4_uint8_t *dest);
284L4_INLINE void
285l4util_dec16(volatile l4_uint16_t *dest);
287L4_INLINE void
288l4util_dec32(volatile l4_uint32_t *dest);
290
292
299l4util_inc8_res(volatile l4_uint8_t *dest);
302l4util_inc16_res(volatile l4_uint16_t *dest);
305l4util_inc32_res(volatile l4_uint32_t *dest);
308l4util_dec8_res(volatile l4_uint8_t *dest);
311l4util_dec16_res(volatile l4_uint16_t *dest);
314l4util_dec32_res(volatile l4_uint32_t *dest);
316
324L4_INLINE void
325l4util_atomic_add(volatile long *dest, long val);
326
333L4_INLINE void
334l4util_atomic_inc(volatile long *dest);
335
337
338/*****************
339 * IMPLEMENTAION *
340 *****************/
341
342#if __SIZEOF_LONG__ == 8
343
344L4_INLINE int
345l4util_cmpxchg64(volatile l4_uint64_t * dest,
346 l4_uint64_t cmp_val, l4_uint64_t new_val)
347{
348 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
349 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
350}
351
352#endif
353
354L4_INLINE int
356 l4_uint32_t cmp_val, l4_uint32_t new_val)
357{
358 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
359 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
360}
361
362L4_INLINE int
364 l4_uint16_t cmp_val, l4_uint16_t new_val)
365{
366 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
367 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
368}
369
370L4_INLINE int
372 l4_uint8_t cmp_val, l4_uint8_t new_val)
373{
374 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
375 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
376}
377
378L4_INLINE int
380 l4_umword_t cmp_val, l4_umword_t new_val)
381{
382 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
383 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
384}
385
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
399l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val)
400{
401 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
402}
403
406{
407 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
408}
409
410L4_INLINE void
411l4util_inc8(volatile l4_uint8_t *dest)
412{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
413
414L4_INLINE void
416{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
417
418L4_INLINE void
420{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
421
422L4_INLINE void
423l4util_atomic_inc(volatile long *dest)
424{ __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
425
426L4_INLINE void
427l4util_dec8(volatile l4_uint8_t *dest)
428{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
429
430L4_INLINE void
432{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
433
434L4_INLINE void
436{ __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
437
438
441{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
442
445{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
446
449{ return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
450
453{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
454
457{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
458
461{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
462
464l4util_dec_res(volatile l4_umword_t *dest)
465{ return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
466
467L4_INLINE void
469{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
470
471L4_INLINE void
473{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
474
475L4_INLINE void
477{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
478
479L4_INLINE void
480l4util_atomic_add(volatile long *dest, long val)
481{ __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
482
483L4_INLINE void
485{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
486
487L4_INLINE void
489{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
490
491L4_INLINE void
493{ __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
494
495L4_INLINE void
497{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
498
499L4_INLINE void
501{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
502
503L4_INLINE void
505{ __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
506
507L4_INLINE void
508l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
509{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
510
511L4_INLINE void
513{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
514
515L4_INLINE void
517{ __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
518
521{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
522
525{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
526
529{ return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
530
533{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
534
537{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
538
541{ return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
542
545{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
546
549{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
550
553{ return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
554
557{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
558
561{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
562
565{ return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
566
567#endif /* ! __L4UTIL__INCLUDE__ATOMIC_H__ */
L4 compiler related defines.
unsigned long l4_umword_t
Unsigned machine word.
Definition l4int.h:40
unsigned char l4_uint8_t
Unsigned 8bit value.
Definition l4int.h:25
unsigned int l4_uint32_t
Unsigned 32bit value.
Definition l4int.h:29
unsigned short int l4_uint16_t
Unsigned 16bit value.
Definition l4int.h:27
unsigned long long l4_uint64_t
Unsigned 64bit value.
Definition l4int.h:31
#define __END_DECLS
End section with C types and functions.
Definition compiler.h:167
#define L4_INLINE
L4 Inline function attribute.
Definition compiler.h:51
#define __BEGIN_DECLS
Start section with C types and functions.
Definition compiler.h:164
l4_uint32_t l4util_inc32_res(volatile l4_uint32_t *dest)
Definition atomic.h:448
void l4util_inc32(volatile l4_uint32_t *dest)
Definition atomic.h:419
void l4util_atomic_add(volatile long *dest, long val)
Atomic add.
Definition atomic.h:480
void l4util_dec16(volatile l4_uint16_t *dest)
Definition atomic.h:431
void l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:504
l4_uint32_t l4util_xchg32(volatile l4_uint32_t *dest, l4_uint32_t val)
Atomic exchange (32 bit version)
Definition atomic.h:387
l4_uint16_t l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:560
l4_uint32_t l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:528
l4_uint8_t l4util_xchg8(volatile l4_uint8_t *dest, l4_uint8_t val)
Atomic exchange (8 bit version)
Definition atomic.h:399
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:371
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:363
l4_uint32_t l4util_dec32_res(volatile l4_uint32_t *dest)
Definition atomic.h:460
l4_uint32_t l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:552
void l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:468
l4_uint8_t l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:520
l4_uint8_t l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:544
void l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:516
void l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:512
void l4util_inc8(volatile l4_uint8_t *dest)
Definition atomic.h:411
void l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:488
void l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:476
l4_uint16_t l4util_xchg16(volatile l4_uint16_t *dest, l4_uint16_t val)
Atomic exchange (16 bit version)
Definition atomic.h:393
void l4util_dec32(volatile l4_uint32_t *dest)
Definition atomic.h:435
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:379
l4_umword_t l4util_xchg(volatile l4_umword_t *dest, l4_umword_t val)
Atomic exchange (machine wide fields)
Definition atomic.h:405
l4_uint16_t l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:548
l4_uint16_t l4util_dec16_res(volatile l4_uint16_t *dest)
Definition atomic.h:456
void l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:496
void l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:508
l4_uint32_t l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:564
void l4util_atomic_inc(volatile long *dest)
Atomic increment.
Definition atomic.h:423
void l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:472
l4_uint8_t l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:532
void l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:484
l4_uint8_t l4util_inc8_res(volatile l4_uint8_t *dest)
Definition atomic.h:440
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:355
l4_uint16_t l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:524
l4_uint16_t l4util_inc16_res(volatile l4_uint16_t *dest)
Definition atomic.h:444
void l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:492
l4_uint16_t l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:536
void l4util_inc16(volatile l4_uint16_t *dest)
Definition atomic.h:415
void l4util_dec8(volatile l4_uint8_t *dest)
Definition atomic.h:427
void l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val)
Definition atomic.h:500
l4_uint8_t l4util_dec8_res(volatile l4_uint8_t *dest)
Definition atomic.h:452
l4_uint8_t l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
Definition atomic.h:556
l4_uint32_t l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
Definition atomic.h:540