]> granicus.if.org Git - strace/blob - futex.c
Fix preprocessor indentation
[strace] / futex.c
1 /*
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.
7  * All rights reserved.
8  *
9  * SPDX-License-Identifier: LGPL-2.1-or-later
10  */
11
12 #include "defs.h"
13
14 #ifndef FUTEX_PRIVATE_FLAG
15 # define FUTEX_PRIVATE_FLAG 128
16 #endif
17 #ifndef FUTEX_CLOCK_REALTIME
18 # define FUTEX_CLOCK_REALTIME 256
19 #endif
20 #ifndef FUTEX_OP_OPARG_SHIFT
21 # define FUTEX_OP_OPARG_SHIFT 8
22 #endif
23
24 #include "xlat/futexbitset.h"
25 #include "xlat/futexops.h"
26 #include "xlat/futexwakeops.h"
27 #include "xlat/futexwakecmps.h"
28
29 static int
30 do_futex(struct tcb *const tcp, const print_obj_by_addr_fn print_ts)
31 {
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];
40         const char *comment;
41
42         printaddr(uaddr);
43         tprints(", ");
44         printxval(futexops, op, "FUTEX_???");
45         switch (cmd) {
46         case FUTEX_WAIT:
47                 tprintf(", %u", val);
48                 tprints(", ");
49                 print_ts(tcp, timeout);
50                 break;
51         case FUTEX_LOCK_PI:
52                 tprints(", ");
53                 print_ts(tcp, timeout);
54                 break;
55         case FUTEX_WAIT_BITSET:
56                 tprintf(", %u", val);
57                 tprints(", ");
58                 print_ts(tcp, timeout);
59                 tprints(", ");
60                 printxval(futexbitset, val3, NULL);
61                 break;
62         case FUTEX_WAKE_BITSET:
63                 tprintf(", %u", val);
64                 tprints(", ");
65                 printxval(futexbitset, val3, NULL);
66                 break;
67         case FUTEX_REQUEUE:
68                 tprintf(", %u", val);
69                 tprintf(", %u, ", val2);
70                 printaddr(uaddr2);
71                 break;
72         case FUTEX_CMP_REQUEUE:
73         case FUTEX_CMP_REQUEUE_PI:
74                 tprintf(", %u", val);
75                 tprintf(", %u, ", val2);
76                 printaddr(uaddr2);
77                 tprintf(", %u", val3);
78                 break;
79         case FUTEX_WAKE_OP:
80                 tprintf(", %u", val);
81                 tprintf(", %u, ", val2);
82                 printaddr(uaddr2);
83                 tprints(", ");
84                 if ((val3 >> 28) & FUTEX_OP_OPARG_SHIFT) {
85                         print_xlat(FUTEX_OP_OPARG_SHIFT);
86                         tprints("<<28|");
87                 }
88                 comment = printxval(futexwakeops, (val3 >> 28) & 0x7, NULL)
89                         ? NULL : "FUTEX_OP_???";
90                 tprints("<<28");
91                 tprints_comment(comment);
92                 tprintf("|%#x<<12|", (val3 >> 12) & 0xfff);
93                 comment = printxval(futexwakecmps, (val3 >> 24) & 0xf, NULL)
94                         ? NULL : "FUTEX_OP_CMP_???";
95                 tprints("<<24");
96                 tprints_comment(comment);
97                 tprintf("|%#x", val3 & 0xfff);
98                 break;
99         case FUTEX_WAIT_REQUEUE_PI:
100                 tprintf(", %u", val);
101                 tprints(", ");
102                 print_ts(tcp, timeout);
103                 tprints(", ");
104                 printaddr(uaddr2);
105                 break;
106         case FUTEX_FD:
107         case FUTEX_WAKE:
108                 tprintf(", %u", val);
109                 break;
110         case FUTEX_UNLOCK_PI:
111         case FUTEX_TRYLOCK_PI:
112                 break;
113         default:
114                 tprintf(", %u", val);
115                 tprints(", ");
116                 printaddr(timeout);
117                 tprints(", ");
118                 printaddr(uaddr2);
119                 tprintf(", %#x", val3);
120                 break;
121         }
122
123         return RVAL_DECODED;
124 }
125
126 #if HAVE_ARCH_TIME32_SYSCALLS
127 SYS_FUNC(futex_time32)
128 {
129         return do_futex(tcp, print_timespec32);
130 }
131 #endif
132
133 SYS_FUNC(futex_time64)
134 {
135         return do_futex(tcp, print_timespec64);
136 }