From: Eugene Syromyatnikov Date: Wed, 29 Aug 2018 20:18:36 +0000 (+0200) Subject: futex: recognise FUTEX_BITSET_MATCH_ANY bitmask X-Git-Tag: v4.25~31 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c3ac40611c339ff0a80598a1f0bf5ab3d2120d99;p=strace futex: recognise FUTEX_BITSET_MATCH_ANY bitmask * xlat/futexbitset.in: New file. * futex.c: Include "xlat/futexbitset.h". (futex) : Decode val3 using futexbitset xlat. * tests/futex.c: Add checks for 0xffffffff bitset mask printing. Closes: Linux commit v4.16-rc1~166^2^2~2 --- diff --git a/futex.c b/futex.c index 9ce4ced5..e4dfa086 100644 --- a/futex.c +++ b/futex.c @@ -41,6 +41,7 @@ # define FUTEX_OP_OPARG_SHIFT 8 #endif +#include "xlat/futexbitset.h" #include "xlat/futexops.h" #include "xlat/futexwakeops.h" #include "xlat/futexwakecmps.h" @@ -74,11 +75,13 @@ SYS_FUNC(futex) tprintf(", %u", val); tprints(", "); print_timespec(tcp, timeout); - tprintf(", %#x", val3); + tprints(", "); + printxval(futexbitset, val3, NULL); break; case FUTEX_WAKE_BITSET: tprintf(", %u", val); - tprintf(", %#x", val3); + tprints(", "); + printxval(futexbitset, val3, NULL); break; case FUTEX_REQUEUE: tprintf(", %u", val); diff --git a/tests/futex.c b/tests/futex.c index 174100f3..5250d600 100644 --- a/tests/futex.c +++ b/tests/futex.c @@ -166,6 +166,9 @@ void invalid_op(int *val, int op, uint32_t argmask, ...) # define VAL3 ((unsigned long) 0xbadda7a09caffee1LLU) # define VAL3_PR ((unsigned) VAL3) +# define VAL3A ((unsigned long) 0xbadda7a0ffffffffLLU) +# define VAL3A_PR "FUTEX_BITSET_MATCH_ANY" + int main(int argc, char *argv[]) { @@ -288,6 +291,14 @@ main(int argc, char *argv[]) zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR, sprintrc(rc)); + CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, + VAL3A, (rc == -1) && (errno == EAGAIN)); + printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%lld, tv_nsec=%llu}" + ", %s) = %s\n", + uaddr, VAL_PR, (long long) tmout->tv_sec, + zero_extend_signed_to_ull(tmout->tv_nsec), VAL3A_PR, + sprintrc(rc)); + /* val3 of 0 is invalid */ CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, 0, (rc == -1) && (errno == EINVAL)); @@ -375,6 +386,11 @@ main(int argc, char *argv[]) printf("futex(%p, FUTEX_WAKE_BITSET, %u, %#x) = %s\n", uaddr, 10, VAL3_PR, sprintrc(rc)); + CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAKE_BITSET, 10, NULL, NULL, + VAL3A, (rc == 0)); + printf("futex(%p, FUTEX_WAKE_BITSET, %u, %s) = %s\n", uaddr, 10, + VAL3A_PR, sprintrc(rc)); + /* bitset 0 is invalid */ CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAKE_BITSET, 10, NULL, NULL, 0, (rc == -1) && (errno == EINVAL)); diff --git a/xlat/futexbitset.in b/xlat/futexbitset.in new file mode 100644 index 00000000..1290c87c --- /dev/null +++ b/xlat/futexbitset.in @@ -0,0 +1 @@ +FUTEX_BITSET_MATCH_ANY 0xffffffff