summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-11-22 08:10:17 -0800
committerAndy Lutomirski <luto@amacapital.net>2014-11-22 08:10:17 -0800
commit7d2238d3ec8f9177dec008d35d1f541114e543a2 (patch)
tree3fdcb13358e9e21c06d9692761c0489465a06959
parent26cc77ca7d1eb7697aec1b5f6706b7bf8aebc94f (diff)
downloadmisc-tests-7d2238d3ec8f9177dec008d35d1f541114e543a2.tar.gz
dump_all_pmcs: Add a try_harder option
-rw-r--r--dump_all_pmcs.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/dump_all_pmcs.c b/dump_all_pmcs.c
index be7a043..8f0c943 100644
--- a/dump_all_pmcs.c
+++ b/dump_all_pmcs.c
@@ -9,6 +9,9 @@
#include <signal.h>
#include <string.h>
#include <err.h>
+#include <linux/perf_event.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
static volatile sig_atomic_t got_sigbus = 0;
@@ -58,8 +61,40 @@ __attribute__((noinline, noclone)) static void do_rdpmc(unsigned int ecx)
printf("PMC 0x%08X: 0x%08X%08X\n", ecx, edx, eax);
}
-int main()
+static int perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
+ int cpu, int group_fd, unsigned long flags)
{
+ return syscall(__NR_perf_event_open, hw_event, pid, cpu,
+ group_fd, flags);
+}
+
+static void* map_one(void)
+{
+ struct perf_event_attr pe;
+ int fd;
+
+ memset(&pe, 0, sizeof(struct perf_event_attr));
+ pe.type = PERF_TYPE_HARDWARE;
+ pe.size = sizeof(struct perf_event_attr);
+ pe.config = PERF_COUNT_HW_INSTRUCTIONS;
+ pe.disabled = 0;
+ pe.exclude_kernel = 1;
+ pe.exclude_hv = 1;
+
+ fd = perf_event_open(&pe, getpid(), -1, -1, 0);
+ if (fd == -1)
+ err(1, "perf_event_open");
+
+ return mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, 0);
+}
+
+int main(int argc, char **argv)
+{
+ if (argc == 2 && !strcmp(argv[1], "try_harder")) {
+ map_one();
+ munmap(map_one(), 4096);
+ }
+
sethandler(SIGSEGV, sigsegv, 0);
for (unsigned int i = 0; i < 4096; i++)