1 /*
2 * Copyright (c) 2013 Christian Svensson <blue@cmd.nu>
3 * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@strace.io>
4 * Copyright (c) 2014-2021 The strace developers.
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: LGPL-2.1-or-later
8 */
9
10 #include "defs.h"
11
12 #ifdef OR1K
13
14 # define OR1K_ATOMIC_SWAP 1
15 # define OR1K_ATOMIC_CMPXCHG 2
16 # define OR1K_ATOMIC_XCHG 3
17 # define OR1K_ATOMIC_ADD 4
18 # define OR1K_ATOMIC_DECPOS 5
19 # define OR1K_ATOMIC_AND 6
20 # define OR1K_ATOMIC_OR 7
21 # define OR1K_ATOMIC_UMAX 8
22 # define OR1K_ATOMIC_UMIN 9
23
24 # include "xlat/atomic_ops.h"
25
26 SYS_FUNC(or1k_atomic)
27 {
28 /* type */
29 printxval64(atomic_ops, tcp->u_arg[0], "???");
30
31 switch (tcp->u_arg[0]) {
32 case OR1K_ATOMIC_DECPOS:
33 tprint_arg_next();
34 PRINT_VAL_X(tcp->u_arg[1]);
35 break;
36
37 case OR1K_ATOMIC_SWAP:
38 case OR1K_ATOMIC_XCHG:
39 case OR1K_ATOMIC_ADD:
40 case OR1K_ATOMIC_AND:
41 case OR1K_ATOMIC_OR:
42 case OR1K_ATOMIC_UMAX:
43 case OR1K_ATOMIC_UMIN:
44 tprint_arg_next();
45 PRINT_VAL_X(tcp->u_arg[1]);
46 tprint_arg_next();
47 PRINT_VAL_X(tcp->u_arg[2]);
48 break;
49
50 case OR1K_ATOMIC_CMPXCHG:
51 tprint_arg_next();
52 PRINT_VAL_X(tcp->u_arg[1]);
53 tprint_arg_next();
54 PRINT_VAL_X(tcp->u_arg[2]);
55 tprint_arg_next();
56 PRINT_VAL_X(tcp->u_arg[3]);
57 break;
58
59 default:
60 break;
61 }
62
63 return RVAL_DECODED | RVAL_HEX;
64 }
65
66 #endif /* OR1K */