Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
oprofile.h
Go to the documentation of this file.
1 
13 #ifndef OPROFILE_H
14 #define OPROFILE_H
15 
16 #include <linux/types.h>
17 #include <linux/spinlock.h>
18 #include <linux/init.h>
19 #include <linux/errno.h>
20 #include <linux/printk.h>
21 #include <linux/atomic.h>
22 
23 /* Each escaped entry is prefixed by ESCAPE_CODE
24  * then one of the following codes, then the
25  * relevant data.
26  * These #defines live in this file so that arch-specific
27  * buffer sync'ing code can access them.
28  */
29 #define ESCAPE_CODE ~0UL
30 #define CTX_SWITCH_CODE 1
31 #define CPU_SWITCH_CODE 2
32 #define COOKIE_SWITCH_CODE 3
33 #define KERNEL_ENTER_SWITCH_CODE 4
34 #define KERNEL_EXIT_SWITCH_CODE 5
35 #define MODULE_LOADED_CODE 6
36 #define CTX_TGID_CODE 7
37 #define TRACE_BEGIN_CODE 8
38 #define TRACE_END_CODE 9
39 #define XEN_ENTER_SWITCH_CODE 10
40 #define SPU_PROFILING_CODE 11
41 #define SPU_CTX_SWITCH_CODE 12
42 #define IBS_FETCH_CODE 13
43 #define IBS_OP_CODE 14
44 
45 struct super_block;
46 struct dentry;
47 struct file_operations;
48 struct pt_regs;
49 
50 /* Operations structure to be filled in */
52  /* create any necessary configuration files in the oprofile fs.
53  * Optional. */
54  int (*create_files)(struct super_block * sb, struct dentry * root);
55  /* Do any necessary interrupt setup. Optional. */
56  int (*setup)(void);
57  /* Do any necessary interrupt shutdown. Optional. */
59  /* Start delivering interrupts. */
60  int (*start)(void);
61  /* Stop delivering interrupts. */
62  void (*stop)(void);
63  /* Arch-specific buffer sync functions.
64  * Return value = 0: Success
65  * Return value = -1: Failure
66  * Return value = 1: Run generic sync function
67  */
70 
71  /* Initiate a stack backtrace. Optional. */
72  void (*backtrace)(struct pt_regs * const regs, unsigned int depth);
73 
74  /* Multiplex between different events. Optional. */
76  /* CPU identification string. */
77  char * cpu_type;
78 };
79 
87 int oprofile_arch_init(struct oprofile_operations * ops);
88 
92 void oprofile_arch_exit(void);
93 
97 void oprofile_add_sample(struct pt_regs * const regs, unsigned long event);
98 
106 void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
107  unsigned long event, int is_kernel);
108 
112 void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs,
113  unsigned long event, int is_kernel,
114  struct task_struct *task);
115 
116 /* Use this instead when the PC value is not from the regs. Doesn't
117  * backtrace. */
118 void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);
119 
120 /* add a backtrace entry, to be called from the ->backtrace callback */
121 void oprofile_add_trace(unsigned long eip);
122 
123 
128 int oprofilefs_create_file(struct super_block * sb, struct dentry * root,
129  char const * name, const struct file_operations * fops);
130 
131 int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root,
132  char const * name, const struct file_operations * fops, int perm);
133 
135 int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root,
136  char const * name, ulong * val);
137 
139 int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root,
140  char const * name, ulong * val);
141 
143 int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root,
144  char const * name, atomic_t * val);
145 
147 struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root,
148  char const * name);
149 
154 ssize_t oprofilefs_str_to_user(char const * str, char __user * buf, size_t count, loff_t * offset);
155 
160 ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t count, loff_t * offset);
161 
166 int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count);
167 
170 
174 void oprofile_put_buff(unsigned long *buf, unsigned int start,
175  unsigned int stop, unsigned int max);
176 
177 unsigned long oprofile_get_cpu_buffer_size(void);
179 
180 /* cpu buffer functions */
181 
182 struct op_sample;
183 
184 struct op_entry {
186  struct op_sample *sample;
187  unsigned long size;
188  unsigned long *data;
189 };
190 
192  struct pt_regs * const regs,
193  unsigned long pc, int code, int size);
194 int oprofile_add_data(struct op_entry *entry, unsigned long val);
197 
198 #ifdef CONFIG_HW_PERF_EVENTS
200 void oprofile_perf_exit(void);
201 char *op_name_from_perf_id(void);
202 #else
203 static inline int __init oprofile_perf_init(struct oprofile_operations *ops)
204 {
205  pr_info("oprofile: hardware counters not available\n");
206  return -ENODEV;
207 }
208 static inline void oprofile_perf_exit(void) { }
209 #endif /* CONFIG_HW_PERF_EVENTS */
210 
211 #endif /* OPROFILE_H */