Commit | Line | Data |
---|---|---|
5efb1d54 AH |
1 | /* |
2 | * auxtrace.c: AUX area tracing support | |
3 | * Copyright (c) 2013-2014, Intel Corporation. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms and conditions of the GNU General Public License, | |
7 | * version 2, as published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | */ | |
15 | ||
d0170af7 AH |
16 | #include <stdbool.h> |
17 | ||
5efb1d54 | 18 | #include "../../util/header.h" |
d0170af7 AH |
19 | #include "../../util/debug.h" |
20 | #include "../../util/pmu.h" | |
5efb1d54 AH |
21 | #include "../../util/auxtrace.h" |
22 | #include "../../util/intel-pt.h" | |
d0170af7 AH |
23 | #include "../../util/intel-bts.h" |
24 | #include "../../util/evlist.h" | |
25 | ||
26 | static | |
27 | struct auxtrace_record *auxtrace_record__init_intel(struct perf_evlist *evlist, | |
28 | int *err) | |
29 | { | |
30 | struct perf_pmu *intel_pt_pmu; | |
31 | struct perf_pmu *intel_bts_pmu; | |
32 | struct perf_evsel *evsel; | |
33 | bool found_pt = false; | |
34 | bool found_bts = false; | |
35 | ||
36 | intel_pt_pmu = perf_pmu__find(INTEL_PT_PMU_NAME); | |
37 | intel_bts_pmu = perf_pmu__find(INTEL_BTS_PMU_NAME); | |
38 | ||
39 | if (evlist) { | |
40 | evlist__for_each(evlist, evsel) { | |
41 | if (intel_pt_pmu && | |
42 | evsel->attr.type == intel_pt_pmu->type) | |
43 | found_pt = true; | |
44 | if (intel_bts_pmu && | |
45 | evsel->attr.type == intel_bts_pmu->type) | |
46 | found_bts = true; | |
47 | } | |
48 | } | |
49 | ||
50 | if (found_pt && found_bts) { | |
51 | pr_err("intel_pt and intel_bts may not be used together\n"); | |
52 | *err = -EINVAL; | |
53 | return NULL; | |
54 | } | |
55 | ||
56 | if (found_pt) | |
57 | return intel_pt_recording_init(err); | |
58 | ||
59 | if (found_bts) | |
60 | return intel_bts_recording_init(err); | |
5efb1d54 | 61 | |
d0170af7 AH |
62 | return NULL; |
63 | } | |
64 | ||
65 | struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist, | |
5efb1d54 AH |
66 | int *err) |
67 | { | |
68 | char buffer[64]; | |
69 | int ret; | |
70 | ||
71 | *err = 0; | |
72 | ||
73 | ret = get_cpuid(buffer, sizeof(buffer)); | |
74 | if (ret) { | |
75 | *err = ret; | |
76 | return NULL; | |
77 | } | |
78 | ||
79 | if (!strncmp(buffer, "GenuineIntel,", 13)) | |
d0170af7 | 80 | return auxtrace_record__init_intel(evlist, err); |
5efb1d54 AH |
81 | |
82 | return NULL; | |
83 | } |