1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * auxtrace.c: AUX area tracing support 4 * Copyright (c) 2013-2014, Intel Corporation. 5 */ 6 7 #include <errno.h> 8 #include <stdbool.h> 9 10 #include "../../util/header.h" 11 #include "../../util/debug.h" 12 #include "../../util/pmu.h" 13 #include "../../util/auxtrace.h" 14 #include "../../util/intel-pt.h" 15 #include "../../util/intel-bts.h" 16 #include "../../util/evlist.h" 17 18 static 19 struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, 20 int *err) 21 { 22 struct perf_pmu *intel_pt_pmu; 23 struct perf_pmu *intel_bts_pmu; 24 struct evsel *evsel; 25 bool found_pt = false; 26 bool found_bts = false; 27 28 intel_pt_pmu = perf_pmu__find(INTEL_PT_PMU_NAME); 29 if (intel_pt_pmu) 30 intel_pt_pmu->auxtrace = true; 31 intel_bts_pmu = perf_pmu__find(INTEL_BTS_PMU_NAME); 32 33 evlist__for_each_entry(evlist, evsel) { 34 if (intel_pt_pmu && evsel->core.attr.type == intel_pt_pmu->type) 35 found_pt = true; 36 if (intel_bts_pmu && evsel->core.attr.type == intel_bts_pmu->type) 37 found_bts = true; 38 } 39 40 if (found_pt && found_bts) { 41 pr_err("intel_pt and intel_bts may not be used together\n"); 42 *err = -EINVAL; 43 return NULL; 44 } 45 46 if (found_pt) 47 return intel_pt_recording_init(err); 48 49 if (found_bts) 50 return intel_bts_recording_init(err); 51 52 return NULL; 53 } 54 55 struct auxtrace_record *auxtrace_record__init(struct evlist *evlist, 56 int *err) 57 { 58 char buffer[64]; 59 int ret; 60 61 *err = 0; 62 63 ret = get_cpuid(buffer, sizeof(buffer)); 64 if (ret) { 65 *err = ret; 66 return NULL; 67 } 68 69 if (!strncmp(buffer, "GenuineIntel,", 13)) 70 return auxtrace_record__init_intel(evlist, err); 71 72 return NULL; 73 } 74