2 * Copyright (c) 2002-2003 Roland McGrath <roland@redhat.com>
3 * Copyright (c) 2007-2008 Ulrich Drepper <drepper@redhat.com>
4 * Copyright (c) 2009 Andreas Schwab <schwab@redhat.com>
5 * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
6 * Copyright (c) 2014-2019 The strace developers.
9 * SPDX-License-Identifier: LGPL-2.1-or-later
14 #ifndef FUTEX_PRIVATE_FLAG
15 # define FUTEX_PRIVATE_FLAG 128
17 #ifndef FUTEX_CLOCK_REALTIME
18 # define FUTEX_CLOCK_REALTIME 256
20 #ifndef FUTEX_OP_OPARG_SHIFT
21 # define FUTEX_OP_OPARG_SHIFT 8
24 #include "xlat/futexbitset.h"
25 #include "xlat/futexops.h"
26 #include "xlat/futexwakeops.h"
27 #include "xlat/futexwakecmps.h"
30 do_futex(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
32 const kernel_ulong_t uaddr = tcp->u_arg[0];
33 const int op = tcp->u_arg[1];
34 const int cmd = op & 127;
35 const kernel_ulong_t timeout = tcp->u_arg[3];
36 const kernel_ulong_t uaddr2 = tcp->u_arg[4];
37 const unsigned int val = tcp->u_arg[2];
38 const unsigned int val2 = tcp->u_arg[3];
39 const unsigned int val3 = tcp->u_arg[5];
44 printxval(futexops, op, "FUTEX_???");
49 print_ts(tcp, timeout);
53 print_ts(tcp, timeout);
55 case FUTEX_WAIT_BITSET:
58 print_ts(tcp, timeout);
60 printxval(futexbitset, val3, NULL);
62 case FUTEX_WAKE_BITSET:
65 printxval(futexbitset, val3, NULL);
69 tprintf(", %u, ", val2);
72 case FUTEX_CMP_REQUEUE:
73 case FUTEX_CMP_REQUEUE_PI:
75 tprintf(", %u, ", val2);
77 tprintf(", %u", val3);
81 tprintf(", %u, ", val2);
84 if ((val3 >> 28) & FUTEX_OP_OPARG_SHIFT) {
85 print_xlat(FUTEX_OP_OPARG_SHIFT);
88 comment = printxval(futexwakeops, (val3 >> 28) & 0x7, NULL)
89 ? NULL : "FUTEX_OP_???";
91 tprints_comment(comment);
92 tprintf("|%#x<<12|", (val3 >> 12) & 0xfff);
93 comment = printxval(futexwakecmps, (val3 >> 24) & 0xf, NULL)
94 ? NULL : "FUTEX_OP_CMP_???";
96 tprints_comment(comment);
97 tprintf("|%#x", val3 & 0xfff);
99 case FUTEX_WAIT_REQUEUE_PI:
100 tprintf(", %u", val);
102 print_ts(tcp, timeout);
108 tprintf(", %u", val);
110 case FUTEX_UNLOCK_PI:
111 case FUTEX_TRYLOCK_PI:
114 tprintf(", %u", val);
119 tprintf(", %#x", val3);
126 #if HAVE_ARCH_TIME32_SYSCALLS
127 SYS_FUNC(futex_time32)
129 return do_futex(tcp, print_timespec32);
133 SYS_FUNC(futex_time64)
135 return do_futex(tcp, print_timespec64);