From 51942a9f14ab9f01919c6251183783e7dc4dbd42 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 5 Jul 2007 18:59:11 +0000 Subject: [PATCH] 2007-07-05 Roland McGrath * process.c [LINUX] (futexops): Add many new values. [LINUX] (futexwakeops, futexwakecmps): New tables. [LINUX] (sys_futex): Use them. From Ulrich Drepper . Fixes RH#241467. --- process.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 7 deletions(-) diff --git a/process.c b/process.c index d478293f..45f42b51 100644 --- a/process.c +++ b/process.c @@ -3067,12 +3067,75 @@ struct tcb *tcp; #endif /* !SVR4 */ #ifdef LINUX +# 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_CMP_REQUEUE_PI +# define FUTEX_CMP_REQUEUE_PI 9 +# endif +# ifndef FUTEX_PRIVATE_FLAG +# define FUTEX_PRIVATE_FLAG 128 +# endif static const struct xlat futexops[] = { - { FUTEX_WAIT, "FUTEX_WAIT" }, - { FUTEX_WAKE, "FUTEX_WAKE" }, - { FUTEX_FD, "FUTEX_FD" }, - { FUTEX_REQUEUE,"FUTEX_REQUEUE" }, - { 0, NULL } + { FUTEX_WAIT, "FUTEX_WAIT" }, + { FUTEX_WAKE, "FUTEX_WAKE" }, + { FUTEX_FD, "FUTEX_FD" }, + { FUTEX_REQUEUE, "FUTEX_REQUEUE" }, + { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" }, + { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" }, + { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" }, + { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" }, + { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" }, + { FUTEX_CMP_REQUEUE_PI, "FUTEX_CMP_REQUEUE_PI" }, + { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" }, + { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" }, + { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" }, + { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" }, + { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" }, + { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" }, + { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" }, + { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" }, + { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" }, + { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PI_PRIVATE" }, + { 0, NULL } +}; +#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 +static const struct xlat futexwakeops[] = { + { FUTEX_OP_SET, "FUTEX_OP_SET" }, + { FUTEX_OP_ADD, "FUTEX_OP_ADD" }, + { FUTEX_OP_OR, "FUTEX_OP_OR" }, + { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" }, + { FUTEX_OP_XOR, "FUTEX_OP_XOR" }, + { 0, NULL } +}; +static const struct xlat futexwakecmps[] = { + { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" }, + { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" }, + { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" }, + { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" }, + { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" }, + { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" }, + { 0, NULL } }; int @@ -3080,14 +3143,28 @@ sys_futex(tcp) struct tcb *tcp; { if (entering(tcp)) { + long int cmd = tcp->u_arg[1] & ~FUTEX_PRIVATE_FLAG; tprintf("%p, ", (void *) tcp->u_arg[0]); printxval(futexops, tcp->u_arg[1], "FUTEX_???"); tprintf(", %ld", tcp->u_arg[2]); - if (tcp->u_arg[1] == FUTEX_WAIT) { + if (cmd == FUTEX_WAIT) { tprintf(", "); printtv(tcp, tcp->u_arg[3]); - } else if (tcp->u_arg[1] == FUTEX_REQUEUE) + } else if (cmd == FUTEX_REQUEUE) tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]); + else if (cmd == FUTEX_CMP_REQUEUE) + 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) + tprintf("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) + tprintf("FUTEX_OP_OPARG_SHIFT|"); + printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???"); + tprintf(", %ld}", tcp->u_arg[5] & 0xfff); + } } return 0; } -- 2.40.0