linux/arch/sparc/oprofile/init.c
<<
>>
Prefs
   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
  22static 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
  39static struct notifier_block profile_timer_exceptions_nb = {
  40        .notifier_call  = profile_timer_exceptions_notify,
  41};
  42
  43static 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
  52static void timer_stop(void)
  53{
  54        nmi_adjust_hz(1);
  55        unregister_die_notifier(&profile_timer_exceptions_nb);
  56        synchronize_sched();  /* Allow already-started NMIs to complete. */
  57}
  58
  59static 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
  72int __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
  85void oprofile_arch_exit(void)
  86{
  87}
  88