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 */
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 */
162