futex: make output of the val3 argument of the FUTEX_WAKE_OP command more structured

It is a number which consists of several xlat values, not a structure.

* futex.c (SYS_FUNC(futex)): Modify output of the val3 argument
of the FUTEX_WAKE_OP futex syscall command.
* tests/futex.c (main): Update expected output.

Co-authored-by: Elvira Khabirova <lineprinter0@gmail.com>
This commit is contained in:
Eugene Syromyatnikov 2016-11-27 18:07:36 +03:00 committed by Dmitry V. Levin
parent d872902009
commit 01e9ac81c4
2 changed files with 53 additions and 42 deletions

18
futex.c
View File

@ -91,13 +91,19 @@ SYS_FUNC(futex)
tprintf(", %u", val);
tprintf(", %u, ", val2);
printaddr(uaddr2);
tprints(", {");
tprints(", ");
if ((val3 >> 28) & 8)
tprints("FUTEX_OP_OPARG_SHIFT|");
printxval(futexwakeops, (val3 >> 28) & 0x7, "FUTEX_OP_???");
tprintf(", %u, ", (val3 >> 12) & 0xfff);
printxval(futexwakecmps, (val3 >> 24) & 0xf, "FUTEX_OP_CMP_???");
tprintf(", %u}", val3 & 0xfff);
tprints("FUTEX_OP_OPARG_SHIFT<<28|");
if (printxval(futexwakeops, (val3 >> 28) & 0x7, NULL))
tprints("<<28");
else
tprints("<<28 /* FUTEX_OP_??? */");
tprintf("|%#x<<12|", (val3 >> 12) & 0xfff);
if (printxval(futexwakecmps, (val3 >> 24) & 0xf, NULL))
tprints("<<24");
else
tprints("<<24 /* FUTEX_OP_CMP_??? */");
tprintf("|%#x", val3 & 0xfff);
break;
case FUTEX_WAIT_REQUEUE_PI:
tprintf(", %u", val);

View File

@ -474,42 +474,47 @@ main(int argc, char *argv[])
int err;
const char *errstr;
} wake_ops[] = {
{ 0x00000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, 0}" },
{ 0x00fff000, "{FUTEX_OP_SET, 4095, FUTEX_OP_CMP_EQ, 0}" },
{ 0x00000fff, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, 4095}" },
{ 0x00ffffff, "{FUTEX_OP_SET, 4095, FUTEX_OP_CMP_EQ, 4095}" },
{ 0x10000000, "{FUTEX_OP_ADD, 0, FUTEX_OP_CMP_EQ, 0}" },
{ 0x20000000, "{FUTEX_OP_OR, 0, FUTEX_OP_CMP_EQ, 0}" },
{ 0x30000000, "{FUTEX_OP_ANDN, 0, FUTEX_OP_CMP_EQ, 0}" },
{ 0x40000000, "{FUTEX_OP_XOR, 0, FUTEX_OP_CMP_EQ, 0}" },
{ 0x50000000, "{0x5 /* FUTEX_OP_??? */, 0, FUTEX_OP_CMP_EQ, 0}",
{ 0x00000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
{ 0x00fff000, "FUTEX_OP_SET<<28|0xfff<<12|FUTEX_OP_CMP_EQ<<24|"
"0" },
{ 0x00000fff, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_EQ<<24|"
"0xfff" },
{ 0x00ffffff, "FUTEX_OP_SET<<28|0xfff<<12|FUTEX_OP_CMP_EQ<<24|"
"0xfff" },
{ 0x10000000, "FUTEX_OP_ADD<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
{ 0x20000000, "FUTEX_OP_OR<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
{ 0x30000000, "FUTEX_OP_ANDN<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
{ 0x40000000, "FUTEX_OP_XOR<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
{ 0x50000000, "0x5<<28 /* FUTEX_OP_??? */|0<<12|"
"FUTEX_OP_CMP_EQ<<24|0", ENOSYS, "ENOSYS" },
{ 0x70000000, "0x7<<28 /* FUTEX_OP_??? */|0<<12|"
"FUTEX_OP_CMP_EQ<<24|0", ENOSYS, "ENOSYS" },
{ 0x80000000, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_SET<<28|0<<12|"
"FUTEX_OP_CMP_EQ<<24|0" },
{ 0xa0caffee, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_OR<<28|"
"0xcaf<<12|FUTEX_OP_CMP_EQ<<24|0xfee" },
{ 0x01000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_NE<<24|0" },
{ 0x01234567, "FUTEX_OP_SET<<28|0x234<<12|FUTEX_OP_CMP_NE<<24|"
"0x567" },
{ 0x02000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_LT<<24|0" },
{ 0x03000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_LE<<24|0" },
{ 0x04000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_GT<<24|0" },
{ 0x05000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_GE<<24|0" },
{ 0x06000000, "FUTEX_OP_SET<<28|0<<12|"
"0x6<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
{ 0x07000000, "FUTEX_OP_SET<<28|0<<12|"
"0x7<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
{ 0x08000000, "FUTEX_OP_SET<<28|0<<12|"
"0x8<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
{ 0x0f000000, "FUTEX_OP_SET<<28|0<<12|"
"0xf<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
{ 0xbadfaced, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_ANDN<<28|"
"0xdfa<<12|0xa<<24 /* FUTEX_OP_CMP_??? */|0xced",
ENOSYS, "ENOSYS" },
{ 0x70000000, "{0x7 /* FUTEX_OP_??? */, 0, FUTEX_OP_CMP_EQ, 0}",
{ 0xffffffff, "FUTEX_OP_OPARG_SHIFT<<28|"
"0x7<<28 /* FUTEX_OP_??? */|0xfff<<12|"
"0xf<<24 /* FUTEX_OP_CMP_??? */|0xfff",
ENOSYS, "ENOSYS" },
{ 0x80000000, "{FUTEX_OP_OPARG_SHIFT|FUTEX_OP_SET, 0, "
"FUTEX_OP_CMP_EQ, 0}" },
{ 0xa0caffee, "{FUTEX_OP_OPARG_SHIFT|FUTEX_OP_OR, 3247, "
"FUTEX_OP_CMP_EQ, 4078}" },
{ 0x01000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_NE, 0}" },
{ 0x01234567, "{FUTEX_OP_SET, 564, FUTEX_OP_CMP_NE, 1383}" },
{ 0x02000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_LT, 0}" },
{ 0x03000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_LE, 0}" },
{ 0x04000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 0}" },
{ 0x05000000, "{FUTEX_OP_SET, 0, FUTEX_OP_CMP_GE, 0}" },
{ 0x06000000, "{FUTEX_OP_SET, 0, 0x6 /* FUTEX_OP_CMP_??? */, "
"0}", ENOSYS, "ENOSYS" },
{ 0x07000000, "{FUTEX_OP_SET, 0, 0x7 /* FUTEX_OP_CMP_??? */, "
"0}", ENOSYS, "ENOSYS" },
{ 0x08000000, "{FUTEX_OP_SET, 0, 0x8 /* FUTEX_OP_CMP_??? */, "
"0}", ENOSYS, "ENOSYS" },
{ 0x0f000000, "{FUTEX_OP_SET, 0, 0xf /* FUTEX_OP_CMP_??? */, "
"0}", ENOSYS, "ENOSYS" },
{ 0xbadfaced, "{FUTEX_OP_OPARG_SHIFT|FUTEX_OP_ANDN, "
"3578, 0xa /* FUTEX_OP_CMP_??? */, 3309}", ENOSYS,
"ENOSYS" },
{ 0xffffffff, "{FUTEX_OP_OPARG_SHIFT|0x7 /* FUTEX_OP_??? */, "
"4095, 0xf /* FUTEX_OP_CMP_??? */, 4095}", ENOSYS,
"ENOSYS" },
};
for (i = 0; i < ARRAY_SIZE(wake_ops); i++) {
@ -526,8 +531,8 @@ main(int argc, char *argv[])
CHECK_INVALID_CLOCKRT(FUTEX_WAKE_OP, ARG3 | ARG4 | ARG5 | ARG6,
"%u", "%u", "%#lx",
/* Decoding of the 0xdeadbee4 value */
"{FUTEX_OP_OPARG_SHIFT|0x5 /* FUTEX_OP_??? */, 2779, "
"0xe /* FUTEX_OP_CMP_??? */, 3812}");
"FUTEX_OP_OPARG_SHIFT<<28|0x5<<28 /* FUTEX_OP_??? */|0xadb<<12|"
"0xe<<24 /* FUTEX_OP_CMP_??? */|0xee4");
/* FUTEX_LOCK_PI - slow path for mutex lock with process inheritance
* support. Expect that futex has 0 in unlocked case and