]> granicus.if.org Git - strace/blob - futex.c
io.c: use printaddr and umove_or_printaddr
[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_PRIVATE_FLAG
8 # define FUTEX_PRIVATE_FLAG 128
9 #endif
10 #ifndef FUTEX_CLOCK_REALTIME
11 # define FUTEX_CLOCK_REALTIME 256
12 #endif
13
14 #include "xlat/futexops.h"
15 #include "xlat/futexwakeops.h"
16 #include "xlat/futexwakecmps.h"
17
18 SYS_FUNC(futex)
19 {
20         if (entering(tcp)) {
21                 long int cmd = tcp->u_arg[1] & 127;
22                 tprintf("%p, ", (void *) tcp->u_arg[0]);
23                 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
24                 tprintf(", %ld", tcp->u_arg[2]);
25                 if (cmd == FUTEX_WAKE_BITSET)
26                         tprintf(", %lx", tcp->u_arg[5]);
27                 else if (cmd == FUTEX_WAIT) {
28                         tprints(", ");
29                         printtv(tcp, tcp->u_arg[3]);
30                 } else if (cmd == FUTEX_WAIT_BITSET) {
31                         tprints(", ");
32                         printtv(tcp, tcp->u_arg[3]);
33                         tprintf(", %lx", tcp->u_arg[5]);
34                 } else if (cmd == FUTEX_REQUEUE)
35                         tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
36                 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
37                         tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
38                 else if (cmd == FUTEX_WAKE_OP) {
39                         tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
40                         if ((tcp->u_arg[5] >> 28) & 8)
41                                 tprints("FUTEX_OP_OPARG_SHIFT|");
42                         printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
43                         tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
44                         if ((tcp->u_arg[5] >> 24) & 8)
45                                 tprints("FUTEX_OP_OPARG_SHIFT|");
46                         printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
47                         tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
48                 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
49                         tprints(", ");
50                         printtv(tcp, tcp->u_arg[3]);
51                         tprintf(", %p", (void *) tcp->u_arg[4]);
52                 }
53         }
54         return 0;
55 }