0001
0002
0003
0004
0005
0006
0007 #include <errno.h>
0008 #include <stdbool.h>
0009
0010 #include "../../../util/header.h"
0011 #include "../../../util/debug.h"
0012 #include "../../../util/pmu.h"
0013 #include "../../../util/auxtrace.h"
0014 #include "../../../util/intel-pt.h"
0015 #include "../../../util/intel-bts.h"
0016 #include "../../../util/evlist.h"
0017
0018 static
0019 struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist,
0020 int *err)
0021 {
0022 struct perf_pmu *intel_pt_pmu;
0023 struct perf_pmu *intel_bts_pmu;
0024 struct evsel *evsel;
0025 bool found_pt = false;
0026 bool found_bts = false;
0027
0028 intel_pt_pmu = perf_pmu__find(INTEL_PT_PMU_NAME);
0029 if (intel_pt_pmu)
0030 intel_pt_pmu->auxtrace = true;
0031 intel_bts_pmu = perf_pmu__find(INTEL_BTS_PMU_NAME);
0032 if (intel_bts_pmu)
0033 intel_bts_pmu->auxtrace = true;
0034
0035 evlist__for_each_entry(evlist, evsel) {
0036 if (intel_pt_pmu && evsel->core.attr.type == intel_pt_pmu->type)
0037 found_pt = true;
0038 if (intel_bts_pmu && evsel->core.attr.type == intel_bts_pmu->type)
0039 found_bts = true;
0040 }
0041
0042 if (found_pt && found_bts) {
0043 pr_err("intel_pt and intel_bts may not be used together\n");
0044 *err = -EINVAL;
0045 return NULL;
0046 }
0047
0048 if (found_pt)
0049 return intel_pt_recording_init(err);
0050
0051 if (found_bts)
0052 return intel_bts_recording_init(err);
0053
0054 return NULL;
0055 }
0056
0057 struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
0058 int *err)
0059 {
0060 char buffer[64];
0061 int ret;
0062
0063 *err = 0;
0064
0065 ret = get_cpuid(buffer, sizeof(buffer));
0066 if (ret) {
0067 *err = ret;
0068 return NULL;
0069 }
0070
0071 if (!strncmp(buffer, "GenuineIntel,", 13))
0072 return auxtrace_record__init_intel(evlist, err);
0073
0074 return NULL;
0075 }