3 #ifdef HAVE_LINUX_FUTEX_H
4 # include <linux/futex.h>
17 # define FUTEX_REQUEUE 3
19 #ifndef FUTEX_CMP_REQUEUE
20 # define FUTEX_CMP_REQUEUE 4
23 # define FUTEX_WAKE_OP 5
26 # define FUTEX_LOCK_PI 6
27 # define FUTEX_UNLOCK_PI 7
28 # define FUTEX_TRYLOCK_PI 8
30 #ifndef FUTEX_WAIT_BITSET
31 # define FUTEX_WAIT_BITSET 9
33 #ifndef FUTEX_WAKE_BITSET
34 # define FUTEX_WAKE_BITSET 10
36 #ifndef FUTEX_WAIT_REQUEUE_PI
37 # define FUTEX_WAIT_REQUEUE_PI 11
39 #ifndef FUTEX_CMP_REQUEUE_PI
40 # define FUTEX_CMP_REQUEUE_PI 12
42 #ifndef FUTEX_PRIVATE_FLAG
43 # define FUTEX_PRIVATE_FLAG 128
45 #ifndef FUTEX_CLOCK_REALTIME
46 # define FUTEX_CLOCK_REALTIME 256
48 #ifndef FUTEX_WAIT_PRIVATE
49 # define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
51 #ifndef FUTEX_WAKE_PRIVATE
52 # define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
54 #ifndef FUTEX_REQUEUE_PRIVATE
55 # define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
57 #ifndef FUTEX_CMP_REQUEUE_PRIVATE
58 # define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
60 #ifndef FUTEX_WAKE_OP_PRIVATE
61 # define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
63 #ifndef FUTEX_LOCK_PI_PRIVATE
64 # define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
66 #ifndef FUTEX_UNLOCK_PI_PRIVATE
67 # define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
69 #ifndef FUTEX_TRYLOCK_PI_PRIVATE
70 # define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
72 #ifndef FUTEX_WAIT_BITSET_PRIVATE
73 # define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
75 #ifndef FUTEX_WAKE_BITSET_PRIVATE
76 # define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
78 #ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE
79 # define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
81 #ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE
82 # define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
84 #include "xlat/futexops.h"
86 # define FUTEX_OP_SET 0
87 # define FUTEX_OP_ADD 1
88 # define FUTEX_OP_OR 2
89 # define FUTEX_OP_ANDN 3
90 # define FUTEX_OP_XOR 4
91 # define FUTEX_OP_CMP_EQ 0
92 # define FUTEX_OP_CMP_NE 1
93 # define FUTEX_OP_CMP_LT 2
94 # define FUTEX_OP_CMP_LE 3
95 # define FUTEX_OP_CMP_GT 4
96 # define FUTEX_OP_CMP_GE 5
98 #include "xlat/futexwakeops.h"
99 #include "xlat/futexwakecmps.h"
102 sys_futex(struct tcb *tcp)
105 long int cmd = tcp->u_arg[1] & 127;
106 tprintf("%p, ", (void *) tcp->u_arg[0]);
107 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
108 tprintf(", %ld", tcp->u_arg[2]);
109 if (cmd == FUTEX_WAKE_BITSET)
110 tprintf(", %lx", tcp->u_arg[5]);
111 else if (cmd == FUTEX_WAIT) {
113 printtv(tcp, tcp->u_arg[3]);
114 } else if (cmd == FUTEX_WAIT_BITSET) {
116 printtv(tcp, tcp->u_arg[3]);
117 tprintf(", %lx", tcp->u_arg[5]);
118 } else if (cmd == FUTEX_REQUEUE)
119 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
120 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
121 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
122 else if (cmd == FUTEX_WAKE_OP) {
123 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
124 if ((tcp->u_arg[5] >> 28) & 8)
125 tprints("FUTEX_OP_OPARG_SHIFT|");
126 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
127 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
128 if ((tcp->u_arg[5] >> 24) & 8)
129 tprints("FUTEX_OP_OPARG_SHIFT|");
130 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
131 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
132 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
134 printtv(tcp, tcp->u_arg[3]);
135 tprintf(", %p", (void *) tcp->u_arg[4]);