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_ciunion u64_swap { 198c2ecf20Sopenharmony_ci __u64 val64; 208c2ecf20Sopenharmony_ci __u32 val32[2]; 218c2ecf20Sopenharmony_ci}; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ciint main(int argc, char **argv) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci struct perf_evlist *evlist; 268c2ecf20Sopenharmony_ci struct perf_evsel *evsel; 278c2ecf20Sopenharmony_ci struct perf_mmap *map; 288c2ecf20Sopenharmony_ci struct perf_cpu_map *cpus; 298c2ecf20Sopenharmony_ci struct perf_event_attr attr = { 308c2ecf20Sopenharmony_ci .type = PERF_TYPE_HARDWARE, 318c2ecf20Sopenharmony_ci .config = PERF_COUNT_HW_CPU_CYCLES, 328c2ecf20Sopenharmony_ci .disabled = 1, 338c2ecf20Sopenharmony_ci .freq = 1, 348c2ecf20Sopenharmony_ci .sample_freq = 10, 358c2ecf20Sopenharmony_ci .sample_type = PERF_SAMPLE_IP|PERF_SAMPLE_TID|PERF_SAMPLE_CPU|PERF_SAMPLE_PERIOD, 368c2ecf20Sopenharmony_ci }; 378c2ecf20Sopenharmony_ci int err = -1; 388c2ecf20Sopenharmony_ci union perf_event *event; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci libperf_init(libperf_print); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci cpus = perf_cpu_map__new(NULL); 438c2ecf20Sopenharmony_ci if (!cpus) { 448c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create cpus\n"); 458c2ecf20Sopenharmony_ci return -1; 468c2ecf20Sopenharmony_ci } 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci evlist = perf_evlist__new(); 498c2ecf20Sopenharmony_ci if (!evlist) { 508c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create evlist\n"); 518c2ecf20Sopenharmony_ci goto out_cpus; 528c2ecf20Sopenharmony_ci } 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci evsel = perf_evsel__new(&attr); 558c2ecf20Sopenharmony_ci if (!evsel) { 568c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create cycles\n"); 578c2ecf20Sopenharmony_ci goto out_cpus; 588c2ecf20Sopenharmony_ci } 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci perf_evlist__add(evlist, evsel); 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci perf_evlist__set_maps(evlist, cpus, NULL); 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci err = perf_evlist__open(evlist); 658c2ecf20Sopenharmony_ci if (err) { 668c2ecf20Sopenharmony_ci fprintf(stderr, "failed to open evlist\n"); 678c2ecf20Sopenharmony_ci goto out_evlist; 688c2ecf20Sopenharmony_ci } 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci err = perf_evlist__mmap(evlist, 4); 718c2ecf20Sopenharmony_ci if (err) { 728c2ecf20Sopenharmony_ci fprintf(stderr, "failed to mmap evlist\n"); 738c2ecf20Sopenharmony_ci goto out_evlist; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci perf_evlist__enable(evlist); 778c2ecf20Sopenharmony_ci sleep(3); 788c2ecf20Sopenharmony_ci perf_evlist__disable(evlist); 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci perf_evlist__for_each_mmap(evlist, map, false) { 818c2ecf20Sopenharmony_ci if (perf_mmap__read_init(map) < 0) 828c2ecf20Sopenharmony_ci continue; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci while ((event = perf_mmap__read_event(map)) != NULL) { 858c2ecf20Sopenharmony_ci int cpu, pid, tid; 868c2ecf20Sopenharmony_ci __u64 ip, period, *array; 878c2ecf20Sopenharmony_ci union u64_swap u; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci array = event->sample.array; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci ip = *array; 928c2ecf20Sopenharmony_ci array++; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci u.val64 = *array; 958c2ecf20Sopenharmony_ci pid = u.val32[0]; 968c2ecf20Sopenharmony_ci tid = u.val32[1]; 978c2ecf20Sopenharmony_ci array++; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci u.val64 = *array; 1008c2ecf20Sopenharmony_ci cpu = u.val32[0]; 1018c2ecf20Sopenharmony_ci array++; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci period = *array; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci fprintf(stdout, "cpu %3d, pid %6d, tid %6d, ip %20llx, period %20llu\n", 1068c2ecf20Sopenharmony_ci cpu, pid, tid, ip, period); 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci perf_mmap__consume(map); 1098c2ecf20Sopenharmony_ci } 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci perf_mmap__read_done(map); 1128c2ecf20Sopenharmony_ci } 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ciout_evlist: 1158c2ecf20Sopenharmony_ci perf_evlist__delete(evlist); 1168c2ecf20Sopenharmony_ciout_cpus: 1178c2ecf20Sopenharmony_ci perf_cpu_map__put(cpus); 1188c2ecf20Sopenharmony_ci return err; 1198c2ecf20Sopenharmony_ci} 120