linux/tools/perf/arch/x86/util/auxtrace.c
<<
>>
Prefs
   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
  27static
  28struct 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        evlist__for_each_entry(evlist, evsel) {
  41                if (intel_pt_pmu && evsel->attr.type == intel_pt_pmu->type)
  42                        found_pt = true;
  43                if (intel_bts_pmu && evsel->attr.type == intel_bts_pmu->type)
  44                        found_bts = true;
  45        }
  46
  47        if (found_pt && found_bts) {
  48                pr_err("intel_pt and intel_bts may not be used together\n");
  49                *err = -EINVAL;
  50                return NULL;
  51        }
  52
  53        if (found_pt)
  54                return intel_pt_recording_init(err);
  55
  56        if (found_bts)
  57                return intel_bts_recording_init(err);
  58
  59        return NULL;
  60}
  61
  62struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist,
  63                                              int *err)
  64{
  65        char buffer[64];
  66        int ret;
  67
  68        *err = 0;
  69
  70        ret = get_cpuid(buffer, sizeof(buffer));
  71        if (ret) {
  72                *err = ret;
  73                return NULL;
  74        }
  75
  76        if (!strncmp(buffer, "GenuineIntel,", 13))
  77                return auxtrace_record__init_intel(evlist, err);
  78
  79        return NULL;
  80}
  81