]> granicus.if.org Git - strace/blob - futex.c
Introduce memory allocation wrappers
[strace] / futex.c
1 #include "defs.h"
2
3 #ifdef HAVE_LINUX_FUTEX_H
4 # include <linux/futex.h>
5 #endif
6
7 #ifndef FUTEX_WAIT
8 # define FUTEX_WAIT 0
9 #endif
10 #ifndef FUTEX_WAKE
11 # define FUTEX_WAKE 1
12 #endif
13 #ifndef FUTEX_FD
14 # define FUTEX_FD 2
15 #endif
16 #ifndef FUTEX_REQUEUE
17 # define FUTEX_REQUEUE 3
18 #endif
19 #ifndef FUTEX_CMP_REQUEUE
20 # define FUTEX_CMP_REQUEUE 4
21 #endif
22 #ifndef FUTEX_WAKE_OP
23 # define FUTEX_WAKE_OP 5
24 #endif
25 #ifndef FUTEX_LOCK_PI
26 # define FUTEX_LOCK_PI 6
27 # define FUTEX_UNLOCK_PI 7
28 # define FUTEX_TRYLOCK_PI 8
29 #endif
30 #ifndef FUTEX_WAIT_BITSET
31 # define FUTEX_WAIT_BITSET 9
32 #endif
33 #ifndef FUTEX_WAKE_BITSET
34 # define FUTEX_WAKE_BITSET 10
35 #endif
36 #ifndef FUTEX_WAIT_REQUEUE_PI
37 # define FUTEX_WAIT_REQUEUE_PI 11
38 #endif
39 #ifndef FUTEX_CMP_REQUEUE_PI
40 # define FUTEX_CMP_REQUEUE_PI 12
41 #endif
42 #ifndef FUTEX_PRIVATE_FLAG
43 # define FUTEX_PRIVATE_FLAG 128
44 #endif
45 #ifndef FUTEX_CLOCK_REALTIME
46 # define FUTEX_CLOCK_REALTIME 256
47 #endif
48 #ifndef FUTEX_WAIT_PRIVATE
49 # define FUTEX_WAIT_PRIVATE             (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
50 #endif
51 #ifndef FUTEX_WAKE_PRIVATE
52 # define FUTEX_WAKE_PRIVATE             (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
53 #endif
54 #ifndef FUTEX_REQUEUE_PRIVATE
55 # define FUTEX_REQUEUE_PRIVATE          (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
56 #endif
57 #ifndef FUTEX_CMP_REQUEUE_PRIVATE
58 # define FUTEX_CMP_REQUEUE_PRIVATE      (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
59 #endif
60 #ifndef FUTEX_WAKE_OP_PRIVATE
61 # define FUTEX_WAKE_OP_PRIVATE          (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
62 #endif
63 #ifndef FUTEX_LOCK_PI_PRIVATE
64 # define FUTEX_LOCK_PI_PRIVATE          (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
65 #endif
66 #ifndef FUTEX_UNLOCK_PI_PRIVATE
67 # define FUTEX_UNLOCK_PI_PRIVATE        (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
68 #endif
69 #ifndef FUTEX_TRYLOCK_PI_PRIVATE
70 # define FUTEX_TRYLOCK_PI_PRIVATE       (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
71 #endif
72 #ifndef FUTEX_WAIT_BITSET_PRIVATE
73 # define FUTEX_WAIT_BITSET_PRIVATE      (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
74 #endif
75 #ifndef FUTEX_WAKE_BITSET_PRIVATE
76 # define FUTEX_WAKE_BITSET_PRIVATE      (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
77 #endif
78 #ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE
79 # define FUTEX_WAIT_REQUEUE_PI_PRIVATE  (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
80 #endif
81 #ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE
82 # define FUTEX_CMP_REQUEUE_PI_PRIVATE   (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
83 #endif
84 #include "xlat/futexops.h"
85 #ifndef FUTEX_OP_SET
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
97 #endif
98 #include "xlat/futexwakeops.h"
99 #include "xlat/futexwakecmps.h"
100
101 SYS_FUNC(futex)
102 {
103         if (entering(tcp)) {
104                 long int cmd = tcp->u_arg[1] & 127;
105                 tprintf("%p, ", (void *) tcp->u_arg[0]);
106                 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
107                 tprintf(", %ld", tcp->u_arg[2]);
108                 if (cmd == FUTEX_WAKE_BITSET)
109                         tprintf(", %lx", tcp->u_arg[5]);
110                 else if (cmd == FUTEX_WAIT) {
111                         tprints(", ");
112                         printtv(tcp, tcp->u_arg[3]);
113                 } else if (cmd == FUTEX_WAIT_BITSET) {
114                         tprints(", ");
115                         printtv(tcp, tcp->u_arg[3]);
116                         tprintf(", %lx", tcp->u_arg[5]);
117                 } else if (cmd == FUTEX_REQUEUE)
118                         tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
119                 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
120                         tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
121                 else if (cmd == FUTEX_WAKE_OP) {
122                         tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
123                         if ((tcp->u_arg[5] >> 28) & 8)
124                                 tprints("FUTEX_OP_OPARG_SHIFT|");
125                         printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
126                         tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
127                         if ((tcp->u_arg[5] >> 24) & 8)
128                                 tprints("FUTEX_OP_OPARG_SHIFT|");
129                         printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
130                         tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
131                 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
132                         tprints(", ");
133                         printtv(tcp, tcp->u_arg[3]);
134                         tprintf(", %p", (void *) tcp->u_arg[4]);
135                 }
136         }
137         return 0;
138 }