[PATCH 1/9] tests: check decoding of perf_event_open syscall
Eugene Syromyatnikov
evgsyr at gmail.com
Mon Sep 5 01:31:03 UTC 2016
* tests/perf_event_open.c: New file.
* tests/perf_event_open.test: New test.
* tests/.gitignore: Add perf_event_open.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add perf_event_open.test.
---
tests/.gitignore | 1 +
tests/Makefile.am | 2 ++
tests/perf_event_open.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
tests/perf_event_open.test | 6 ++++
4 files changed, 92 insertions(+)
create mode 100644 tests/perf_event_open.c
create mode 100755 tests/perf_event_open.test
diff --git a/tests/.gitignore b/tests/.gitignore
index 8c41bea..84a795d 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -170,6 +170,7 @@ open
openat
pause
pc
+perf_event_open
personality
pipe
poll
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0b3b818..3e3d073 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -227,6 +227,7 @@ check_PROGRAMS = \
openat \
pause \
pc \
+ perf_event_open \
personality \
pipe \
poll \
@@ -555,6 +556,7 @@ DECODER_TESTS = \
open.test \
openat.test \
pause.test \
+ perf_event_open.test \
personality.test \
pipe.test \
poll.test \
diff --git a/tests/perf_event_open.c b/tests/perf_event_open.c
new file mode 100644
index 0000000..afdd71d
--- /dev/null
+++ b/tests/perf_event_open.c
@@ -0,0 +1,83 @@
+#include "tests.h"
+#include <asm/unistd.h>
+
+#ifdef __NR_perf_event_open
+
+# include <limits.h>
+# include <stdio.h>
+# include <unistd.h>
+
+# include <linux/hw_breakpoint.h>
+# include <linux/perf_event.h>
+
+#if ULONG_MAX > UINT_MAX
+#define LONG_STR_PREFIX "ffffffff"
+#else
+#define LONG_STR_PREFIX ""
+#endif
+
+static const char *printaddr(void *ptr)
+{
+ static char buf[sizeof("0x") + sizeof(void *) * 2];
+
+ if (ptr == NULL)
+ return "NULL";
+
+ snprintf(buf, sizeof(buf), "%#lx", (unsigned long)ptr);
+
+ return buf;
+}
+
+int
+main(void)
+{
+ struct perf_event_attr *attr = tail_alloc(sizeof(*attr));
+
+ attr->type = PERF_TYPE_HARDWARE;
+ attr->size = sizeof(*attr);
+
+ struct {
+ struct perf_event_attr *attr;
+ pid_t pid;
+ int cpu;
+ int group_fd;
+ unsigned long flags;
+ const char *flags_str;
+ } args[] = {
+ { NULL, 0xfacef00d, 0xbadabba7, -1,
+ (unsigned long)0xFFFFFFFFFFFFFFFFLLU,
+ "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
+ "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC|"
+ "0x" LONG_STR_PREFIX "fffffff0"
+ },
+ { attr + 1, 0, 0, 0,
+ 0, "0" },
+ { attr, -1, -1, 1,
+ PERF_FLAG_FD_CLOEXEC, "PERF_FLAG_FD_CLOEXEC" },
+ { attr - 1, -100, 100, 0xface1e55,
+ PERF_FLAG_FD_NO_GROUP | PERF_FLAG_FD_OUTPUT |
+ PERF_FLAG_PID_CGROUP | PERF_FLAG_FD_CLOEXEC,
+ "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
+ "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC" },
+ };
+ size_t i;
+ int rc;
+
+ for (i = 0; i < ARRAY_SIZE(args); i++) {
+ rc = syscall(__NR_perf_event_open, args[i].attr, args[i].pid,
+ args[i].cpu, args[i].group_fd, args[i].flags);
+ printf("perf_event_open(%s, %d, %d, %d, %s) = %s\n",
+ printaddr(args[i].attr), args[i].pid, args[i].cpu,
+ args[i].group_fd, args[i].flags_str, sprintrc(rc));
+ }
+
+ puts("+++ exited with 0 +++");
+ return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_perf_event_open")
+
+#endif
+
diff --git a/tests/perf_event_open.test b/tests/perf_event_open.test
new file mode 100755
index 0000000..af3860a
--- /dev/null
+++ b/tests/perf_event_open.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check perf_event_open syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
--
1.7.10.4
More information about the Strace-devel
mailing list