From: Dmitry V. Levin Date: Sun, 15 Nov 2015 02:29:29 +0000 (+0000) Subject: Implement membarrier syscall decoding X-Git-Tag: v4.11~141 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2aec1e67dfe78eea06db48a76adbd392d8ec5a31;p=strace Implement membarrier syscall decoding * membarrier.c: New file. * Makefile.am (strace_SOURCES): Add it. * xlat/membarrier_cmds.in: New file. * linux/dummy.h (membarrier): Remove. * tests/membarrier.c: New file. * tests/membarrier.test: New test. * tests/Makefile.am (check_PROGRAMS): Add membarrier. (TESTS): Add membarrier.test. * tests/.gitignore: Add membarrier. --- diff --git a/Makefile.am b/Makefile.am index 82cd7ca8..c6af7d99 100644 --- a/Makefile.am +++ b/Makefile.am @@ -86,6 +86,7 @@ strace_SOURCES = \ loop.c \ lseek.c \ mem.c \ + membarrier.c \ memfd_create.c \ mknod.c \ mount.c \ diff --git a/linux/dummy.h b/linux/dummy.h index 6c8d1452..e856bc99 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -37,7 +37,6 @@ #define sys_kcmp printargs #define sys_kexec_file_load printargs #define sys_lookup_dcookie printargs -#define sys_membarrier printargs #define sys_mlock2 printargs #define sys_name_to_handle_at printargs #define sys_open_by_handle_at printargs diff --git a/membarrier.c b/membarrier.c new file mode 100644 index 00000000..783a7083 --- /dev/null +++ b/membarrier.c @@ -0,0 +1,21 @@ +#include "defs.h" + +#include "xlat/membarrier_cmds.h" + +SYS_FUNC(membarrier) +{ + if (entering(tcp)) { + int cmd = tcp->u_arg[0], flags = tcp->u_arg[1]; + + printxval(membarrier_cmds, cmd, "MEMBARRIER_CMD_???"); + tprintf(", %d", flags); + + return cmd ? RVAL_DECODED : 0; + } + + if (syserror(tcp) || !tcp->u_rval) + return 0; + + tcp->auxstr = sprintflags("", membarrier_cmds, tcp->u_rval); + return RVAL_HEX | RVAL_STR; +} diff --git a/tests/.gitignore b/tests/.gitignore index c886eb92..79585e1a 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -18,6 +18,7 @@ ipc_msg ipc_msgbuf ipc_sem ipc_shm +membarrier memfd_create mmap mmap64 diff --git a/tests/Makefile.am b/tests/Makefile.am index e0e352f4..5aae4bd0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -31,6 +31,7 @@ check_PROGRAMS = \ ipc_msgbuf \ ipc_sem \ ipc_shm \ + membarrier \ memfd_create \ mmap \ mmap64 \ @@ -145,6 +146,7 @@ TESTS = \ stat64-v.test \ statfs.test \ sysinfo.test \ + membarrier.test \ memfd_create.test \ mmap.test \ mmap64.test \ diff --git a/tests/membarrier.c b/tests/membarrier.c new file mode 100644 index 00000000..d4c5c4ca --- /dev/null +++ b/tests/membarrier.c @@ -0,0 +1,31 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +int +main(void) +{ +#ifdef __NR_membarrier + if (syscall(__NR_membarrier, 3, 255) != -1) + return 77; + printf("membarrier(0x3 /* MEMBARRIER_CMD_??? */, 255) = -1 %s\n", + errno == ENOSYS ? + "ENOSYS (Function not implemented)" : + "EINVAL (Invalid argument)"); + if (errno != ENOSYS) { + if (syscall(__NR_membarrier, 0, 0) != 1) + return 1; /* the test needs to be updated? */ + puts("membarrier(MEMBARRIER_CMD_QUERY, 0)" + " = 0x1 (MEMBARRIER_CMD_SHARED)"); + } + puts("+++ exited with 0 +++"); + return 0; +#else + return 77; +#endif +} diff --git a/tests/membarrier.test b/tests/membarrier.test new file mode 100755 index 00000000..e55b606b --- /dev/null +++ b/tests/membarrier.test @@ -0,0 +1,13 @@ +#!/bin/sh + +# Check membarrier syscall decoding. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -a36 -emembarrier $args > "$OUT" +match_diff "$OUT" "$LOG" +rm -f "$OUT" + +exit 0 diff --git a/xlat/membarrier_cmds.in b/xlat/membarrier_cmds.in new file mode 100644 index 00000000..e087e8e3 --- /dev/null +++ b/xlat/membarrier_cmds.in @@ -0,0 +1,2 @@ +MEMBARRIER_CMD_QUERY 0 +MEMBARRIER_CMD_SHARED 1