blob: 257fdcf62a2d04d855333a1a30a8b5ebcce4ae04 [file] [log] [blame]
Mike Dodd8cfa7022010-11-17 11:12:26 -08001/**
2 * @file oprofile.h
3 * Main driver code
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef OPROFILE_H
13#define OPROFILE_H
14
15#include <linux/version.h>
16#include <linux/module.h>
17#include <linux/config.h>
18#include <linux/kernel.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/delay.h>
22#include <linux/vmalloc.h>
23#include <linux/sched.h>
24#include <linux/sysctl.h>
25#include <linux/smp_lock.h>
26
27#include <asm/uaccess.h>
28
29#include "compat.h"
30
31#include "op_config_24.h"
32#include "op_hw_config.h"
33#include "op_interface.h"
34#include "op_cpu_type.h"
35
36#undef min
37#undef max
38
39#define streq(a, b) (!strcmp((a), (b)))
40
41/* per-cpu dynamic data */
42struct _oprof_data {
43 /* eviction buffer */
44 struct op_sample * buffer;
45 /* nr. in buffer */
46 uint buf_size;
47 /* we try to wakeup when nextbuf >= buf_watermark */
48 uint buf_watermark;
49 /* next in buffer (atomic) */
50 uint nextbuf;
51 /* number of IRQs for this CPU */
52 uint nr_irq;
53 /* buffer overflow cumulated size */
54 uint nr_buffer_overflow;
55 /* reset counter values */
56 uint ctr_count[OP_MAX_COUNTERS];
57};
58
59/* reflect /proc/sys/dev/oprofile/#counter files */
60struct oprof_counter {
61 int count;
62 int enabled;
63 int event;
64 int kernel;
65 int user;
66 int unit_mask;
67};
68
69/* reflect /proc/sys/dev/oprofile files */
70struct oprof_sysctl {
71 /* nr. in eviction buffser */
72 int buf_size;
73 /* sysctl dump */
74 int dump;
75 /* dump and stop */
76 int dump_stop;
77 /* nr. in note buffer */
78 int note_size;
79 /* nr. interrupts occured */
80 int nr_interrupts;
81 /* the cpu core type: CPU_PPRO, CPU_PII ... */
82 int cpu_type;
83 /* nr note buffer overflow */
84 int nr_note_buffer_overflow;
85 /* nr buffer overflow */
86 int nr_buffer_overflow;
87 /* counter setup */
88 struct oprof_counter ctr[OP_MAX_COUNTERS];
89};
90
91/**
92 * A interrupt handler must implement these routines.
93 * When an interrupt arrives, it must eventually call
94 * op_do_profile().
95 */
96struct op_int_operations {
97 /* initialise the interrupt handler on module load.
98 * On failure deinit handler is not called so all resources
99 * allocated by init() must be freed before returning an error code
100 * (or 0 on success)
101 */
102 int (*init)(void);
103 /* deinitialise on module unload */
104 void (*deinit)(void);
105 /* add any handler-specific sysctls at the position given by @next. Return 0 on success */
106 int (*add_sysctls)(ctl_table * next);
107 /* remove handler-specific sysctls */
108 void (*remove_sysctls)(ctl_table * next);
109 /* check given profiling parameters are correct. Return 0 on success */
110 int (*check_params)(void);
111 /* setup the handler from profiling parameters. Return 0 on success */
112 int (*setup)(void);
113 /* start profiling on all CPUs */
114 void (*start)(void);
115 /* stop profiling on all CPUs */
116 void (*stop)(void);
117 /* start profiling on the given CPU */
118 void (*start_cpu)(uint);
119 /* stop profiling on the given CPU */
120 void (*stop_cpu)(uint);
121};
122
123/* maximum depth of dname trees - this is just a page */
124#define DNAME_STACK_MAX 1024
125
126/* oprof_start() copy here the sysctl settable parameters */
127extern struct oprof_sysctl sysctl;
128
129int oprof_init(void);
130void oprof_exit(void);
131unsigned long is_map_ready(void);
132int oprof_hash_map_open(void);
133int oprof_hash_map_release(void);
134int oprof_hash_map_mmap(struct file * file, struct vm_area_struct * vma);
135int oprof_map_open(void);
136int oprof_map_release(void);
137int oprof_init_hashmap(void);
138void oprof_free_hashmap(void);
139
140/* used by interrupt handlers if the underlined harware doesn't support
141 * performance counter */
142extern struct op_int_operations op_rtc_ops;
143
144void op_do_profile(uint cpu, long eip, long irq_enabled, int ctr);
145extern struct _oprof_data oprof_data[NR_CPUS];
146extern struct oprof_sysctl sysctl_parms;
147extern int lproc_dointvec(ctl_table * table, int write, struct file * filp, void * buffer, size_t * lenp);
148
149/* functionality provided by the architecture dependent file */
150/* must return OP_RTC if the hardware doesn't support something like
151 * perf counter */
152op_cpu get_cpu_type(void);
153/* return an interface pointer, this function is called only if get_cpu_type
154 * doesn't return OP_RTC */
155struct op_int_operations const * op_int_interface(void);
156/* intercept the needed syscall */
157void op_intercept_syscalls(void);
158void op_restore_syscalls(void);
159void op_save_syscalls(void);
160
161#endif /* OPROFILE_H */