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