]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4util/include/atomic.h
Inital import
[l4.git] / l4 / pkg / l4util / include / atomic.h
1 /*****************************************************************************/
2 /**
3  * \file
4  * \brief   atomic operations header and generic implementations
5  * \ingroup l4util_atomic
6  *
7  * \date    10/20/2000
8  * \author  Lars Reuther <reuther@os.inf.tu-dresden.de>,
9  *          Jork Loeser  <jork@os.inf.tu-dresden.de> */
10 /*
11  * (c) 2000-2009 Technische Universität Dresden
12  * This file is part of TUD:OS and distributed under the terms of the
13  * GNU Lesser General Public License 2.1.
14  * Please see the COPYING-LGPL-2.1 file for details.
15  */
16
17 /*****************************************************************************/
18 #ifndef __L4UTIL__INCLUDE__ATOMIC_H__
19 #define __L4UTIL__INCLUDE__ATOMIC_H__
20
21 #include <l4/sys/l4int.h>
22 #include <l4/sys/compiler.h>
23
24 /*****************************************************************************
25  *** Prototypes
26  *****************************************************************************/
27
28 EXTERN_C_BEGIN
29
30 /** 
31  * \defgroup l4util_atomic Atomic Instructions
32  * \ingroup l4util_api
33  */
34
35 /**
36  * \brief Atomic compare and exchange (64 bit version)
37  * \ingroup l4util_atomic
38  *
39  * \param  dest          destination operand
40  * \param  cmp_val       compare value
41  * \param  new_val       new value for dest
42  *
43  * \return 0 if comparison failed, 1 otherwise
44  *
45  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
46  * \em new_val
47  */
48 L4_INLINE int
49 l4util_cmpxchg64(volatile l4_uint64_t * dest,
50                  l4_uint64_t cmp_val, l4_uint64_t new_val);
51
52 /**
53  * \brief Atomic compare and exchange (32 bit version)
54  * \ingroup l4util_atomic
55  *
56  * \param  dest          destination operand
57  * \param  cmp_val       compare value
58  * \param  new_val       new value for dest
59  *
60  * \return 0 if comparison failed, !=0 otherwise
61  *
62  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
63  * \em new_val
64  */
65 L4_INLINE int
66 l4util_cmpxchg32(volatile l4_uint32_t * dest,
67                  l4_uint32_t cmp_val, l4_uint32_t new_val);
68
69 /**
70  * \brief Atomic compare and exchange (16 bit version)
71  * \ingroup l4util_atomic
72  *
73  * \param  dest          destination operand
74  * \param  cmp_val       compare value
75  * \param  new_val       new value for dest
76  *
77  * \return 0 if comparison failed, !=0 otherwise
78  *
79  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
80  * \em new_val
81  */
82 L4_INLINE int
83 l4util_cmpxchg16(volatile l4_uint16_t * dest,
84                  l4_uint16_t cmp_val, l4_uint16_t new_val);
85
86 /**
87  * \brief Atomic compare and exchange (8 bit version)
88  * \ingroup l4util_atomic
89  *
90  * \param  dest          destination operand
91  * \param  cmp_val       compare value
92  * \param  new_val       new value for dest
93  *
94  * \return 0 if comparison failed, !=0 otherwise
95  *
96  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
97  * \em new_val
98  */
99 L4_INLINE int
100 l4util_cmpxchg8(volatile l4_uint8_t * dest,
101                 l4_uint8_t cmp_val, l4_uint8_t new_val);
102
103 /**
104  * \brief Atomic compare and exchange (machine wide fields)
105  * \ingroup l4util_atomic
106  *
107  * \param  dest          destination operand
108  * \param  cmp_val       compare value
109  * \param  new_val       new value for dest
110  *
111  * \return 0 if comparison failed, 1 otherwise
112  *
113  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
114  * \em new_val
115  */
116 L4_INLINE int
117 l4util_cmpxchg(volatile l4_umword_t * dest,
118                l4_umword_t cmp_val, l4_umword_t new_val);
119
120 /**
121  * \brief Atomic exchange (32 bit version)
122  * \ingroup l4util_atomic
123  *
124  * \param  dest          destination operand
125  * \param  val           new value for dest
126  *
127  * \return old value at destination
128  */
129 L4_INLINE l4_uint32_t
130 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val);
131
132 /**
133  * \brief Atomic exchange (16 bit version)
134  * \ingroup l4util_atomic
135  *
136  * \param  dest          destination operand
137  * \param  val           new value for dest
138  *
139  * \return old value at destination
140  */
141 L4_INLINE l4_uint16_t
142 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val);
143
144 /**
145  * \brief Atomic exchange (8 bit version)
146  * \ingroup l4util_atomic
147  *
148  * \param  dest          destination operand
149  * \param  val           new value for dest
150  *
151  * \return old value at destination
152  */
153 L4_INLINE l4_uint8_t
154 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val);
155
156 /**
157  * \brief Atomic exchange (machine wide fields)
158  * \ingroup l4util_atomic
159  *
160  * \param  dest          destination operand
161  * \param  val           new value for dest
162  *
163  * \return old value at destination
164  */
165 L4_INLINE l4_umword_t
166 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val);
167
168 //!@name Atomic add/sub/and/or (8,16,32 bit version) without result
169 /** @{
170  * \ingroup l4util_atomic
171  *
172  * \param  dest          destination operand
173  * \param  val           value to add/sub/and/or
174  */
175 L4_INLINE void
176 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val);
177 L4_INLINE void
178 l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val);
179 L4_INLINE void
180 l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val);
181 L4_INLINE void
182 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val);
183 L4_INLINE void
184 l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val);
185 L4_INLINE void
186 l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val);
187 L4_INLINE void
188 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val);
189 L4_INLINE void
190 l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val);
191 L4_INLINE void
192 l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val);
193 L4_INLINE void
194 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val);
195 L4_INLINE void
196 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val);
197 L4_INLINE void
198 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val);
199 //@}
200
201 //!@name Atomic add/sub/and/or operations (8,16,32 bit) with result
202 /** @{
203  * \ingroup l4util_atomic
204  *
205  * \param  dest          destination operand
206  * \param  val           value to add/sub/and/or
207  * \return res
208  */
209 L4_INLINE l4_uint8_t
210 l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
211 L4_INLINE l4_uint16_t
212 l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
213 L4_INLINE l4_uint32_t
214 l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
215 L4_INLINE l4_uint8_t
216 l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
217 L4_INLINE l4_uint16_t
218 l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
219 L4_INLINE l4_uint32_t
220 l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
221 L4_INLINE l4_uint8_t
222 l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
223 L4_INLINE l4_uint16_t
224 l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
225 L4_INLINE l4_uint32_t
226 l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
227 L4_INLINE l4_uint8_t
228 l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
229 L4_INLINE l4_uint16_t
230 l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
231 L4_INLINE l4_uint32_t
232 l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
233 //@}
234
235 //!@name Atomic inc/dec (8,16,32 bit) without result
236 /** @{
237  * \ingroup l4util_atomic
238  *
239  * \param  dest          destination operand
240  */
241 L4_INLINE void
242 l4util_inc8(volatile l4_uint8_t *dest);
243 L4_INLINE void
244 l4util_inc16(volatile l4_uint16_t *dest);
245 L4_INLINE void
246 l4util_inc32(volatile l4_uint32_t *dest);
247 L4_INLINE void
248 l4util_dec8(volatile l4_uint8_t *dest);
249 L4_INLINE void
250 l4util_dec16(volatile l4_uint16_t *dest);
251 L4_INLINE void
252 l4util_dec32(volatile l4_uint32_t *dest);
253 //@}
254
255 //!@name Atomic inc/dec (8,16,32 bit) with result
256 /** @{
257  * \ingroup l4util_atomic
258  *
259  * \param  dest          destination operand
260  * \return res
261  */
262 L4_INLINE l4_uint8_t
263 l4util_inc8_res(volatile l4_uint8_t *dest);
264 L4_INLINE l4_uint16_t
265 l4util_inc16_res(volatile l4_uint16_t *dest);
266 L4_INLINE l4_uint32_t
267 l4util_inc32_res(volatile l4_uint32_t *dest);
268 L4_INLINE l4_uint8_t
269 l4util_dec8_res(volatile l4_uint8_t *dest);
270 L4_INLINE l4_uint16_t
271 l4util_dec16_res(volatile l4_uint16_t *dest);
272 L4_INLINE l4_uint32_t
273 l4util_dec32_res(volatile l4_uint32_t *dest);
274 //@}
275
276 /**
277  * \brief Atomic add
278  * \ingroup l4util_atomic
279  *
280  * \param  dest      destination operand
281  * \param  val       value to add
282  */
283 L4_INLINE void
284 l4util_atomic_add(volatile long *dest, long val);
285
286 /**
287  * \brief Atomic increment
288  * \ingroup l4util_atomic
289  *
290  * \param  dest      destination operand
291  */
292 L4_INLINE void
293 l4util_atomic_inc(volatile long *dest);
294
295 EXTERN_C_END
296
297 /*****************************************************************************
298  *** Get architecture specific implementations
299  *****************************************************************************/
300 #include <l4/util/atomic_arch.h>
301
302 /*****************************************************************************
303  *** Generic implementation
304  ***    (make sure to prevent page faults between critical sections)
305  ***  Do not use those functions, go implement a version for your
306  ***  architecture!
307  *****************************************************************************/
308
309 #ifdef __GNUC__
310
311 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG16
312 #include <l4/util/irq.h>
313
314 L4_INLINE int
315 l4util_cmpxchg16(volatile l4_uint16_t * dest,
316                  l4_uint16_t cmp_val, l4_uint16_t new_val)
317 {
318   int ret = 0;
319
320   l4util_cli();
321
322   if (*dest == cmp_val)
323     {
324       *dest = new_val;
325       ret = 1;
326     }
327
328   l4util_sti();
329
330   return ret;
331 }
332 #endif
333
334 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG32
335 #include <l4/util/irq.h>
336
337 L4_INLINE int
338 l4util_cmpxchg32(volatile l4_uint32_t * dest,
339                  l4_uint32_t cmp_val, l4_uint32_t new_val)
340 {
341   int ret = 0;
342
343   l4util_cli();
344
345   if (*dest == cmp_val)
346     {
347       *dest = new_val;
348       ret = 1;
349     }
350
351   l4util_sti();
352
353   return ret;
354 }
355 #endif
356
357 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG
358 #include <l4/util/irq.h>
359
360 L4_INLINE int
361 l4util_cmpxchg(volatile l4_umword_t * dest,
362                l4_umword_t cmp_val, l4_umword_t new_val)
363 {
364   int ret = 0;
365
366   l4util_cli();
367
368   if (*dest == cmp_val)
369     {
370       *dest = new_val;
371       ret = 1;
372     }
373
374   l4util_sti();
375
376   return ret;
377 }
378 #endif
379
380 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG32
381 #include <l4/util/irq.h>
382
383 L4_INLINE l4_uint32_t
384 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val)
385 {
386   l4_uint32_t old_val;
387
388   l4util_cli();
389
390   old_val = *dest;
391   *dest = val;
392
393   l4util_sti();
394
395   return old_val;
396 }
397 #endif
398
399 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG
400 #include <l4/util/irq.h>
401
402 L4_INLINE l4_umword_t
403 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val)
404 {
405   l4_umword_t old_val;
406
407   l4util_cli();
408
409   old_val = *dest;
410   *dest = val;
411
412   l4util_sti();
413
414   return old_val;
415 }
416 #endif
417
418 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD
419 #include <l4/util/irq.h>
420
421 L4_INLINE void
422 l4util_atomic_add(volatile long *dest, long val)
423 {
424   l4util_cli();
425   *dest += val;
426   l4util_sti();
427 }
428 #endif
429
430 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC
431 #include <l4/util/irq.h>
432
433 L4_INLINE void
434 l4util_atomic_inc(volatile long *dest)
435 {
436   l4util_cli();
437   (*dest)++;
438   l4util_sti();
439 }
440 #endif
441
442
443 /* Non-implemented version, catch with a linker warning */
444
445 extern int __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(void);
446
447 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC8
448 L4_INLINE void
449 l4util_inc8(volatile l4_uint8_t *dest)
450 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
451 #endif
452
453 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC16
454 L4_INLINE void
455 l4util_inc16(volatile l4_uint16_t *dest)
456 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
457 #endif
458
459 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC8
460 L4_INLINE void
461 l4util_dec8(volatile l4_uint8_t *dest)
462 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
463 #endif
464
465 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC16
466 L4_INLINE void
467 l4util_dec16(volatile l4_uint16_t *dest)
468 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
469 #endif
470
471
472
473 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC8_RES
474 L4_INLINE l4_uint8_t
475 l4util_inc8_res(volatile l4_uint8_t *dest)
476 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
477 #endif
478
479 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC16_RES
480 L4_INLINE l4_uint16_t
481 l4util_inc16_res(volatile l4_uint16_t *dest)
482 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
483 #endif
484
485 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC8_RES
486 L4_INLINE l4_uint8_t
487 l4util_dec8_res(volatile l4_uint8_t *dest)
488 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
489 #endif
490
491 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC16_RES
492 L4_INLINE l4_uint16_t
493 l4util_dec16_res(volatile l4_uint16_t *dest)
494 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
495 #endif
496
497 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG64
498 L4_INLINE int
499 l4util_cmpxchg64(volatile l4_uint64_t * dest,
500                      l4_uint64_t cmp_val, l4_uint64_t new_val)
501 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
502 #endif
503
504 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG8
505 L4_INLINE int
506 l4util_cmpxchg8(volatile l4_uint8_t * dest,
507                     l4_uint8_t cmp_val, l4_uint8_t new_val)
508 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
509 #endif
510
511 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG
512 L4_INLINE int
513 l4util_cmpxchg(volatile l4_umword_t * dest,
514                    l4_umword_t cmp_val, l4_umword_t new_val)
515 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
516 #endif
517
518 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG16
519 L4_INLINE l4_uint16_t
520 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val)
521 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
522 #endif
523
524 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG8
525 L4_INLINE l4_uint8_t
526 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val)
527 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
528 #endif
529
530
531 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD8
532 L4_INLINE void
533 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)
534 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
535 #endif
536
537 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD16
538 L4_INLINE void
539 l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val)
540 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
541 #endif
542
543 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD32
544 L4_INLINE void
545 l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val)
546 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
547 #endif
548
549
550 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB8
551 L4_INLINE void
552 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val)
553 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
554 #endif
555
556 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB16
557 L4_INLINE void
558 l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val)
559 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
560 #endif
561
562 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB32
563 L4_INLINE void
564 l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val)
565 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
566 #endif
567
568 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND8
569 L4_INLINE void
570 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val)
571 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
572 #endif
573
574 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND16
575 L4_INLINE void
576 l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val)
577 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
578 #endif
579
580 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND32
581 L4_INLINE void
582 l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val)
583 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
584 #endif
585
586 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR8
587 L4_INLINE void
588 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
589 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
590 #endif
591
592 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR16
593 L4_INLINE void
594 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val)
595 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
596 #endif
597
598 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR32
599 L4_INLINE void
600 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val)
601 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
602 #endif
603
604 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD8_RES
605 L4_INLINE l4_uint8_t
606 l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
607 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
608 #endif
609
610 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD16_RES
611 L4_INLINE l4_uint16_t
612 l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
613 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
614 #endif
615
616 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD32_RES
617 L4_INLINE l4_uint32_t
618 l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
619 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
620 #endif
621
622 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB8_RES
623 L4_INLINE l4_uint8_t
624 l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
625 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
626 #endif
627
628 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB16_RES
629 L4_INLINE l4_uint16_t
630 l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
631 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
632 #endif
633
634 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB32_RES
635 L4_INLINE l4_uint32_t
636 l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
637 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
638 #endif
639
640 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND8_RES
641 L4_INLINE l4_uint8_t
642 l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
643 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
644 #endif
645
646 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND16_RES
647 L4_INLINE l4_uint16_t
648 l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
649 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
650 #endif
651
652 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND32_RES
653 L4_INLINE l4_uint32_t
654 l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
655 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
656 #endif
657
658 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR8_RES
659 L4_INLINE l4_uint8_t
660 l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
661 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
662 #endif
663
664 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR16_RES
665 L4_INLINE l4_uint16_t
666 l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
667 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
668 #endif
669
670 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR32_RES
671 L4_INLINE l4_uint32_t
672 l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
673 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
674 #endif
675
676
677 #endif //_GNUC__
678
679 #endif /* ! __L4UTIL__INCLUDE__ATOMIC_H__ */