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 16 #include <errno.h> 17 #include <stdbool.h> 18 19 #include "../../util/header.h" 20 #include "../../util/debug.h" 21 #include "../../util/pmu.h" 22 #include "../../util/auxtrace.h" 23 #include "../../util/intel-pt.h" 24 #include "../../util/intel-bts.h" 25 #include "../../util/evlist.h" 26 27 static 28 struct auxtrace_record *auxtrace_record__init_intel(struct perf_evlist *evlist, 29 int *err) 30 { 31 struct perf_pmu *intel_pt_pmu; 32 struct perf_pmu *intel_bts_pmu; 33 struct perf_evsel *evsel; 34 bool found_pt = false; 35 bool found_bts = false; 36 37 intel_pt_pmu = perf_pmu__find(INTEL_PT_PMU_NAME); 38 intel_bts_pmu = perf_pmu__find(INTEL_BTS_PMU_NAME); 39 40 if (evlist) { 41 evlist__for_each_entry(evlist, evsel) { 42 if (intel_pt_pmu && 43 evsel->attr.type == intel_pt_pmu->type) 44 found_pt = true; 45 if (intel_bts_pmu && 46 evsel->attr.type == intel_bts_pmu->type) 47 found_bts = true; 48 } 49 } 50 51 if (found_pt && found_bts) { 52 pr_err("intel_pt and intel_bts may not be used together\n"); 53 *err = -EINVAL; 54 return NULL; 55 } 56 57 if (found_pt) 58 return intel_pt_recording_init(err); 59 60 if (found_bts) 61 return intel_bts_recording_init(err); 62 63 return NULL; 64 } 65 66 struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist, 67 int *err) 68 { 69 char buffer[64]; 70 int ret; 71 72 *err = 0; 73 74 ret = get_cpuid(buffer, sizeof(buffer)); 75 if (ret) { 76 *err = ret; 77 return NULL; 78 } 79 80 if (!strncmp(buffer, "GenuineIntel,", 13)) 81 return auxtrace_record__init_intel(evlist, err); 82 83 return NULL; 84 } 85