blob: f59587cdbc8790d059df673f3346df04e3ba41cf [file] [log] [blame]
Dmitry V. Levine314f802014-12-11 19:25:02 +00001#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
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000101SYS_FUNC(futex)
Dmitry V. Levine314f802014-12-11 19:25:02 +0000102{
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}