]> granicus.if.org Git - strace/commitdiff
Add more futex decoding.
authorAndreas Schwab <schwab@redhat.com>
Wed, 12 Aug 2009 07:54:42 +0000 (09:54 +0200)
committerAndreas Schwab <schwab@redhat.com>
Wed, 12 Aug 2009 07:56:16 +0000 (09:56 +0200)
* process.c (FUTEX_WAIT_REQUEUE_PI, FUTEX_CMP_REQUEUE_PI)
(FUTEX_PRIVATE_FLAG, FUTEX_CLOCK_REALTIME): Define.
(futexops): Add entries for them.
(sys_futex): Decode FUTEX_CMP_REQUEUE_PI and
FUTEX_WAIT_REQUEUE_PI.

process.c

index afd36bb8fb098443e0e45e62aeae265b7b2aa11d..45ba33bfabc844d21fb7f98d4b630ea2c5f785f9 100644 (file)
--- a/process.c
+++ b/process.c
@@ -3440,9 +3440,18 @@ sys_ptrace(struct tcb *tcp)
 # 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
 static const struct xlat futexops[] = {
        { FUTEX_WAIT,                                   "FUTEX_WAIT" },
        { FUTEX_WAKE,                                   "FUTEX_WAKE" },
@@ -3455,6 +3464,8 @@ static const struct xlat futexops[] = {
        { FUTEX_TRYLOCK_PI,                             "FUTEX_TRYLOCK_PI" },
        { FUTEX_WAIT_BITSET,                            "FUTEX_WAIT_BITSET" },
        { FUTEX_WAKE_BITSET,                            "FUTEX_WAKE_BITSET" },
+       { FUTEX_WAIT_REQUEUE_PI,                        "FUTEX_WAIT_REQUEUE_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" },
@@ -3466,6 +3477,12 @@ static const struct xlat futexops[] = {
        { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG,          "FUTEX_TRYLOCK_PI_PRIVATE" },
        { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG,         "FUTEX_WAIT_BITSET_PRIVATE" },
        { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG,         "FUTEX_WAKE_BITSET_PRIVATE" },
+       { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG,     "FUTEX_WAIT_REQUEUE_PI_PRIVATE" },
+       { FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG,      "FUTEX_CMP_REQUEUE_PI_PRIVATE" },
+       { FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME,       "FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME" },
+       { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME,    "FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME" },
+       { FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME,   "FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME" },
+       { FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME,        "FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME" },
        { 0,                                            NULL }
 };
 # ifndef FUTEX_OP_SET
@@ -3518,7 +3535,7 @@ sys_futex(struct tcb *tcp)
                        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)
+               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]);
@@ -3530,6 +3547,10 @@ sys_futex(struct tcb *tcp)
                                tprintf("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) {
+                       tprintf(", ");
+                       printtv(tcp, tcp->u_arg[3]);
+                       tprintf(", %p", (void *) tcp->u_arg[4]);
                }
        }
        return 0;