• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
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 */
42 struct _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 */
60 struct 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 */
70 struct 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  */
96 struct 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 */
127 extern struct oprof_sysctl sysctl;
128 
129 int oprof_init(void);
130 void oprof_exit(void);
131 unsigned long is_map_ready(void);
132 int oprof_hash_map_open(void);
133 int oprof_hash_map_release(void);
134 int oprof_hash_map_mmap(struct file * file, struct vm_area_struct * vma);
135 int oprof_map_open(void);
136 int oprof_map_release(void);
137 int oprof_init_hashmap(void);
138 void oprof_free_hashmap(void);
139 
140 /* used by interrupt handlers if the underlined harware doesn't support
141  * performance counter */
142 extern struct op_int_operations op_rtc_ops;
143 
144 void op_do_profile(uint cpu, long eip, long irq_enabled, int ctr);
145 extern struct _oprof_data oprof_data[NR_CPUS];
146 extern struct oprof_sysctl sysctl_parms;
147 extern 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 */
152 op_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 */
155 struct op_int_operations const * op_int_interface(void);
156 /* intercept the needed syscall */
157 void op_intercept_syscalls(void);
158 void op_restore_syscalls(void);
159 void op_save_syscalls(void);
160 
161 #endif /* OPROFILE_H */
162