Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * auxtrace.c: AUX area tracing support
0004  * Copyright (c) 2013-2014, Intel Corporation.
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 }