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 24 extern 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 */ 30 static char *sh_pmu_op_name; 31 op_name_from_perf_id(void)32char *op_name_from_perf_id(void) 33 { 34 return sh_pmu_op_name; 35 } 36 oprofile_arch_init(struct oprofile_operations * ops)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 oprofile_arch_exit(void)52void oprofile_arch_exit(void) 53 { 54 oprofile_perf_exit(); 55 kfree(sh_pmu_op_name); 56 } 57 #else oprofile_arch_init(struct oprofile_operations * ops)58int __init oprofile_arch_init(struct oprofile_operations *ops) 59 { 60 ops->backtrace = sh_backtrace; 61 return -ENODEV; 62 } oprofile_arch_exit(void)63void oprofile_arch_exit(void) {} 64 #endif /* CONFIG_HW_PERF_EVENTS */ 65