]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/unix/sysv/linux/m68k/coldfire/atomic-machine.h
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / m68k / coldfire / atomic-machine.h
1 /* Copyright (C) 2010-2024 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library. If not, see
16 <https://www.gnu.org/licenses/>. */
17
18 #ifndef _ATOMIC_MACHINE_H
19 #define _ATOMIC_MACHINE_H 1
20
21 #include <sysdep.h>
22
23 /* Coldfire has no atomic compare-and-exchange operation, but the
24 kernel provides userspace atomicity operations. Use them. */
25
26 #define __HAVE_64B_ATOMICS 0
27 #define USE_ATOMIC_COMPILER_BUILTINS 0
28
29 /* XXX Is this actually correct? */
30 #define ATOMIC_EXCHANGE_USES_CAS 1
31
32 /* The only basic operation needed is compare and exchange. */
33 #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
34 ({ \
35 /* Use temporary variables to workaround call-clobberness of \
36 the registers. */ \
37 __typeof (mem) _mem = mem; \
38 __typeof (oldval) _oldval = oldval; \
39 __typeof (newval) _newval = newval; \
40 register uint32_t _d0 asm ("d0") = SYS_ify (atomic_cmpxchg_32); \
41 register uint32_t *_a0 asm ("a0") = (uint32_t *) _mem; \
42 register uint32_t _d2 asm ("d2") = (uint32_t) _oldval; \
43 register uint32_t _d1 asm ("d1") = (uint32_t) _newval; \
44 \
45 asm ("trap #0" \
46 : "+d" (_d0), "+m" (*_a0) \
47 : "a" (_a0), "d" (_d2), "d" (_d1)); \
48 (__typeof (oldval)) _d0; \
49 })
50
51 # define atomic_full_barrier() \
52 (INTERNAL_SYSCALL_CALL (atomic_barrier), (void) 0)
53
54 #endif