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        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
  66struct 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