18c2ecf20Sopenharmony_ci#include <linux/perf_event.h>
28c2ecf20Sopenharmony_ci#include <perf/evlist.h>
38c2ecf20Sopenharmony_ci#include <perf/evsel.h>
48c2ecf20Sopenharmony_ci#include <perf/cpumap.h>
58c2ecf20Sopenharmony_ci#include <perf/threadmap.h>
68c2ecf20Sopenharmony_ci#include <perf/mmap.h>
78c2ecf20Sopenharmony_ci#include <perf/core.h>
88c2ecf20Sopenharmony_ci#include <perf/event.h>
98c2ecf20Sopenharmony_ci#include <stdio.h>
108c2ecf20Sopenharmony_ci#include <unistd.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistatic int libperf_print(enum libperf_print_level level,
138c2ecf20Sopenharmony_ci                         const char *fmt, va_list ap)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	return vfprintf(stderr, fmt, ap);
168c2ecf20Sopenharmony_ci}
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciint main(int argc, char **argv)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	int count = 100000, err = 0;
218c2ecf20Sopenharmony_ci	struct perf_evlist *evlist;
228c2ecf20Sopenharmony_ci	struct perf_evsel *evsel;
238c2ecf20Sopenharmony_ci	struct perf_thread_map *threads;
248c2ecf20Sopenharmony_ci	struct perf_counts_values counts;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	struct perf_event_attr attr1 = {
278c2ecf20Sopenharmony_ci		.type        = PERF_TYPE_SOFTWARE,
288c2ecf20Sopenharmony_ci		.config      = PERF_COUNT_SW_CPU_CLOCK,
298c2ecf20Sopenharmony_ci		.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
308c2ecf20Sopenharmony_ci		.disabled    = 1,
318c2ecf20Sopenharmony_ci	};
328c2ecf20Sopenharmony_ci	struct perf_event_attr attr2 = {
338c2ecf20Sopenharmony_ci		.type        = PERF_TYPE_SOFTWARE,
348c2ecf20Sopenharmony_ci		.config      = PERF_COUNT_SW_TASK_CLOCK,
358c2ecf20Sopenharmony_ci		.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
368c2ecf20Sopenharmony_ci		.disabled    = 1,
378c2ecf20Sopenharmony_ci	};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	libperf_init(libperf_print);
408c2ecf20Sopenharmony_ci	threads = perf_thread_map__new_dummy();
418c2ecf20Sopenharmony_ci	if (!threads) {
428c2ecf20Sopenharmony_ci		fprintf(stderr, "failed to create threads\n");
438c2ecf20Sopenharmony_ci		return -1;
448c2ecf20Sopenharmony_ci	}
458c2ecf20Sopenharmony_ci	perf_thread_map__set_pid(threads, 0, 0);
468c2ecf20Sopenharmony_ci	evlist = perf_evlist__new();
478c2ecf20Sopenharmony_ci	if (!evlist) {
488c2ecf20Sopenharmony_ci		fprintf(stderr, "failed to create evlist\n");
498c2ecf20Sopenharmony_ci		goto out_threads;
508c2ecf20Sopenharmony_ci	}
518c2ecf20Sopenharmony_ci	evsel = perf_evsel__new(&attr1);
528c2ecf20Sopenharmony_ci	if (!evsel) {
538c2ecf20Sopenharmony_ci		fprintf(stderr, "failed to create evsel1\n");
548c2ecf20Sopenharmony_ci		goto out_evlist;
558c2ecf20Sopenharmony_ci	}
568c2ecf20Sopenharmony_ci	perf_evlist__add(evlist, evsel);
578c2ecf20Sopenharmony_ci	evsel = perf_evsel__new(&attr2);
588c2ecf20Sopenharmony_ci	if (!evsel) {
598c2ecf20Sopenharmony_ci		fprintf(stderr, "failed to create evsel2\n");
608c2ecf20Sopenharmony_ci		goto out_evlist;
618c2ecf20Sopenharmony_ci	}
628c2ecf20Sopenharmony_ci	perf_evlist__add(evlist, evsel);
638c2ecf20Sopenharmony_ci	perf_evlist__set_maps(evlist, NULL, threads);
648c2ecf20Sopenharmony_ci	err = perf_evlist__open(evlist);
658c2ecf20Sopenharmony_ci	if (err) {
668c2ecf20Sopenharmony_ci		fprintf(stderr, "failed to open evsel\n");
678c2ecf20Sopenharmony_ci		goto out_evlist;
688c2ecf20Sopenharmony_ci	}
698c2ecf20Sopenharmony_ci	perf_evlist__enable(evlist);
708c2ecf20Sopenharmony_ci	while (count--);
718c2ecf20Sopenharmony_ci	perf_evlist__disable(evlist);
728c2ecf20Sopenharmony_ci	perf_evlist__for_each_evsel(evlist, evsel) {
738c2ecf20Sopenharmony_ci		perf_evsel__read(evsel, 0, 0, &counts);
748c2ecf20Sopenharmony_ci		fprintf(stdout, "count %llu, enabled %llu, run %llu\n",
758c2ecf20Sopenharmony_ci				counts.val, counts.ena, counts.run);
768c2ecf20Sopenharmony_ci	}
778c2ecf20Sopenharmony_ci	perf_evlist__close(evlist);
788c2ecf20Sopenharmony_ciout_evlist:
798c2ecf20Sopenharmony_ci	perf_evlist__delete(evlist);
808c2ecf20Sopenharmony_ciout_threads:
818c2ecf20Sopenharmony_ci	perf_thread_map__put(threads);
828c2ecf20Sopenharmony_ci	return err;
838c2ecf20Sopenharmony_ci}
84