L4Re – L4 Runtime Environment
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 
49 L4_INLINE int
50 l4util_cmpxchg64(volatile l4_uint64_t * dest,
51  l4_uint64_t cmp_val, l4_uint64_t new_val);
52 
66 L4_INLINE int
67 l4util_cmpxchg32(volatile l4_uint32_t * dest,
68  l4_uint32_t cmp_val, l4_uint32_t new_val);
69 
83 L4_INLINE int
84 l4util_cmpxchg16(volatile l4_uint16_t * dest,
85  l4_uint16_t cmp_val, l4_uint16_t new_val);
86 
100 L4_INLINE int
101 l4util_cmpxchg8(volatile l4_uint8_t * dest,
102  l4_uint8_t cmp_val, l4_uint8_t new_val);
103 
117 L4_INLINE int
118 l4util_cmpxchg(volatile l4_umword_t * dest,
119  l4_umword_t cmp_val, l4_umword_t new_val);
120 
130 L4_INLINE l4_uint32_t
131 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val);
132 
142 L4_INLINE l4_uint16_t
143 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val);
144 
154 L4_INLINE l4_uint8_t
155 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val);
156 
166 L4_INLINE l4_umword_t
167 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val);
168 
170 
176 L4_INLINE void
177 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val);
179 L4_INLINE void
180 l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val);
182 L4_INLINE void
183 l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val);
185 L4_INLINE void
186 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val);
188 L4_INLINE void
189 l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val);
191 L4_INLINE void
192 l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val);
194 L4_INLINE void
195 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val);
197 L4_INLINE void
198 l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val);
200 L4_INLINE void
201 l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val);
203 L4_INLINE void
204 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val);
206 L4_INLINE void
207 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val);
209 L4_INLINE void
210 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val);
212 
214 
221 L4_INLINE l4_uint8_t
222 l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
224 L4_INLINE l4_uint16_t
225 l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
227 L4_INLINE l4_uint32_t
228 l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
230 L4_INLINE l4_uint8_t
231 l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
233 L4_INLINE l4_uint16_t
234 l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
236 L4_INLINE l4_uint32_t
237 l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
239 L4_INLINE l4_uint8_t
240 l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
242 L4_INLINE l4_uint16_t
243 l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
245 L4_INLINE l4_uint32_t
246 l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
248 L4_INLINE l4_uint8_t
249 l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
251 L4_INLINE l4_uint16_t
252 l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
254 L4_INLINE l4_uint32_t
255 l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
257 
259 
264 L4_INLINE void
265 l4util_inc8(volatile l4_uint8_t *dest);
267 L4_INLINE void
268 l4util_inc16(volatile l4_uint16_t *dest);
270 L4_INLINE void
271 l4util_inc32(volatile l4_uint32_t *dest);
273 L4_INLINE void
274 l4util_dec8(volatile l4_uint8_t *dest);
276 L4_INLINE void
277 l4util_dec16(volatile l4_uint16_t *dest);
279 L4_INLINE void
280 l4util_dec32(volatile l4_uint32_t *dest);
282 
284 
290 L4_INLINE l4_uint8_t
291 l4util_inc8_res(volatile l4_uint8_t *dest);
293 L4_INLINE l4_uint16_t
294 l4util_inc16_res(volatile l4_uint16_t *dest);
296 L4_INLINE l4_uint32_t
297 l4util_inc32_res(volatile l4_uint32_t *dest);
299 L4_INLINE l4_uint8_t
300 l4util_dec8_res(volatile l4_uint8_t *dest);
302 L4_INLINE l4_uint16_t
303 l4util_dec16_res(volatile l4_uint16_t *dest);
305 L4_INLINE l4_uint32_t
306 l4util_dec32_res(volatile l4_uint32_t *dest);
308 
316 L4_INLINE void
317 l4util_atomic_add(volatile long *dest, long val);
318 
325 L4_INLINE void
326 l4util_atomic_inc(volatile long *dest);
327 
329 
330 /*****************
331  * IMPLEMENTAION *
332  *****************/
333 
334 L4_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 
342 L4_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 
350 L4_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 
358 L4_INLINE int
359 l4util_cmpxchg8(volatile l4_uint8_t * dest,
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 
366 L4_INLINE int
367 l4util_cmpxchg(volatile l4_umword_t * dest,
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 
374 L4_INLINE l4_uint32_t
375 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val)
376 {
377  return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
378 }
379 
380 L4_INLINE l4_uint16_t
381 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val)
382 {
383  return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
384 }
385 
386 L4_INLINE l4_uint8_t
387 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val)
388 {
389  return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
390 }
391 
392 L4_INLINE l4_umword_t
393 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val)
394 {
395  return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
396 }
397 
398 L4_INLINE void
399 l4util_inc8(volatile l4_uint8_t *dest)
400 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
401 
402 L4_INLINE void
403 l4util_inc16(volatile l4_uint16_t *dest)
404 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
405 
406 L4_INLINE void
407 l4util_inc32(volatile l4_uint32_t *dest)
408 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
409 
410 L4_INLINE void
411 l4util_atomic_inc(volatile long *dest)
412 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
413 
414 L4_INLINE void
415 l4util_dec8(volatile l4_uint8_t *dest)
416 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
417 
418 L4_INLINE void
419 l4util_dec16(volatile l4_uint16_t *dest)
420 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
421 
422 L4_INLINE void
423 l4util_dec32(volatile l4_uint32_t *dest)
424 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
425 
426 
427 L4_INLINE l4_uint8_t
429 { return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
430 
431 L4_INLINE l4_uint16_t
433 { return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
434 
435 L4_INLINE l4_uint32_t
437 { return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
438 
439 L4_INLINE l4_uint8_t
441 { return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
442 
443 L4_INLINE l4_uint16_t
445 { return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
446 
447 L4_INLINE l4_uint32_t
449 { return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
450 
451 L4_INLINE l4_umword_t
452 l4util_dec_res(volatile l4_umword_t *dest)
453 { return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
454 
455 L4_INLINE void
456 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)
457 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
458 
459 L4_INLINE void
461 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
462 
463 L4_INLINE void
465 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
466 
467 L4_INLINE void
468 l4util_atomic_add(volatile long *dest, long val)
469 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
470 
471 L4_INLINE void
472 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val)
473 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
474 
475 L4_INLINE void
477 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
478 
479 L4_INLINE void
481 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
482 
483 L4_INLINE void
484 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val)
485 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
486 
487 L4_INLINE void
489 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
490 
491 L4_INLINE void
493 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
494 
495 L4_INLINE void
496 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
497 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
498 
499 L4_INLINE void
500 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val)
501 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
502 
503 L4_INLINE void
504 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val)
505 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
506 
507 L4_INLINE l4_uint8_t
509 { return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
510 
511 L4_INLINE l4_uint16_t
513 { return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
514 
515 L4_INLINE l4_uint32_t
517 { return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
518 
519 L4_INLINE l4_uint8_t
521 { return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
522 
523 L4_INLINE l4_uint16_t
525 { return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
526 
527 L4_INLINE l4_uint32_t
529 { return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
530 
531 L4_INLINE l4_uint8_t
533 { return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
534 
535 L4_INLINE l4_uint16_t
537 { return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
538 
539 L4_INLINE l4_uint32_t
541 { return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
542 
543 L4_INLINE l4_uint8_t
545 { return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
546 
547 L4_INLINE l4_uint16_t
549 { return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
550 
551 L4_INLINE l4_uint32_t
553 { return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
554 
555 #endif /* ! __L4UTIL__INCLUDE__ATOMIC_H__ */
L4 compiler related defines.
#define EXTERN_C_BEGIN
Start section with C types and functions.
Definition: compiler.h:190
#define EXTERN_C_END
End section with C types and functions.
Definition: compiler.h:191
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
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