181de3bf3SJiri Olsa #include <linux/perf_event.h>
281de3bf3SJiri Olsa #include <perf/evlist.h>
381de3bf3SJiri Olsa #include <perf/evsel.h>
481de3bf3SJiri Olsa #include <perf/cpumap.h>
581de3bf3SJiri Olsa #include <perf/threadmap.h>
681de3bf3SJiri Olsa #include <perf/mmap.h>
781de3bf3SJiri Olsa #include <perf/core.h>
881de3bf3SJiri Olsa #include <perf/event.h>
981de3bf3SJiri Olsa #include <stdio.h>
1081de3bf3SJiri Olsa #include <unistd.h>
1181de3bf3SJiri Olsa
libperf_print(enum libperf_print_level level,const char * fmt,va_list ap)1281de3bf3SJiri Olsa static int libperf_print(enum libperf_print_level level,
1381de3bf3SJiri Olsa const char *fmt, va_list ap)
1481de3bf3SJiri Olsa {
1581de3bf3SJiri Olsa return vfprintf(stderr, fmt, ap);
1681de3bf3SJiri Olsa }
1781de3bf3SJiri Olsa
1881de3bf3SJiri Olsa union u64_swap {
1981de3bf3SJiri Olsa __u64 val64;
2081de3bf3SJiri Olsa __u32 val32[2];
2181de3bf3SJiri Olsa };
2281de3bf3SJiri Olsa
main(int argc,char ** argv)2381de3bf3SJiri Olsa int main(int argc, char **argv)
2481de3bf3SJiri Olsa {
2581de3bf3SJiri Olsa struct perf_evlist *evlist;
2681de3bf3SJiri Olsa struct perf_evsel *evsel;
2781de3bf3SJiri Olsa struct perf_mmap *map;
2881de3bf3SJiri Olsa struct perf_cpu_map *cpus;
2981de3bf3SJiri Olsa struct perf_event_attr attr = {
3081de3bf3SJiri Olsa .type = PERF_TYPE_HARDWARE,
3181de3bf3SJiri Olsa .config = PERF_COUNT_HW_CPU_CYCLES,
3281de3bf3SJiri Olsa .disabled = 1,
3381de3bf3SJiri Olsa .freq = 1,
3481de3bf3SJiri Olsa .sample_freq = 10,
3581de3bf3SJiri Olsa .sample_type = PERF_SAMPLE_IP|PERF_SAMPLE_TID|PERF_SAMPLE_CPU|PERF_SAMPLE_PERIOD,
3681de3bf3SJiri Olsa };
3781de3bf3SJiri Olsa int err = -1;
3881de3bf3SJiri Olsa union perf_event *event;
3981de3bf3SJiri Olsa
4081de3bf3SJiri Olsa libperf_init(libperf_print);
4181de3bf3SJiri Olsa
42*effe957cSIan Rogers cpus = perf_cpu_map__new_online_cpus();
4381de3bf3SJiri Olsa if (!cpus) {
4481de3bf3SJiri Olsa fprintf(stderr, "failed to create cpus\n");
4581de3bf3SJiri Olsa return -1;
4681de3bf3SJiri Olsa }
4781de3bf3SJiri Olsa
4881de3bf3SJiri Olsa evlist = perf_evlist__new();
4981de3bf3SJiri Olsa if (!evlist) {
5081de3bf3SJiri Olsa fprintf(stderr, "failed to create evlist\n");
5181de3bf3SJiri Olsa goto out_cpus;
5281de3bf3SJiri Olsa }
5381de3bf3SJiri Olsa
5481de3bf3SJiri Olsa evsel = perf_evsel__new(&attr);
5581de3bf3SJiri Olsa if (!evsel) {
5681de3bf3SJiri Olsa fprintf(stderr, "failed to create cycles\n");
5781de3bf3SJiri Olsa goto out_cpus;
5881de3bf3SJiri Olsa }
5981de3bf3SJiri Olsa
6081de3bf3SJiri Olsa perf_evlist__add(evlist, evsel);
6181de3bf3SJiri Olsa
6281de3bf3SJiri Olsa perf_evlist__set_maps(evlist, cpus, NULL);
6381de3bf3SJiri Olsa
6481de3bf3SJiri Olsa err = perf_evlist__open(evlist);
6581de3bf3SJiri Olsa if (err) {
6681de3bf3SJiri Olsa fprintf(stderr, "failed to open evlist\n");
6781de3bf3SJiri Olsa goto out_evlist;
6881de3bf3SJiri Olsa }
6981de3bf3SJiri Olsa
7081de3bf3SJiri Olsa err = perf_evlist__mmap(evlist, 4);
7181de3bf3SJiri Olsa if (err) {
7281de3bf3SJiri Olsa fprintf(stderr, "failed to mmap evlist\n");
7381de3bf3SJiri Olsa goto out_evlist;
7481de3bf3SJiri Olsa }
7581de3bf3SJiri Olsa
7681de3bf3SJiri Olsa perf_evlist__enable(evlist);
7781de3bf3SJiri Olsa sleep(3);
7881de3bf3SJiri Olsa perf_evlist__disable(evlist);
7981de3bf3SJiri Olsa
8081de3bf3SJiri Olsa perf_evlist__for_each_mmap(evlist, map, false) {
8181de3bf3SJiri Olsa if (perf_mmap__read_init(map) < 0)
8281de3bf3SJiri Olsa continue;
8381de3bf3SJiri Olsa
8481de3bf3SJiri Olsa while ((event = perf_mmap__read_event(map)) != NULL) {
8581de3bf3SJiri Olsa int cpu, pid, tid;
8681de3bf3SJiri Olsa __u64 ip, period, *array;
8781de3bf3SJiri Olsa union u64_swap u;
8881de3bf3SJiri Olsa
8981de3bf3SJiri Olsa array = event->sample.array;
9081de3bf3SJiri Olsa
9181de3bf3SJiri Olsa ip = *array;
9281de3bf3SJiri Olsa array++;
9381de3bf3SJiri Olsa
9481de3bf3SJiri Olsa u.val64 = *array;
9581de3bf3SJiri Olsa pid = u.val32[0];
9681de3bf3SJiri Olsa tid = u.val32[1];
9781de3bf3SJiri Olsa array++;
9881de3bf3SJiri Olsa
9981de3bf3SJiri Olsa u.val64 = *array;
10081de3bf3SJiri Olsa cpu = u.val32[0];
10181de3bf3SJiri Olsa array++;
10281de3bf3SJiri Olsa
10381de3bf3SJiri Olsa period = *array;
10481de3bf3SJiri Olsa
10581de3bf3SJiri Olsa fprintf(stdout, "cpu %3d, pid %6d, tid %6d, ip %20llx, period %20llu\n",
10681de3bf3SJiri Olsa cpu, pid, tid, ip, period);
10781de3bf3SJiri Olsa
10881de3bf3SJiri Olsa perf_mmap__consume(map);
10981de3bf3SJiri Olsa }
11081de3bf3SJiri Olsa
11181de3bf3SJiri Olsa perf_mmap__read_done(map);
11281de3bf3SJiri Olsa }
11381de3bf3SJiri Olsa
11481de3bf3SJiri Olsa out_evlist:
11581de3bf3SJiri Olsa perf_evlist__delete(evlist);
11681de3bf3SJiri Olsa out_cpus:
11781de3bf3SJiri Olsa perf_cpu_map__put(cpus);
11881de3bf3SJiri Olsa return err;
11981de3bf3SJiri Olsa }
120