Improve perf_event_open argument decoding

* configure.ac (AC_CHECK_HEADERS): Add linux/perf_event.h.
* desc.c [HAVE_LINUX_PERF_EVENT_H]: Include <linux/perf_event.h>.
(perf_event_open_flags): New xlat structure.
(sys_perf_event_open): New function.
* linux/dummy.h (sys_perf_event_open): Remove.
* linux/syscall.h (sys_perf_event_open): New prototype.

Signed-off-by: Ben Noordhuis <info@bnoordhuis.nl>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
diff --git a/configure.ac b/configure.ac
index f44eaf1..80be383 100644
--- a/configure.ac
+++ b/configure.ac
@@ -196,6 +196,7 @@
 	ioctls.h
 	libaio.h
 	linux/capability.h
+	linux/perf_event.h
 	linux/ptrace.h
 	linux/utsname.h
 	mqueue.h
diff --git a/desc.c b/desc.c
index f0c1890..e75ed4f 100644
--- a/desc.c
+++ b/desc.c
@@ -37,6 +37,9 @@
 #ifdef HAVE_LIBAIO_H
 # include <libaio.h>
 #endif
+#ifdef HAVE_LINUX_PERF_EVENT_H
+# include  <linux/perf_event.h>
+#endif
 
 #if HAVE_LONG_LONG_OFF_T
 /*
@@ -222,6 +225,19 @@
 	{ 0,		NULL		},
 };
 
+static const struct xlat perf_event_open_flags[] = {
+#ifdef PERF_FLAG_FD_NO_GROUP
+	{ PERF_FLAG_FD_NO_GROUP,	"PERF_FLAG_FD_NO_GROUP"	},
+#endif
+#ifdef PERF_FLAG_FD_OUTPUT
+	{ PERF_FLAG_FD_OUTPUT,		"PERF_FLAG_FD_OUTPUT"	},
+#endif
+#ifdef PERF_FLAG_PID_CGROUP
+	{ PERF_FLAG_PID_CGROUP,		"PERF_FLAG_PID_CGROUP"	},
+#endif
+	{ 0,				NULL			},
+};
+
 #ifndef HAVE_LONG_LONG_OFF_T
 /* fcntl/lockf */
 static void
@@ -1068,3 +1084,18 @@
 {
 	return do_eventfd(tcp, 1);
 }
+
+int
+sys_perf_event_open(struct tcb *tcp)
+{
+	if (entering(tcp)) {
+		tprintf("%#lx, %d, %d, %d, ",
+			tcp->u_arg[0],
+			(int) tcp->u_arg[1],
+			(int) tcp->u_arg[2],
+			(int) tcp->u_arg[3]);
+		printflags(perf_event_open_flags, tcp->u_arg[4],
+			   "PERF_FLAG_???");
+	}
+	return 0;
+}
diff --git a/linux/dummy.h b/linux/dummy.h
index ce340b9..182896e 100644
--- a/linux/dummy.h
+++ b/linux/dummy.h
@@ -39,7 +39,6 @@
 #define	sys_lookup_dcookie	printargs
 #define	sys_name_to_handle_at	printargs
 #define	sys_open_by_handle_at	printargs
-#define	sys_perf_event_open	printargs
 #define	sys_request_key		printargs
 #define	sys_sync_file_range	printargs
 #define	sys_sysfs		printargs
diff --git a/linux/syscall.h b/linux/syscall.h
index 7e0155e..81b4c69 100644
--- a/linux/syscall.h
+++ b/linux/syscall.h
@@ -163,6 +163,7 @@
 int sys_oldstat();
 int sys_open();
 int sys_openat();
+int sys_perf_event_open();
 int sys_personality();
 int sys_pipe();
 int sys_pipe2();