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.
This commit is contained in:
parent
8357638568
commit
e314f808bf
@ -34,6 +34,7 @@ strace_SOURCES = \
|
||||
fallocate.c \
|
||||
fanotify.c \
|
||||
file.c \
|
||||
futex.c \
|
||||
get_robust_list.c \
|
||||
getcpu.c \
|
||||
getcwd.c \
|
||||
|
139
futex.c
Normal file
139
futex.c
Normal file
@ -0,0 +1,139 @@
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef HAVE_LINUX_FUTEX_H
|
||||
# include <linux/futex.h>
|
||||
#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;
|
||||
}
|
138
process.c
138
process.c
@ -74,22 +74,6 @@
|
||||
# define PTRACE_SETREGS PTRACE_SETREGS64
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINUX_FUTEX_H
|
||||
# include <linux/futex.h>
|
||||
#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 <asm/posix_types.h>
|
||||
#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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user