Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / tools / perf / arch / x86 / util / auxtrace.c
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 perf_evlist *evlist,
20                                                     int *err)
21 {
22         struct perf_pmu *intel_pt_pmu;
23         struct perf_pmu *intel_bts_pmu;
24         struct perf_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         intel_bts_pmu = perf_pmu__find(INTEL_BTS_PMU_NAME);
30
31         evlist__for_each_entry(evlist, evsel) {
32                 if (intel_pt_pmu && evsel->attr.type == intel_pt_pmu->type)
33                         found_pt = true;
34                 if (intel_bts_pmu && evsel->attr.type == intel_bts_pmu->type)
35                         found_bts = true;
36         }
37
38         if (found_pt && found_bts) {
39                 pr_err("intel_pt and intel_bts may not be used together\n");
40                 *err = -EINVAL;
41                 return NULL;
42         }
43
44         if (found_pt)
45                 return intel_pt_recording_init(err);
46
47         if (found_bts)
48                 return intel_bts_recording_init(err);
49
50         return NULL;
51 }
52
53 struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist,
54                                               int *err)
55 {
56         char buffer[64];
57         int ret;
58
59         *err = 0;
60
61         ret = get_cpuid(buffer, sizeof(buffer));
62         if (ret) {
63                 *err = ret;
64                 return NULL;
65         }
66
67         if (!strncmp(buffer, "GenuineIntel,", 13))
68                 return auxtrace_record__init_intel(evlist, err);
69
70         return NULL;
71 }