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