root/arch/sparc/oprofile/init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. profile_timer_exceptions_notify
  2. timer_start
  3. timer_stop
  4. op_nmi_timer_init
  5. oprofile_arch_init
  6. oprofile_arch_exit

   1 /**
   2  * @file init.c
   3  *
   4  * @remark Copyright 2002 OProfile authors
   5  * @remark Read the file COPYING
   6  *
   7  * @author John Levon <levon@movementarian.org>
   8  */
   9 
  10 #include <linux/kernel.h>
  11 #include <linux/oprofile.h>
  12 #include <linux/errno.h>
  13 #include <linux/init.h>
  14 #include <linux/param.h>        /* for HZ */
  15  
  16 #ifdef CONFIG_SPARC64
  17 #include <linux/notifier.h>
  18 #include <linux/rcupdate.h>
  19 #include <linux/kdebug.h>
  20 #include <asm/nmi.h>
  21 
  22 static int profile_timer_exceptions_notify(struct notifier_block *self,
  23                                            unsigned long val, void *data)
  24 {
  25         struct die_args *args = data;
  26         int ret = NOTIFY_DONE;
  27 
  28         switch (val) {
  29         case DIE_NMI:
  30                 oprofile_add_sample(args->regs, 0);
  31                 ret = NOTIFY_STOP;
  32                 break;
  33         default:
  34                 break;
  35         }
  36         return ret;
  37 }
  38 
  39 static struct notifier_block profile_timer_exceptions_nb = {
  40         .notifier_call  = profile_timer_exceptions_notify,
  41 };
  42 
  43 static int timer_start(void)
  44 {
  45         if (register_die_notifier(&profile_timer_exceptions_nb))
  46                 return 1;
  47         nmi_adjust_hz(HZ);
  48         return 0;
  49 }
  50 
  51 
  52 static void timer_stop(void)
  53 {
  54         nmi_adjust_hz(1);
  55         unregister_die_notifier(&profile_timer_exceptions_nb);
  56         synchronize_rcu();  /* Allow already-started NMIs to complete. */
  57 }
  58 
  59 static int op_nmi_timer_init(struct oprofile_operations *ops)
  60 {
  61         if (atomic_read(&nmi_active) <= 0)
  62                 return -ENODEV;
  63 
  64         ops->start = timer_start;
  65         ops->stop = timer_stop;
  66         ops->cpu_type = "timer";
  67         printk(KERN_INFO "oprofile: Using perfctr NMI timer interrupt.\n");
  68         return 0;
  69 }
  70 #endif
  71 
  72 int __init oprofile_arch_init(struct oprofile_operations *ops)
  73 {
  74         int ret = -ENODEV;
  75 
  76 #ifdef CONFIG_SPARC64
  77         ret = op_nmi_timer_init(ops);
  78         if (!ret)
  79                 return ret;
  80 #endif
  81 
  82         return ret;
  83 }
  84 
  85 void oprofile_arch_exit(void)
  86 {
  87 }

/* [<][>][^][v][top][bottom][index][help] */