| /* |
| * @file op-perf-events-checker.c |
| * |
| * Utility program for determining the existence and functionality |
| * of the Linux kernel's Performance Events Subsystem. |
| * |
| * @remark Copyright 2011 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * Created on: Dec 7, 2011 |
| * @author Maynard Johnson |
| * (C) Copyright IBM Corp. 2011 |
| * |
| */ |
| |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include <asm/unistd.h> |
| #include <stdio.h> |
| #include <errno.h> |
| #include <string.h> |
| #include "config.h" |
| #if HAVE_PERF_EVENTS |
| #include <linux/perf_event.h> |
| struct perf_event_attr attr; |
| pid_t pid ; |
| #endif |
| |
| static void usage(void) |
| { |
| fprintf(stderr, "usage: op-check-perfevents [OPTION]\n"); |
| fprintf(stderr, "\t-h, --help\t\tPrint this help message\n"); |
| fprintf(stderr, "\t-v, --verbose\t\tPrint errno value of perf_event_open syscall\n"); |
| } |
| |
| int main(int argc, char **argv) |
| { |
| int _verbose = 0; |
| if (argc > 1) { |
| if ((!strcmp(argv[1], "-h")) || (!strcmp(argv[1], "--help"))) { |
| usage(); |
| return 0; |
| } else if ((!strcmp(argv[1], "-v")) || (!strcmp(argv[1], "--verbose"))) { |
| _verbose = 1; |
| } else { |
| usage(); |
| return -1; |
| } |
| } |
| |
| #if HAVE_PERF_EVENTS |
| /* Even if the perf_event_open syscall is implemented, the architecture may still |
| * not provide a full implementation of the perf_events subsystem, in which case, |
| * the syscall below will fail with ENOSYS (38). If the perf_events subsystem is |
| * implemented for the architecture, but the processor type on which this |
| * program is running is not supported by perf_events, the syscall returns |
| * ENOENT (2). |
| */ |
| memset(&attr, 0, sizeof(attr)); |
| attr.size = sizeof(attr); |
| attr.sample_type = PERF_SAMPLE_IP; |
| |
| pid = getpid(); |
| syscall(__NR_perf_event_open, &attr, pid, 0, -1, 0); |
| if (_verbose) |
| fprintf(stderr, "perf_event_open syscall returned %s\n", strerror(errno)); |
| return errno; |
| #else |
| return -1; |
| #endif |
| } |
| |