18c2ecf20Sopenharmony_ci/** 28c2ecf20Sopenharmony_ci * @file init.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * @remark Copyright 2002 OProfile authors 58c2ecf20Sopenharmony_ci * @remark Read the file COPYING 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * @author John Levon <levon@movementarian.org> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/oprofile.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/errno.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * We support CPUs that have performance counters like the Pentium Pro 168c2ecf20Sopenharmony_ci * with the NMI mode driver. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_LOCAL_APIC 208c2ecf20Sopenharmony_ciextern int op_nmi_init(struct oprofile_operations *ops); 218c2ecf20Sopenharmony_ciextern void op_nmi_exit(void); 228c2ecf20Sopenharmony_ci#else 238c2ecf20Sopenharmony_cistatic int op_nmi_init(struct oprofile_operations *ops) { return -ENODEV; } 248c2ecf20Sopenharmony_cistatic void op_nmi_exit(void) { } 258c2ecf20Sopenharmony_ci#endif 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ciextern void x86_backtrace(struct pt_regs * const regs, unsigned int depth); 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ciint __init oprofile_arch_init(struct oprofile_operations *ops) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci ops->backtrace = x86_backtrace; 328c2ecf20Sopenharmony_ci return op_nmi_init(ops); 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_civoid oprofile_arch_exit(void) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci op_nmi_exit(); 388c2ecf20Sopenharmony_ci} 39