* 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 ------------------------------------------------------------------------------ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel