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