]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4util/include/atomic.h
update
[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 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
29 EXTERN_C_BEGIN
30
31 /** 
32  * \defgroup l4util_atomic Atomic Instructions
33  * \ingroup l4util_api
34  */
35
36 /**
37  * \brief Atomic compare and exchange (64 bit version)
38  * \ingroup l4util_atomic
39  *
40  * \param  dest          destination operand
41  * \param  cmp_val       compare value
42  * \param  new_val       new value for dest
43  *
44  * \return 0 if comparison failed, 1 otherwise
45  *
46  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
47  * \em new_val
48  */
49 L4_INLINE int
50 l4util_cmpxchg64(volatile l4_uint64_t * dest,
51                  l4_uint64_t cmp_val, l4_uint64_t new_val);
52
53 /**
54  * \brief Atomic compare and exchange (32 bit version)
55  * \ingroup l4util_atomic
56  *
57  * \param  dest          destination operand
58  * \param  cmp_val       compare value
59  * \param  new_val       new value for dest
60  *
61  * \return 0 if comparison failed, !=0 otherwise
62  *
63  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
64  * \em new_val
65  */
66 L4_INLINE int
67 l4util_cmpxchg32(volatile l4_uint32_t * dest,
68                  l4_uint32_t cmp_val, l4_uint32_t new_val);
69
70 /**
71  * \brief Atomic compare and exchange (16 bit version)
72  * \ingroup l4util_atomic
73  *
74  * \param  dest          destination operand
75  * \param  cmp_val       compare value
76  * \param  new_val       new value for dest
77  *
78  * \return 0 if comparison failed, !=0 otherwise
79  *
80  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
81  * \em new_val
82  */
83 L4_INLINE int
84 l4util_cmpxchg16(volatile l4_uint16_t * dest,
85                  l4_uint16_t cmp_val, l4_uint16_t new_val);
86
87 /**
88  * \brief Atomic compare and exchange (8 bit version)
89  * \ingroup l4util_atomic
90  *
91  * \param  dest          destination operand
92  * \param  cmp_val       compare value
93  * \param  new_val       new value for dest
94  *
95  * \return 0 if comparison failed, !=0 otherwise
96  *
97  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
98  * \em new_val
99  */
100 L4_INLINE int
101 l4util_cmpxchg8(volatile l4_uint8_t * dest,
102                 l4_uint8_t cmp_val, l4_uint8_t new_val);
103
104 /**
105  * \brief Atomic compare and exchange (machine wide fields)
106  * \ingroup l4util_atomic
107  *
108  * \param  dest          destination operand
109  * \param  cmp_val       compare value
110  * \param  new_val       new value for dest
111  *
112  * \return 0 if comparison failed, 1 otherwise
113  *
114  * Compare the value in \em dest with \em cmp_val, if equal set \em dest to
115  * \em new_val
116  */
117 L4_INLINE int
118 l4util_cmpxchg(volatile l4_umword_t * dest,
119                l4_umword_t cmp_val, l4_umword_t new_val);
120
121 /**
122  * \brief Atomic exchange (32 bit version)
123  * \ingroup l4util_atomic
124  *
125  * \param  dest          destination operand
126  * \param  val           new value for dest
127  *
128  * \return old value at destination
129  */
130 L4_INLINE l4_uint32_t
131 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val);
132
133 /**
134  * \brief Atomic exchange (16 bit version)
135  * \ingroup l4util_atomic
136  *
137  * \param  dest          destination operand
138  * \param  val           new value for dest
139  *
140  * \return old value at destination
141  */
142 L4_INLINE l4_uint16_t
143 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val);
144
145 /**
146  * \brief Atomic exchange (8 bit version)
147  * \ingroup l4util_atomic
148  *
149  * \param  dest          destination operand
150  * \param  val           new value for dest
151  *
152  * \return old value at destination
153  */
154 L4_INLINE l4_uint8_t
155 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val);
156
157 /**
158  * \brief Atomic exchange (machine wide fields)
159  * \ingroup l4util_atomic
160  *
161  * \param  dest          destination operand
162  * \param  val           new value for dest
163  *
164  * \return old value at destination
165  */
166 L4_INLINE l4_umword_t
167 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val);
168
169 //!@name Atomic add/sub/and/or (8,16,32 bit version) without result
170 /** @{
171  * \ingroup l4util_atomic
172  *
173  * \param  dest          destination operand
174  * \param  val           value to add/sub/and/or
175  */
176 L4_INLINE void
177 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val);
178 L4_INLINE void
179 l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val);
180 L4_INLINE void
181 l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val);
182 L4_INLINE void
183 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val);
184 L4_INLINE void
185 l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val);
186 L4_INLINE void
187 l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val);
188 L4_INLINE void
189 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val);
190 L4_INLINE void
191 l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val);
192 L4_INLINE void
193 l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val);
194 L4_INLINE void
195 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val);
196 L4_INLINE void
197 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val);
198 L4_INLINE void
199 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val);
200 //@}
201
202 //!@name Atomic add/sub/and/or operations (8,16,32 bit) with result
203 /** @{
204  * \ingroup l4util_atomic
205  *
206  * \param  dest          destination operand
207  * \param  val           value to add/sub/and/or
208  * \return res
209  */
210 L4_INLINE l4_uint8_t
211 l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
212 L4_INLINE l4_uint16_t
213 l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
214 L4_INLINE l4_uint32_t
215 l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
216 L4_INLINE l4_uint8_t
217 l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
218 L4_INLINE l4_uint16_t
219 l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
220 L4_INLINE l4_uint32_t
221 l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
222 L4_INLINE l4_uint8_t
223 l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
224 L4_INLINE l4_uint16_t
225 l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
226 L4_INLINE l4_uint32_t
227 l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
228 L4_INLINE l4_uint8_t
229 l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val);
230 L4_INLINE l4_uint16_t
231 l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val);
232 L4_INLINE l4_uint32_t
233 l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val);
234 //@}
235
236 //!@name Atomic inc/dec (8,16,32 bit) without result
237 /** @{
238  * \ingroup l4util_atomic
239  *
240  * \param  dest          destination operand
241  */
242 L4_INLINE void
243 l4util_inc8(volatile l4_uint8_t *dest);
244 L4_INLINE void
245 l4util_inc16(volatile l4_uint16_t *dest);
246 L4_INLINE void
247 l4util_inc32(volatile l4_uint32_t *dest);
248 L4_INLINE void
249 l4util_dec8(volatile l4_uint8_t *dest);
250 L4_INLINE void
251 l4util_dec16(volatile l4_uint16_t *dest);
252 L4_INLINE void
253 l4util_dec32(volatile l4_uint32_t *dest);
254 //@}
255
256 //!@name Atomic inc/dec (8,16,32 bit) with result
257 /** @{
258  * \ingroup l4util_atomic
259  *
260  * \param  dest          destination operand
261  * \return res
262  */
263 L4_INLINE l4_uint8_t
264 l4util_inc8_res(volatile l4_uint8_t *dest);
265 L4_INLINE l4_uint16_t
266 l4util_inc16_res(volatile l4_uint16_t *dest);
267 L4_INLINE l4_uint32_t
268 l4util_inc32_res(volatile l4_uint32_t *dest);
269 L4_INLINE l4_uint8_t
270 l4util_dec8_res(volatile l4_uint8_t *dest);
271 L4_INLINE l4_uint16_t
272 l4util_dec16_res(volatile l4_uint16_t *dest);
273 L4_INLINE l4_uint32_t
274 l4util_dec32_res(volatile l4_uint32_t *dest);
275 //@}
276
277 /**
278  * \brief Atomic add
279  * \ingroup l4util_atomic
280  *
281  * \param  dest      destination operand
282  * \param  val       value to add
283  */
284 L4_INLINE void
285 l4util_atomic_add(volatile long *dest, long val);
286
287 /**
288  * \brief Atomic increment
289  * \ingroup l4util_atomic
290  *
291  * \param  dest      destination operand
292  */
293 L4_INLINE void
294 l4util_atomic_inc(volatile long *dest);
295
296 EXTERN_C_END
297
298 /*****************************************************************************
299  *** Get architecture specific implementations
300  *****************************************************************************/
301 #include <l4/util/atomic_arch.h>
302
303 #ifdef __GNUC__
304
305 /* Non-implemented version, catch with a linker warning */
306
307 extern int __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(void);
308
309 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC8
310 L4_INLINE void
311 l4util_inc8(volatile l4_uint8_t *dest)
312 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
313 #endif
314
315 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC16
316 L4_INLINE void
317 l4util_inc16(volatile l4_uint16_t *dest)
318 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
319 #endif
320
321 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC8
322 L4_INLINE void
323 l4util_dec8(volatile l4_uint8_t *dest)
324 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
325 #endif
326
327 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC16
328 L4_INLINE void
329 l4util_dec16(volatile l4_uint16_t *dest)
330 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
331 #endif
332
333
334
335 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC8_RES
336 L4_INLINE l4_uint8_t
337 l4util_inc8_res(volatile l4_uint8_t *dest)
338 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
339 #endif
340
341 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_INC16_RES
342 L4_INLINE l4_uint16_t
343 l4util_inc16_res(volatile l4_uint16_t *dest)
344 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
345 #endif
346
347 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC8_RES
348 L4_INLINE l4_uint8_t
349 l4util_dec8_res(volatile l4_uint8_t *dest)
350 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
351 #endif
352
353 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_DEC16_RES
354 L4_INLINE l4_uint16_t
355 l4util_dec16_res(volatile l4_uint16_t *dest)
356 { (void)dest; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
357 #endif
358
359 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG64
360 L4_INLINE int
361 l4util_cmpxchg64(volatile l4_uint64_t * dest,
362                      l4_uint64_t cmp_val, l4_uint64_t new_val)
363 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
364 #endif
365
366 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG8
367 L4_INLINE int
368 l4util_cmpxchg8(volatile l4_uint8_t * dest,
369                     l4_uint8_t cmp_val, l4_uint8_t new_val)
370 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
371 #endif
372
373 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG16
374 L4_INLINE int
375 l4util_cmpxchg16(volatile l4_uint16_t * dest,
376                  l4_uint16_t cmp_val, l4_uint16_t new_val)
377 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
378 #endif
379
380 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG
381 L4_INLINE int
382 l4util_cmpxchg(volatile l4_umword_t * dest,
383                    l4_umword_t cmp_val, l4_umword_t new_val)
384 { (void)dest; (void)cmp_val; (void)new_val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
385 #endif
386
387 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG32
388 L4_INLINE l4_uint32_t
389 l4util_xchg32(volatile l4_uint32_t * dest, l4_uint32_t val)
390 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
391 #endif
392
393 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG16
394 L4_INLINE l4_uint16_t
395 l4util_xchg16(volatile l4_uint16_t * dest, l4_uint16_t val)
396 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
397 #endif
398
399 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG8
400 L4_INLINE l4_uint8_t
401 l4util_xchg8(volatile l4_uint8_t * dest, l4_uint8_t val)
402 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
403 #endif
404
405 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_XCHG
406 L4_INLINE l4_umword_t
407 l4util_xchg(volatile l4_umword_t * dest, l4_umword_t val)
408 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0; }
409 #endif
410
411 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD8
412 L4_INLINE void
413 l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)
414 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
415 #endif
416
417 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD16
418 L4_INLINE void
419 l4util_add16(volatile l4_uint16_t *dest, l4_uint16_t val)
420 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
421 #endif
422
423 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD32
424 L4_INLINE void
425 l4util_add32(volatile l4_uint32_t *dest, l4_uint32_t val)
426 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
427 #endif
428
429
430 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB8
431 L4_INLINE void
432 l4util_sub8(volatile l4_uint8_t *dest, l4_uint8_t val)
433 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
434 #endif
435
436 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB16
437 L4_INLINE void
438 l4util_sub16(volatile l4_uint16_t *dest, l4_uint16_t val)
439 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
440 #endif
441
442 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB32
443 L4_INLINE void
444 l4util_sub32(volatile l4_uint32_t *dest, l4_uint32_t val)
445 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
446 #endif
447
448 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND8
449 L4_INLINE void
450 l4util_and8(volatile l4_uint8_t *dest, l4_uint8_t val)
451 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
452 #endif
453
454 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND16
455 L4_INLINE void
456 l4util_and16(volatile l4_uint16_t *dest, l4_uint16_t val)
457 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
458 #endif
459
460 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND32
461 L4_INLINE void
462 l4util_and32(volatile l4_uint32_t *dest, l4_uint32_t val)
463 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
464 #endif
465
466 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR8
467 L4_INLINE void
468 l4util_or8(volatile l4_uint8_t *dest, l4_uint8_t val)
469 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
470 #endif
471
472 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR16
473 L4_INLINE void
474 l4util_or16(volatile l4_uint16_t *dest, l4_uint16_t val)
475 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
476 #endif
477
478 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR32
479 L4_INLINE void
480 l4util_or32(volatile l4_uint32_t *dest, l4_uint32_t val)
481 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); }
482 #endif
483
484 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD8_RES
485 L4_INLINE l4_uint8_t
486 l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
487 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
488 #endif
489
490 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD16_RES
491 L4_INLINE l4_uint16_t
492 l4util_add16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
493 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
494 #endif
495
496 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_ADD32_RES
497 L4_INLINE l4_uint32_t
498 l4util_add32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
499 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
500 #endif
501
502 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB8_RES
503 L4_INLINE l4_uint8_t
504 l4util_sub8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
505 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
506 #endif
507
508 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB16_RES
509 L4_INLINE l4_uint16_t
510 l4util_sub16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
511 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
512 #endif
513
514 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_SUB32_RES
515 L4_INLINE l4_uint32_t
516 l4util_sub32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
517 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
518 #endif
519
520 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND8_RES
521 L4_INLINE l4_uint8_t
522 l4util_and8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
523 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
524 #endif
525
526 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND16_RES
527 L4_INLINE l4_uint16_t
528 l4util_and16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
529 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
530 #endif
531
532 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_AND32_RES
533 L4_INLINE l4_uint32_t
534 l4util_and32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
535 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
536 #endif
537
538 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR8_RES
539 L4_INLINE l4_uint8_t
540 l4util_or8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
541 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
542 #endif
543
544 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR16_RES
545 L4_INLINE l4_uint16_t
546 l4util_or16_res(volatile l4_uint16_t *dest, l4_uint16_t val)
547 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
548 #endif
549
550 #ifndef __L4UTIL_ATOMIC_HAVE_ARCH_OR32_RES
551 L4_INLINE l4_uint32_t
552 l4util_or32_res(volatile l4_uint32_t *dest, l4_uint32_t val)
553 { (void)dest; (void)val; __this_l4util_atomic_function_is_not_implemented_for_this_arch__sorry(); return 0;}
554 #endif
555
556
557 #endif //_GNUC__
558
559 #endif /* ! __L4UTIL__INCLUDE__ATOMIC_H__ */