]> granicus.if.org Git - strace/commitdiff
Implement membarrier syscall decoding
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 15 Nov 2015 02:29:29 +0000 (02:29 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 17 Nov 2015 00:40:22 +0000 (00:40 +0000)
* 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.

Makefile.am
linux/dummy.h
membarrier.c [new file with mode: 0644]
tests/.gitignore
tests/Makefile.am
tests/membarrier.c [new file with mode: 0644]
tests/membarrier.test [new file with mode: 0755]
xlat/membarrier_cmds.in [new file with mode: 0644]

index 82cd7ca8f1416c4e8829d397215c2632662b35fa..c6af7d9921ff3a89de4a6cb383c591636034634e 100644 (file)
@@ -86,6 +86,7 @@ strace_SOURCES =      \
        loop.c          \
        lseek.c         \
        mem.c           \
+       membarrier.c    \
        memfd_create.c  \
        mknod.c         \
        mount.c         \
index 6c8d1452a563989b6e3ba97edd3f5e0d5ef7ae35..e856bc99448af4f6e95106cd61135eeb07fb005b 100644 (file)
@@ -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 (file)
index 0000000..783a708
--- /dev/null
@@ -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;
+}
index c886eb92af98d0adc60c704cf5eb58a335420098..79585e1a1e01ff6d54fb7f18540e7c7885431057 100644 (file)
@@ -18,6 +18,7 @@ ipc_msg
 ipc_msgbuf
 ipc_sem
 ipc_shm
+membarrier
 memfd_create
 mmap
 mmap64
index e0e352f411c278e74d36e14355340d9ab843ef4b..5aae4bd0af4481d3028d832cf50d242eb2f15a65 100644 (file)
@@ -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 (file)
index 0000000..d4c5c4c
--- /dev/null
@@ -0,0 +1,31 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+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 (executable)
index 0000000..e55b606
--- /dev/null
@@ -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 (file)
index 0000000..e087e8e
--- /dev/null
@@ -0,0 +1,2 @@
+MEMBARRIER_CMD_QUERY   0
+MEMBARRIER_CMD_SHARED  1