]>
Commit | Line | Data |
---|---|---|
7adcbafe | 1 | /* Copyright (C) 2012-2022 Free Software Foundation, Inc. |
a32e5e93 RH |
2 | Contributed by Richard Henderson <rth@redhat.com>. |
3 | ||
4 | This file is part of the GNU Transactional Memory Library (libitm). | |
5 | ||
6 | Libitm is free software; you can redistribute it and/or modify it | |
7 | under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 3 of the License, or | |
9 | (at your option) any later version. | |
10 | ||
11 | Libitm is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
13 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
14 | more details. | |
15 | ||
16 | Under Section 7 of GPL version 3, you are granted additional | |
17 | permissions described in the GCC Runtime Library Exception, version | |
18 | 3.1, as published by the Free Software Foundation. | |
19 | ||
20 | You should have received a copy of the GNU General Public License and | |
21 | a copy of the GCC Runtime Library Exception along with this program; | |
22 | see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
23 | <http://www.gnu.org/licenses/>. */ | |
24 | ||
25 | #include <sys/syscall.h> | |
26 | ||
27 | static inline long | |
28 | sys_futex0 (std::atomic<int> *addr, int op, int val) | |
29 | { | |
30 | register long int r0 __asm__ ("r0"); | |
31 | register long int r3 __asm__ ("r3"); | |
32 | register long int r4 __asm__ ("r4"); | |
33 | register long int r5 __asm__ ("r5"); | |
34 | register long int r6 __asm__ ("r6"); | |
35 | ||
36 | r0 = SYS_futex; | |
37 | r3 = (long) addr; | |
38 | r4 = op; | |
39 | r5 = val; | |
40 | r6 = 0; | |
41 | ||
42 | /* ??? The powerpc64 sysdep.h file clobbers ctr; the powerpc32 sysdep.h | |
43 | doesn't. It doesn't much matter for us. In the interest of unity, | |
44 | go ahead and clobber it always. */ | |
45 | ||
46 | __asm volatile ("sc; mfcr %0" | |
47 | : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6) | |
48 | : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6) | |
49 | : "r7", "r8", "r9", "r10", "r11", "r12", | |
50 | "cr0", "ctr", "memory"); | |
51 | if (__builtin_expect (r0 & (1 << 28), 0)) | |
52 | return r3; | |
53 | return 0; | |
54 | } |