diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-11-22 08:10:17 -0800 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-11-22 08:10:17 -0800 |
commit | 7d2238d3ec8f9177dec008d35d1f541114e543a2 (patch) | |
tree | 3fdcb13358e9e21c06d9692761c0489465a06959 | |
parent | 26cc77ca7d1eb7697aec1b5f6706b7bf8aebc94f (diff) | |
download | misc-tests-7d2238d3ec8f9177dec008d35d1f541114e543a2.tar.gz |
dump_all_pmcs: Add a try_harder option
-rw-r--r-- | dump_all_pmcs.c | 37 |
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++) |