From: Dmitry V. Levin Date: Thu, 11 Dec 2014 19:25:02 +0000 (+0000) Subject: process.c: move futex parser to a separate file X-Git-Tag: v4.10~303 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e314f808bfb3d991ef767a3be4793d62e6c9d8e1;p=strace process.c: move futex parser to a separate file * futex.c: New file. * Makefile.am (strace_SOURCES): Add it. * process.c: Move sys_futex and related code to futex.c. --- diff --git a/Makefile.am b/Makefile.am index 917e08c7..93421237 100644 --- a/Makefile.am +++ b/Makefile.am @@ -34,6 +34,7 @@ strace_SOURCES = \ fallocate.c \ fanotify.c \ file.c \ + futex.c \ get_robust_list.c \ getcpu.c \ getcwd.c \ diff --git a/futex.c b/futex.c new file mode 100644 index 00000000..a1781c0e --- /dev/null +++ b/futex.c @@ -0,0 +1,139 @@ +#include "defs.h" + +#ifdef HAVE_LINUX_FUTEX_H +# include +#endif + +#ifndef FUTEX_WAIT +# define FUTEX_WAIT 0 +#endif +#ifndef FUTEX_WAKE +# define FUTEX_WAKE 1 +#endif +#ifndef FUTEX_FD +# define FUTEX_FD 2 +#endif +#ifndef FUTEX_REQUEUE +# define FUTEX_REQUEUE 3 +#endif +#ifndef FUTEX_CMP_REQUEUE +# define FUTEX_CMP_REQUEUE 4 +#endif +#ifndef FUTEX_WAKE_OP +# define FUTEX_WAKE_OP 5 +#endif +#ifndef FUTEX_LOCK_PI +# define FUTEX_LOCK_PI 6 +# define FUTEX_UNLOCK_PI 7 +# define FUTEX_TRYLOCK_PI 8 +#endif +#ifndef FUTEX_WAIT_BITSET +# define FUTEX_WAIT_BITSET 9 +#endif +#ifndef FUTEX_WAKE_BITSET +# define FUTEX_WAKE_BITSET 10 +#endif +#ifndef FUTEX_WAIT_REQUEUE_PI +# define FUTEX_WAIT_REQUEUE_PI 11 +#endif +#ifndef FUTEX_CMP_REQUEUE_PI +# define FUTEX_CMP_REQUEUE_PI 12 +#endif +#ifndef FUTEX_PRIVATE_FLAG +# define FUTEX_PRIVATE_FLAG 128 +#endif +#ifndef FUTEX_CLOCK_REALTIME +# define FUTEX_CLOCK_REALTIME 256 +#endif +#ifndef FUTEX_WAIT_PRIVATE +# define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_PRIVATE +# define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_REQUEUE_PRIVATE +# define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_CMP_REQUEUE_PRIVATE +# define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_OP_PRIVATE +# define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_LOCK_PI_PRIVATE +# define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_UNLOCK_PI_PRIVATE +# define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_TRYLOCK_PI_PRIVATE +# define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAIT_BITSET_PRIVATE +# define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_BITSET_PRIVATE +# define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE +# define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE +# define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG) +#endif +#include "xlat/futexops.h" +#ifndef FUTEX_OP_SET +# define FUTEX_OP_SET 0 +# define FUTEX_OP_ADD 1 +# define FUTEX_OP_OR 2 +# define FUTEX_OP_ANDN 3 +# define FUTEX_OP_XOR 4 +# define FUTEX_OP_CMP_EQ 0 +# define FUTEX_OP_CMP_NE 1 +# define FUTEX_OP_CMP_LT 2 +# define FUTEX_OP_CMP_LE 3 +# define FUTEX_OP_CMP_GT 4 +# define FUTEX_OP_CMP_GE 5 +#endif +#include "xlat/futexwakeops.h" +#include "xlat/futexwakecmps.h" + +int +sys_futex(struct tcb *tcp) +{ + if (entering(tcp)) { + long int cmd = tcp->u_arg[1] & 127; + tprintf("%p, ", (void *) tcp->u_arg[0]); + printxval(futexops, tcp->u_arg[1], "FUTEX_???"); + tprintf(", %ld", tcp->u_arg[2]); + if (cmd == FUTEX_WAKE_BITSET) + tprintf(", %lx", tcp->u_arg[5]); + else if (cmd == FUTEX_WAIT) { + tprints(", "); + printtv(tcp, tcp->u_arg[3]); + } else if (cmd == FUTEX_WAIT_BITSET) { + tprints(", "); + printtv(tcp, tcp->u_arg[3]); + tprintf(", %lx", tcp->u_arg[5]); + } else if (cmd == FUTEX_REQUEUE) + tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]); + else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI) + tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]); + else if (cmd == FUTEX_WAKE_OP) { + tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]); + if ((tcp->u_arg[5] >> 28) & 8) + tprints("FUTEX_OP_OPARG_SHIFT|"); + printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???"); + tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff); + if ((tcp->u_arg[5] >> 24) & 8) + tprints("FUTEX_OP_OPARG_SHIFT|"); + printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???"); + tprintf(", %ld}", tcp->u_arg[5] & 0xfff); + } else if (cmd == FUTEX_WAIT_REQUEUE_PI) { + tprints(", "); + printtv(tcp, tcp->u_arg[3]); + tprintf(", %p", (void *) tcp->u_arg[4]); + } + } + return 0; +} diff --git a/process.c b/process.c index 46b980f0..05362278 100644 --- a/process.c +++ b/process.c @@ -74,22 +74,6 @@ # define PTRACE_SETREGS PTRACE_SETREGS64 #endif -#ifdef HAVE_LINUX_FUTEX_H -# include -#endif -#ifndef FUTEX_WAIT -# define FUTEX_WAIT 0 -#endif -#ifndef FUTEX_WAKE -# define FUTEX_WAKE 1 -#endif -#ifndef FUTEX_FD -# define FUTEX_FD 2 -#endif -#ifndef FUTEX_REQUEUE -# define FUTEX_REQUEUE 3 -#endif - #include #undef GETGROUPS_T #define GETGROUPS_T __kernel_gid_t @@ -2079,125 +2063,3 @@ sys_ptrace(struct tcb *tcp) } return 0; } - -#ifndef FUTEX_CMP_REQUEUE -# define FUTEX_CMP_REQUEUE 4 -#endif -#ifndef FUTEX_WAKE_OP -# define FUTEX_WAKE_OP 5 -#endif -#ifndef FUTEX_LOCK_PI -# define FUTEX_LOCK_PI 6 -# define FUTEX_UNLOCK_PI 7 -# define FUTEX_TRYLOCK_PI 8 -#endif -#ifndef FUTEX_WAIT_BITSET -# define FUTEX_WAIT_BITSET 9 -#endif -#ifndef FUTEX_WAKE_BITSET -# define FUTEX_WAKE_BITSET 10 -#endif -#ifndef FUTEX_WAIT_REQUEUE_PI -# define FUTEX_WAIT_REQUEUE_PI 11 -#endif -#ifndef FUTEX_CMP_REQUEUE_PI -# define FUTEX_CMP_REQUEUE_PI 12 -#endif -#ifndef FUTEX_PRIVATE_FLAG -# define FUTEX_PRIVATE_FLAG 128 -#endif -#ifndef FUTEX_CLOCK_REALTIME -# define FUTEX_CLOCK_REALTIME 256 -#endif -#ifndef FUTEX_WAIT_PRIVATE -# define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_WAKE_PRIVATE -# define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_REQUEUE_PRIVATE -# define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_CMP_REQUEUE_PRIVATE -# define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_WAKE_OP_PRIVATE -# define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_LOCK_PI_PRIVATE -# define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_UNLOCK_PI_PRIVATE -# define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_TRYLOCK_PI_PRIVATE -# define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_WAIT_BITSET_PRIVATE -# define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_WAKE_BITSET_PRIVATE -# define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE -# define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG) -#endif -#ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE -# define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG) -#endif -#include "xlat/futexops.h" -#ifndef FUTEX_OP_SET -# define FUTEX_OP_SET 0 -# define FUTEX_OP_ADD 1 -# define FUTEX_OP_OR 2 -# define FUTEX_OP_ANDN 3 -# define FUTEX_OP_XOR 4 -# define FUTEX_OP_CMP_EQ 0 -# define FUTEX_OP_CMP_NE 1 -# define FUTEX_OP_CMP_LT 2 -# define FUTEX_OP_CMP_LE 3 -# define FUTEX_OP_CMP_GT 4 -# define FUTEX_OP_CMP_GE 5 -#endif -#include "xlat/futexwakeops.h" -#include "xlat/futexwakecmps.h" - -int -sys_futex(struct tcb *tcp) -{ - if (entering(tcp)) { - long int cmd = tcp->u_arg[1] & 127; - tprintf("%p, ", (void *) tcp->u_arg[0]); - printxval(futexops, tcp->u_arg[1], "FUTEX_???"); - tprintf(", %ld", tcp->u_arg[2]); - if (cmd == FUTEX_WAKE_BITSET) - tprintf(", %lx", tcp->u_arg[5]); - else if (cmd == FUTEX_WAIT) { - tprints(", "); - printtv(tcp, tcp->u_arg[3]); - } else if (cmd == FUTEX_WAIT_BITSET) { - tprints(", "); - printtv(tcp, tcp->u_arg[3]); - tprintf(", %lx", tcp->u_arg[5]); - } else if (cmd == FUTEX_REQUEUE) - tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]); - else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI) - tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]); - else if (cmd == FUTEX_WAKE_OP) { - tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]); - if ((tcp->u_arg[5] >> 28) & 8) - tprints("FUTEX_OP_OPARG_SHIFT|"); - printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???"); - tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff); - if ((tcp->u_arg[5] >> 24) & 8) - tprints("FUTEX_OP_OPARG_SHIFT|"); - printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???"); - tprintf(", %ld}", tcp->u_arg[5] & 0xfff); - } else if (cmd == FUTEX_WAIT_REQUEUE_PI) { - tprints(", "); - printtv(tcp, tcp->u_arg[3]); - tprintf(", %p", (void *) tcp->u_arg[4]); - } - } - return 0; -}