Blame view

include/linux/oprofile.h 6.29 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /**
   * @file oprofile.h
   *
   * API for machine-specific interrupts to interface
   * to oprofile.
   *
   * @remark Copyright 2002 OProfile authors
   * @remark Read the file COPYING
   *
   * @author John Levon <levon@movementarian.org>
   */
  
  #ifndef OPROFILE_H
  #define OPROFILE_H
  
  #include <linux/types.h>
  #include <linux/spinlock.h>
3d90a0076   Matt Fleming   oprofile: Abstrac...
18
  #include <linux/init.h>
d14dd7e20   Ari Kauppi   ARM: oprofile: Fi...
19
20
  #include <linux/errno.h>
  #include <linux/printk.h>
60063497a   Arun Sharma   atomic: use <linu...
21
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
   
1474855d0   Bob Nelson   [CELL] oprofile: ...
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  /* Each escaped entry is prefixed by ESCAPE_CODE
   * then one of the following codes, then the
   * relevant data.
   * These #defines live in this file so that arch-specific
   * buffer sync'ing code can access them.
   */
  #define ESCAPE_CODE			~0UL
  #define CTX_SWITCH_CODE			1
  #define CPU_SWITCH_CODE			2
  #define COOKIE_SWITCH_CODE		3
  #define KERNEL_ENTER_SWITCH_CODE	4
  #define KERNEL_EXIT_SWITCH_CODE		5
  #define MODULE_LOADED_CODE		6
  #define CTX_TGID_CODE			7
  #define TRACE_BEGIN_CODE		8
  #define TRACE_END_CODE			9
  #define XEN_ENTER_SWITCH_CODE		10
  #define SPU_PROFILING_CODE		11
  #define SPU_CTX_SWITCH_CODE		12
ee648bc77   Robert Richter   OProfile: add IBS...
42
43
  #define IBS_FETCH_CODE			13
  #define IBS_OP_CODE			14
1474855d0   Bob Nelson   [CELL] oprofile: ...
44

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  struct super_block;
  struct dentry;
  struct file_operations;
  struct pt_regs;
   
  /* Operations structure to be filled in */
  struct oprofile_operations {
  	/* create any necessary configuration files in the oprofile fs.
  	 * Optional. */
  	int (*create_files)(struct super_block * sb, struct dentry * root);
  	/* Do any necessary interrupt setup. Optional. */
  	int (*setup)(void);
  	/* Do any necessary interrupt shutdown. Optional. */
  	void (*shutdown)(void);
  	/* Start delivering interrupts. */
  	int (*start)(void);
  	/* Stop delivering interrupts. */
  	void (*stop)(void);
1474855d0   Bob Nelson   [CELL] oprofile: ...
63
64
65
66
67
68
69
  	/* Arch-specific buffer sync functions.
  	 * Return value = 0:  Success
  	 * Return value = -1: Failure
  	 * Return value = 1:  Run generic sync function
  	 */
  	int (*sync_start)(void);
  	int (*sync_stop)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
  	/* Initiate a stack backtrace. Optional. */
  	void (*backtrace)(struct pt_regs * const regs, unsigned int depth);
4d4036e0e   Jason Yeh   oprofile: Impleme...
72
73
74
  
  	/* Multiplex between different events. Optional. */
  	int (*switch_events)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  	/* CPU identification string. */
  	char * cpu_type;
  };
  
  /**
   * One-time initialisation. *ops must be set to a filled-in
   * operations structure. This is called even in timer interrupt
   * mode so an arch can set a backtrace callback.
   *
   * If an error occurs, the fields should be left untouched.
   */
  int oprofile_arch_init(struct oprofile_operations * ops);
   
  /**
   * One-time exit/cleanup for the arch.
   */
  void oprofile_arch_exit(void);
  
  /**
584944875   Robert Richter   oprofile: update ...
94
   * Add a sample. This may be called from any context.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
   */
  void oprofile_add_sample(struct pt_regs * const regs, unsigned long event);
273577165   Brian Rogan   [PATCH] Add oprof...
97
98
99
100
101
102
103
104
105
  /**
   * Add an extended sample.  Use this when the PC is not from the regs, and
   * we cannot determine if we're in kernel mode from the regs.
   *
   * This function does perform a backtrace.
   *
   */
  void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
  				unsigned long event, int is_kernel);
54ebbe7ba   Heinz Graalfs   oprofile: Introdu...
106
107
108
109
110
111
  /**
   * Add an hardware sample.
   */
  void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs,
  	unsigned long event, int is_kernel,
  	struct task_struct *task);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
114
115
116
117
118
119
120
121
122
123
124
  /* Use this instead when the PC value is not from the regs. Doesn't
   * backtrace. */
  void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);
  
  /* add a backtrace entry, to be called from the ->backtrace callback */
  void oprofile_add_trace(unsigned long eip);
  
  
  /**
   * Create a file of the given name as a child of the given root, with
   * the specified file operations.
   */
  int oprofilefs_create_file(struct super_block * sb, struct dentry * root,
99ac48f54   Arjan van de Ven   [PATCH] mark f_op...
125
  	char const * name, const struct file_operations * fops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
127
  
  int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root,
99ac48f54   Arjan van de Ven   [PATCH] mark f_op...
128
  	char const * name, const struct file_operations * fops, int perm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
   
  /** Create a file for read/write access to an unsigned long. */
  int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root,
  	char const * name, ulong * val);
   
  /** Create a file for read-only access to an unsigned long. */
  int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root,
  	char const * name, ulong * val);
   
  /** Create a file for read-only access to an atomic_t. */
  int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root,
  	char const * name, atomic_t * val);
   
  /** create a directory */
  struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root,
  	char const * name);
  
  /**
   * Write the given asciz string to the given user buffer @buf, updating *offset
   * appropriately. Returns bytes written or -EFAULT.
   */
  ssize_t oprofilefs_str_to_user(char const * str, char __user * buf, size_t count, loff_t * offset);
  
  /**
   * Convert an unsigned long value into ASCII and copy it to the user buffer @buf,
   * updating *offset appropriately. Returns bytes written or -EFAULT.
   */
  ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t count, loff_t * offset);
  
  /**
   * Read an ASCII string for a number from a userspace buffer and fill *val on success.
   * Returns 0 on success, < 0 on error.
   */
  int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count);
  
  /** lock for read/write safety */
2d21a29fb   Thomas Gleixner   locking, oprofile...
165
  extern raw_spinlock_t oprofilefs_lock;
a5598ca0d   Carl Love   powerpc/oprofile:...
166
167
168
169
170
171
172
173
174
  
  /**
   * Add the contents of a circular buffer to the event buffer.
   */
  void oprofile_put_buff(unsigned long *buf, unsigned int start,
  			unsigned int stop, unsigned int max);
  
  unsigned long oprofile_get_cpu_buffer_size(void);
  void oprofile_cpu_buffer_inc_smpl_lost(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
   
14f0ca8ea   Robert Richter   oprofile: make ne...
176
177
178
179
180
181
182
  /* cpu buffer functions */
  
  struct op_sample;
  
  struct op_entry {
  	struct ring_buffer_event *event;
  	struct op_sample *sample;
14f0ca8ea   Robert Richter   oprofile: make ne...
183
184
185
186
187
188
189
190
  	unsigned long size;
  	unsigned long *data;
  };
  
  void oprofile_write_reserve(struct op_entry *entry,
  			    struct pt_regs * const regs,
  			    unsigned long pc, int code, int size);
  int oprofile_add_data(struct op_entry *entry, unsigned long val);
51563a0e5   Robert Richter   x86/oprofile: int...
191
  int oprofile_add_data64(struct op_entry *entry, u64 val);
14f0ca8ea   Robert Richter   oprofile: make ne...
192
  int oprofile_write_commit(struct op_entry *entry);
1ea1bdf7f   Ari Kauppi   oprofile: Fix usa...
193
  #ifdef CONFIG_HW_PERF_EVENTS
3d90a0076   Matt Fleming   oprofile: Abstrac...
194
  int __init oprofile_perf_init(struct oprofile_operations *ops);
b3b3a9b63   Anand Gadiyar   oprofile: fix lin...
195
  void oprofile_perf_exit(void);
56946331b   Matt Fleming   oprofile: Make op...
196
  char *op_name_from_perf_id(void);
d14dd7e20   Ari Kauppi   ARM: oprofile: Fi...
197
198
199
200
201
202
203
204
  #else
  static inline int __init oprofile_perf_init(struct oprofile_operations *ops)
  {
  	pr_info("oprofile: hardware counters not available
  ");
  	return -ENODEV;
  }
  static inline void oprofile_perf_exit(void) { }
1ea1bdf7f   Ari Kauppi   oprofile: Fix usa...
205
  #endif /* CONFIG_HW_PERF_EVENTS */
56946331b   Matt Fleming   oprofile: Make op...
206

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  #endif /* OPROFILE_H */