linux/arch/sh/oprofile/common.c
<<
>>
Prefs
   1/*
   2 * arch/sh/oprofile/init.c
   3 *
   4 * Copyright (C) 2003 - 2010  Paul Mundt
   5 *
   6 * Based on arch/mips/oprofile/common.c:
   7 *
   8 *      Copyright (C) 2004, 2005 Ralf Baechle
   9 *      Copyright (C) 2005 MIPS Technologies, Inc.
  10 *
  11 * This file is subject to the terms and conditions of the GNU General Public
  12 * License.  See the file "COPYING" in the main directory of this archive
  13 * for more details.
  14 */
  15#include <linux/kernel.h>
  16#include <linux/oprofile.h>
  17#include <linux/init.h>
  18#include <linux/errno.h>
  19#include <linux/smp.h>
  20#include <linux/perf_event.h>
  21#include <linux/slab.h>
  22#include <asm/processor.h>
  23
  24extern void sh_backtrace(struct pt_regs * const regs, unsigned int depth);
  25
  26#ifdef CONFIG_HW_PERF_EVENTS
  27/*
  28 * This will need to be reworked when multiple PMUs are supported.
  29 */
  30static char *sh_pmu_op_name;
  31
  32char *op_name_from_perf_id(void)
  33{
  34        return sh_pmu_op_name;
  35}
  36
  37int __init oprofile_arch_init(struct oprofile_operations *ops)
  38{
  39        ops->backtrace = sh_backtrace;
  40
  41        if (perf_num_counters() == 0)
  42                return -ENODEV;
  43
  44        sh_pmu_op_name = kasprintf(GFP_KERNEL, "%s/%s",
  45                                   UTS_MACHINE, perf_pmu_name());
  46        if (unlikely(!sh_pmu_op_name))
  47                return -ENOMEM;
  48
  49        return oprofile_perf_init(ops);
  50}
  51
  52void oprofile_arch_exit(void)
  53{
  54        oprofile_perf_exit();
  55        kfree(sh_pmu_op_name);
  56}
  57#else
  58int __init oprofile_arch_init(struct oprofile_operations *ops)
  59{
  60        ops->backtrace = sh_backtrace;
  61        return -ENODEV;
  62}
  63void oprofile_arch_exit(void) {}
  64#endif /* CONFIG_HW_PERF_EVENTS */
  65