[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