x86, nmi: Wire up NMI handlers to new routines
[karo-tx-linux.git] / arch / x86 / oprofile / nmi_timer_int.c
1 /**
2  * @file nmi_timer_int.c
3  *
4  * @remark Copyright 2003 OProfile authors
5  * @remark Read the file COPYING
6  *
7  * @author Zwane Mwaikambo <zwane@linuxpower.ca>
8  */
9
10 #include <linux/init.h>
11 #include <linux/smp.h>
12 #include <linux/errno.h>
13 #include <linux/oprofile.h>
14 #include <linux/rcupdate.h>
15 #include <linux/kdebug.h>
16
17 #include <asm/nmi.h>
18 #include <asm/apic.h>
19 #include <asm/ptrace.h>
20
21 static int profile_timer_exceptions_notify(unsigned int val, struct pt_regs *regs)
22 {
23         oprofile_add_sample(regs, 0);
24         return NMI_HANDLED;
25 }
26
27 static int timer_start(void)
28 {
29         if (register_nmi_handler(NMI_LOCAL, profile_timer_exceptions_notify,
30                                         0, "oprofile-timer"))
31                 return 1;
32         return 0;
33 }
34
35
36 static void timer_stop(void)
37 {
38         unregister_nmi_handler(NMI_LOCAL, "oprofile-timer");
39         synchronize_sched();  /* Allow already-started NMIs to complete. */
40 }
41
42
43 int __init op_nmi_timer_init(struct oprofile_operations *ops)
44 {
45         ops->start = timer_start;
46         ops->stop = timer_stop;
47         ops->cpu_type = "timer";
48         printk(KERN_INFO "oprofile: using NMI timer interrupt.\n");
49         return 0;
50 }