Blame view

include/linux/ftrace.h 17.4 KB
9849ed4d7   Mike Frysinger   tracing/documenta...
1
2
3
4
  /*
   * Ftrace header.  For implementation details beyond the random comments
   * scattered below, see: Documentation/trace/ftrace-design.txt
   */
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
5
6
  #ifndef _LINUX_FTRACE_H
  #define _LINUX_FTRACE_H
0012693ad   Frederic Weisbecker   tracing/function-...
7
  #include <linux/trace_clock.h>
5601020fe   Frederic Weisbecker   tracing/fastboot:...
8
  #include <linux/kallsyms.h>
0012693ad   Frederic Weisbecker   tracing/function-...
9
  #include <linux/linkage.h>
ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
10
  #include <linux/bitops.h>
0012693ad   Frederic Weisbecker   tracing/function-...
11
  #include <linux/ktime.h>
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
12
  #include <linux/sched.h>
0012693ad   Frederic Weisbecker   tracing/function-...
13
14
15
  #include <linux/types.h>
  #include <linux/init.h>
  #include <linux/fs.h>
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
16

c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
17
  #include <asm/ftrace.h>
de4772542   Paul Gortmaker   include: replace ...
18
  struct module;
04da85b86   Steven Rostedt   ftrace: Fix warni...
19
  struct ftrace_hash;
606576ce8   Steven Rostedt   ftrace: rename FT...
20
  #ifdef CONFIG_FUNCTION_TRACER
3e1932ad5   Ingo Molnar   tracing/fastboot:...
21

b0fc494fa   Steven Rostedt   ftrace: add ftrac...
22
23
24
  extern int ftrace_enabled;
  extern int
  ftrace_enable_sysctl(struct ctl_table *table, int write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
25
  		     void __user *buffer, size_t *lenp,
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
26
  		     loff_t *ppos);
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
27
  typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip);
b848914ce   Steven Rostedt   ftrace: Implement...
28
29
30
  enum {
  	FTRACE_OPS_FL_ENABLED		= 1 << 0,
  	FTRACE_OPS_FL_GLOBAL		= 1 << 1,
cdbe61bfe   Steven Rostedt   ftrace: Allow dyn...
31
  	FTRACE_OPS_FL_DYNAMIC		= 1 << 2,
b848914ce   Steven Rostedt   ftrace: Implement...
32
  };
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
33
  struct ftrace_ops {
f45948e89   Steven Rostedt   ftrace: Create a ...
34
35
  	ftrace_func_t			func;
  	struct ftrace_ops		*next;
b848914ce   Steven Rostedt   ftrace: Implement...
36
  	unsigned long			flags;
f45948e89   Steven Rostedt   ftrace: Create a ...
37
38
39
40
  #ifdef CONFIG_DYNAMIC_FTRACE
  	struct ftrace_hash		*notrace_hash;
  	struct ftrace_hash		*filter_hash;
  #endif
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
41
  };
60a7ecf42   Steven Rostedt   ftrace: add quick...
42
  extern int function_trace_stop;
e7d3737ea   Frederic Weisbecker   tracing/function-...
43
44
45
46
47
48
49
50
51
52
  /*
   * Type of the current tracing.
   */
  enum ftrace_tracing_type_t {
  	FTRACE_TYPE_ENTER = 0, /* Hook the call of the function */
  	FTRACE_TYPE_RETURN,	/* Hook the return of the function */
  };
  
  /* Current tracing type, default is FTRACE_TYPE_ENTER */
  extern enum ftrace_tracing_type_t ftrace_tracing_type;
60a7ecf42   Steven Rostedt   ftrace: add quick...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  /**
   * ftrace_stop - stop function tracer.
   *
   * A quick way to stop the function tracer. Note this an on off switch,
   * it is not something that is recursive like preempt_disable.
   * This does not disable the calling of mcount, it only stops the
   * calling of functions from mcount.
   */
  static inline void ftrace_stop(void)
  {
  	function_trace_stop = 1;
  }
  
  /**
   * ftrace_start - start the function tracer.
   *
   * This function is the inverse of ftrace_stop. This does not enable
   * the function tracing if the function tracer is disabled. This only
   * sets the function tracer flag to continue calling the functions
   * from mcount.
   */
  static inline void ftrace_start(void)
  {
  	function_trace_stop = 0;
  }
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
78
79
80
81
82
83
84
85
86
87
88
89
  /*
   * The ftrace_ops must be a static and should also
   * be read_mostly.  These functions do modify read_mostly variables
   * so use them sparely. Never free an ftrace_op or modify the
   * next pointer after it has been registered. Even after unregistering
   * it, the next pointer may still be used internally.
   */
  int register_ftrace_function(struct ftrace_ops *ops);
  int unregister_ftrace_function(struct ftrace_ops *ops);
  void clear_ftrace_function(void);
  
  extern void ftrace_stub(unsigned long a0, unsigned long a1);
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
90

606576ce8   Steven Rostedt   ftrace: rename FT...
91
  #else /* !CONFIG_FUNCTION_TRACER */
4dbf6bc23   Steven Rostedt   tracing: Convert ...
92
93
94
95
96
97
98
  /*
   * (un)register_ftrace_function must be a macro since the ops parameter
   * must not be evaluated.
   */
  #define register_ftrace_function(ops) ({ 0; })
  #define unregister_ftrace_function(ops) ({ 0; })
  static inline void clear_ftrace_function(void) { }
81adbdc02   Steven Rostedt   ftrace: only have...
99
  static inline void ftrace_kill(void) { }
60a7ecf42   Steven Rostedt   ftrace: add quick...
100
101
  static inline void ftrace_stop(void) { }
  static inline void ftrace_start(void) { }
606576ce8   Steven Rostedt   ftrace: rename FT...
102
  #endif /* CONFIG_FUNCTION_TRACER */
352ad25aa   Steven Rostedt   ftrace: tracer fo...
103

f38f1d2aa   Steven Rostedt   trace: add a way ...
104
105
106
107
  #ifdef CONFIG_STACK_TRACER
  extern int stack_tracer_enabled;
  int
  stack_trace_sysctl(struct ctl_table *table, int write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
108
  		   void __user *buffer, size_t *lenp,
f38f1d2aa   Steven Rostedt   trace: add a way ...
109
110
  		   loff_t *ppos);
  #endif
f6180773d   Steven Rostedt   ftrace: add comma...
111
112
113
  struct ftrace_func_command {
  	struct list_head	list;
  	char			*name;
43dd61c9a   Steven Rostedt   ftrace: Fix regre...
114
115
  	int			(*func)(struct ftrace_hash *hash,
  					char *func, char *cmd,
f6180773d   Steven Rostedt   ftrace: add comma...
116
117
  					char *params, int enable);
  };
3d0833953   Steven Rostedt   ftrace: dynamic e...
118
  #ifdef CONFIG_DYNAMIC_FTRACE
31e889098   Steven Rostedt   ftrace: pass modu...
119

000ab6911   Steven Rostedt   ftrace: allow arc...
120
121
  int ftrace_arch_code_modify_prepare(void);
  int ftrace_arch_code_modify_post_process(void);
c88fd8634   Steven Rostedt   ftrace: Allow arc...
122
  void ftrace_bug(int err, unsigned long ip);
809dcf29c   Steven Rostedt   ftrace: add prett...
123
  struct seq_file;
b6887d791   Steven Rostedt   ftrace: rename _h...
124
  struct ftrace_probe_ops {
59df055f1   Steven Rostedt   ftrace: trace dif...
125
126
127
128
129
  	void			(*func)(unsigned long ip,
  					unsigned long parent_ip,
  					void **data);
  	int			(*callback)(unsigned long ip, void **data);
  	void			(*free)(void **data);
809dcf29c   Steven Rostedt   ftrace: add prett...
130
131
  	int			(*print)(struct seq_file *m,
  					 unsigned long ip,
b6887d791   Steven Rostedt   ftrace: rename _h...
132
  					 struct ftrace_probe_ops *ops,
809dcf29c   Steven Rostedt   ftrace: add prett...
133
  					 void *data);
59df055f1   Steven Rostedt   ftrace: trace dif...
134
135
136
  };
  
  extern int
b6887d791   Steven Rostedt   ftrace: rename _h...
137
  register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
59df055f1   Steven Rostedt   ftrace: trace dif...
138
139
  			      void *data);
  extern void
b6887d791   Steven Rostedt   ftrace: rename _h...
140
  unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
59df055f1   Steven Rostedt   ftrace: trace dif...
141
142
  				void *data);
  extern void
b6887d791   Steven Rostedt   ftrace: rename _h...
143
144
  unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops);
  extern void unregister_ftrace_function_probe_all(char *glob);
59df055f1   Steven Rostedt   ftrace: trace dif...
145

2cfa19780   Masami Hiramatsu   ftrace/alternativ...
146
  extern int ftrace_text_reserved(void *start, void *end);
3c1720f00   Steven Rostedt   ftrace: move memo...
147
  enum {
ed926f9b3   Steven Rostedt   ftrace: Use count...
148
  	FTRACE_FL_ENABLED	= (1 << 30),
3c1720f00   Steven Rostedt   ftrace: move memo...
149
  };
ed926f9b3   Steven Rostedt   ftrace: Use count...
150
151
  #define FTRACE_FL_MASK		(0x3UL << 30)
  #define FTRACE_REF_MAX		((1 << 30) - 1)
3d0833953   Steven Rostedt   ftrace: dynamic e...
152
  struct dyn_ftrace {
ee000b7f9   Lai Jiangshan   tracing: use unio...
153
154
155
156
  	union {
  		unsigned long		ip; /* address of mcount call-site */
  		struct dyn_ftrace	*freelist;
  	};
85ae32ae0   Steven Rostedt   ftrace: Replace r...
157
  	unsigned long		flags;
ee000b7f9   Lai Jiangshan   tracing: use unio...
158
  	struct dyn_arch_ftrace		arch;
3d0833953   Steven Rostedt   ftrace: dynamic e...
159
  };
e1c08bdd9   Steven Rostedt   ftrace: force rec...
160
  int ftrace_force_update(void);
936e074b2   Steven Rostedt   ftrace: Modify ft...
161
162
163
164
165
166
  void ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
  		       int len, int reset);
  void ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
  			int len, int reset);
  void ftrace_set_global_filter(unsigned char *buf, int len, int reset);
  void ftrace_set_global_notrace(unsigned char *buf, int len, int reset);
e1c08bdd9   Steven Rostedt   ftrace: force rec...
167

f6180773d   Steven Rostedt   ftrace: add comma...
168
169
  int register_ftrace_command(struct ftrace_func_command *cmd);
  int unregister_ftrace_command(struct ftrace_func_command *cmd);
c88fd8634   Steven Rostedt   ftrace: Allow arc...
170
171
172
173
174
175
176
177
178
179
180
181
182
  enum {
  	FTRACE_UPDATE_CALLS		= (1 << 0),
  	FTRACE_DISABLE_CALLS		= (1 << 1),
  	FTRACE_UPDATE_TRACE_FUNC	= (1 << 2),
  	FTRACE_START_FUNC_RET		= (1 << 3),
  	FTRACE_STOP_FUNC_RET		= (1 << 4),
  };
  
  enum {
  	FTRACE_UPDATE_IGNORE,
  	FTRACE_UPDATE_MAKE_CALL,
  	FTRACE_UPDATE_MAKE_NOP,
  };
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
183
184
185
186
  enum {
  	FTRACE_ITER_FILTER	= (1 << 0),
  	FTRACE_ITER_NOTRACE	= (1 << 1),
  	FTRACE_ITER_PRINTALL	= (1 << 2),
69a3083c4   Steven Rostedt   ftrace: Decouple ...
187
188
189
  	FTRACE_ITER_DO_HASH	= (1 << 3),
  	FTRACE_ITER_HASH	= (1 << 4),
  	FTRACE_ITER_ENABLED	= (1 << 5),
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
190
  };
c88fd8634   Steven Rostedt   ftrace: Allow arc...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  void arch_ftrace_update_code(int command);
  
  struct ftrace_rec_iter;
  
  struct ftrace_rec_iter *ftrace_rec_iter_start(void);
  struct ftrace_rec_iter *ftrace_rec_iter_next(struct ftrace_rec_iter *iter);
  struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter);
  
  int ftrace_update_record(struct dyn_ftrace *rec, int enable);
  int ftrace_test_record(struct dyn_ftrace *rec, int enable);
  void ftrace_run_stop_machine(int command);
  int ftrace_location(unsigned long ip);
  
  extern ftrace_func_t ftrace_trace_function;
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
205
206
207
208
209
210
211
212
  int ftrace_regex_open(struct ftrace_ops *ops, int flag,
  		  struct inode *inode, struct file *file);
  ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,
  			    size_t cnt, loff_t *ppos);
  ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
  			     size_t cnt, loff_t *ppos);
  loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin);
  int ftrace_regex_release(struct inode *inode, struct file *file);
2a85a37f1   Steven Rostedt   ftrace: Allow acc...
213
214
  void __init
  ftrace_set_early_filter(struct ftrace_ops *ops, char *buf, int enable);
3d0833953   Steven Rostedt   ftrace: dynamic e...
215
  /* defined in arch */
3c1720f00   Steven Rostedt   ftrace: move memo...
216
  extern int ftrace_ip_converted(unsigned long ip);
d61f82d06   Steven Rostedt   ftrace: use dynam...
217
  extern int ftrace_dyn_arch_init(void *data);
d61f82d06   Steven Rostedt   ftrace: use dynam...
218
219
220
221
  extern int ftrace_update_ftrace_func(ftrace_func_t func);
  extern void ftrace_caller(void);
  extern void ftrace_call(void);
  extern void mcount_call(void);
f00012074   Shaohua Li   ftrace, ia64: Add...
222
223
224
225
  
  #ifndef FTRACE_ADDR
  #define FTRACE_ADDR ((unsigned long)ftrace_caller)
  #endif
fb52607af   Frederic Weisbecker   tracing/function-...
226
227
  #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  extern void ftrace_graph_caller(void);
5a45cfe1c   Steven Rostedt   ftrace: use code ...
228
229
230
231
232
  extern int ftrace_enable_ftrace_graph_caller(void);
  extern int ftrace_disable_ftrace_graph_caller(void);
  #else
  static inline int ftrace_enable_ftrace_graph_caller(void) { return 0; }
  static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; }
e7d3737ea   Frederic Weisbecker   tracing/function-...
233
  #endif
ad90c0e3c   Steven Rostedt   ftrace: user upda...
234

31e889098   Steven Rostedt   ftrace: pass modu...
235
  /**
57794a9d4   Wenji Huang   trace: trivial fi...
236
   * ftrace_make_nop - convert code into nop
31e889098   Steven Rostedt   ftrace: pass modu...
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
   * @mod: module structure if called by module load initialization
   * @rec: the mcount call site record
   * @addr: the address that the call site should be calling
   *
   * This is a very sensitive operation and great care needs
   * to be taken by the arch.  The operation should carefully
   * read the location, check to see if what is read is indeed
   * what we expect it to be, and then on success of the compare,
   * it should write to the location.
   *
   * The code segment at @rec->ip should be a caller to @addr
   *
   * Return must be:
   *  0 on success
   *  -EFAULT on error reading the location
   *  -EINVAL on a failed compare of the contents
   *  -EPERM  on error writing to the location
   * Any other value will be considered a failure.
   */
  extern int ftrace_make_nop(struct module *mod,
  			   struct dyn_ftrace *rec, unsigned long addr);
a26a2a273   Steven Rostedt   ftrace: nmi safe ...
258

593eb8a2d   Steven Rostedt   ftrace: return er...
259
  /**
31e889098   Steven Rostedt   ftrace: pass modu...
260
261
262
   * ftrace_make_call - convert a nop call site into a call to addr
   * @rec: the mcount call site record
   * @addr: the address that the call site should call
593eb8a2d   Steven Rostedt   ftrace: return er...
263
264
265
266
267
268
269
   *
   * This is a very sensitive operation and great care needs
   * to be taken by the arch.  The operation should carefully
   * read the location, check to see if what is read is indeed
   * what we expect it to be, and then on success of the compare,
   * it should write to the location.
   *
31e889098   Steven Rostedt   ftrace: pass modu...
270
271
   * The code segment at @rec->ip should be a nop
   *
593eb8a2d   Steven Rostedt   ftrace: return er...
272
273
274
275
276
277
278
   * Return must be:
   *  0 on success
   *  -EFAULT on error reading the location
   *  -EINVAL on a failed compare of the contents
   *  -EPERM  on error writing to the location
   * Any other value will be considered a failure.
   */
31e889098   Steven Rostedt   ftrace: pass modu...
279
  extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr);
31e889098   Steven Rostedt   ftrace: pass modu...
280
281
  /* May be defined in arch */
  extern int ftrace_arch_read_dyn_info(char *buf, int size);
593eb8a2d   Steven Rostedt   ftrace: return er...
282

ecea656d1   Abhishek Sagar   ftrace: freeze kp...
283
  extern int skip_trace(unsigned long ip);
c0719e5a4   Steven Rostedt   ftrace: use ftrac...
284
285
  extern void ftrace_disable_daemon(void);
  extern void ftrace_enable_daemon(void);
e1c08bdd9   Steven Rostedt   ftrace: force rec...
286
  #else
4dbf6bc23   Steven Rostedt   tracing: Convert ...
287
288
289
290
291
292
293
  static inline int skip_trace(unsigned long ip) { return 0; }
  static inline int ftrace_force_update(void) { return 0; }
  static inline void ftrace_set_filter(unsigned char *buf, int len, int reset)
  {
  }
  static inline void ftrace_disable_daemon(void) { }
  static inline void ftrace_enable_daemon(void) { }
e7247a15f   jolsa@redhat.com   tracing: correct ...
294
  static inline void ftrace_release_mod(struct module *mod) {}
f6180773d   Steven Rostedt   ftrace: add comma...
295
296
  static inline int register_ftrace_command(struct ftrace_func_command *cmd)
  {
97d0bb8dc   Ingo Molnar   ftrace: fix !CONF...
297
  	return -EINVAL;
f6180773d   Steven Rostedt   ftrace: add comma...
298
299
300
  }
  static inline int unregister_ftrace_command(char *cmd_name)
  {
97d0bb8dc   Ingo Molnar   ftrace: fix !CONF...
301
  	return -EINVAL;
f6180773d   Steven Rostedt   ftrace: add comma...
302
  }
2cfa19780   Masami Hiramatsu   ftrace/alternativ...
303
304
305
306
  static inline int ftrace_text_reserved(void *start, void *end)
  {
  	return 0;
  }
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
307
308
309
310
311
312
313
  
  /*
   * Again users of functions that have ftrace_ops may not
   * have them defined when ftrace is not enabled, but these
   * functions may still be called. Use a macro instead of inline.
   */
  #define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })
96de37b62   Steven Rostedt   tracing: Fix comp...
314
  #define ftrace_set_early_filter(ops, buf, enable) do { } while (0)
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
315
316
317
318
319
320
321
322
323
324
325
  
  static inline ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,
  			    size_t cnt, loff_t *ppos) { return -ENODEV; }
  static inline ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
  			     size_t cnt, loff_t *ppos) { return -ENODEV; }
  static inline loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
  {
  	return -ENODEV;
  }
  static inline int
  ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
ecea656d1   Abhishek Sagar   ftrace: freeze kp...
326
  #endif /* CONFIG_DYNAMIC_FTRACE */
352ad25aa   Steven Rostedt   ftrace: tracer fo...
327

aeaee8a2c   Ingo Molnar   ftrace: build fix
328
329
  /* totally disable ftrace - can not re-enable after this */
  void ftrace_kill(void);
f43fdad86   Ingo Molnar   ftrace: fix kexec
330
331
  static inline void tracer_disable(void)
  {
606576ce8   Steven Rostedt   ftrace: rename FT...
332
  #ifdef CONFIG_FUNCTION_TRACER
f43fdad86   Ingo Molnar   ftrace: fix kexec
333
334
335
  	ftrace_enabled = 0;
  #endif
  }
370027358   Huang Ying   ftrace: fix incor...
336
337
  /*
   * Ftrace disable/restore without lock. Some synchronization mechanism
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
338
   * must be used to prevent ftrace_enabled to be changed between
370027358   Huang Ying   ftrace: fix incor...
339
340
   * disable/restore.
   */
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
341
342
  static inline int __ftrace_enabled_save(void)
  {
606576ce8   Steven Rostedt   ftrace: rename FT...
343
  #ifdef CONFIG_FUNCTION_TRACER
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
344
345
346
347
348
349
350
351
352
353
  	int saved_ftrace_enabled = ftrace_enabled;
  	ftrace_enabled = 0;
  	return saved_ftrace_enabled;
  #else
  	return 0;
  #endif
  }
  
  static inline void __ftrace_enabled_restore(int enabled)
  {
606576ce8   Steven Rostedt   ftrace: rename FT...
354
  #ifdef CONFIG_FUNCTION_TRACER
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
355
356
357
  	ftrace_enabled = enabled;
  #endif
  }
c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
  #ifndef HAVE_ARCH_CALLER_ADDR
  # ifdef CONFIG_FRAME_POINTER
  #  define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
  #  define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1))
  #  define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2))
  #  define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3))
  #  define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4))
  #  define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5))
  #  define CALLER_ADDR6 ((unsigned long)__builtin_return_address(6))
  # else
  #  define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
  #  define CALLER_ADDR1 0UL
  #  define CALLER_ADDR2 0UL
  #  define CALLER_ADDR3 0UL
  #  define CALLER_ADDR4 0UL
  #  define CALLER_ADDR5 0UL
  #  define CALLER_ADDR6 0UL
  # endif
  #endif /* ifndef HAVE_ARCH_CALLER_ADDR */
352ad25aa   Steven Rostedt   ftrace: tracer fo...
377

81d68a96a   Steven Rostedt   ftrace: trace irq...
378
  #ifdef CONFIG_IRQSOFF_TRACER
489f13961   Ingo Molnar   ftrace: fix build...
379
380
    extern void time_hardirqs_on(unsigned long a0, unsigned long a1);
    extern void time_hardirqs_off(unsigned long a0, unsigned long a1);
81d68a96a   Steven Rostedt   ftrace: trace irq...
381
  #else
4dbf6bc23   Steven Rostedt   tracing: Convert ...
382
383
    static inline void time_hardirqs_on(unsigned long a0, unsigned long a1) { }
    static inline void time_hardirqs_off(unsigned long a0, unsigned long a1) { }
81d68a96a   Steven Rostedt   ftrace: trace irq...
384
  #endif
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
385
  #ifdef CONFIG_PREEMPT_TRACER
489f13961   Ingo Molnar   ftrace: fix build...
386
387
    extern void trace_preempt_on(unsigned long a0, unsigned long a1);
    extern void trace_preempt_off(unsigned long a0, unsigned long a1);
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
388
  #else
4dbf6bc23   Steven Rostedt   tracing: Convert ...
389
390
    static inline void trace_preempt_on(unsigned long a0, unsigned long a1) { }
    static inline void trace_preempt_off(unsigned long a0, unsigned long a1) { }
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
391
  #endif
68bf21aa1   Steven Rostedt   ftrace: mcount ca...
392
393
394
395
396
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  extern void ftrace_init(void);
  #else
  static inline void ftrace_init(void) { }
  #endif
71566a0d1   Frederic Weisbecker   tracing/fastboot:...
397
  /*
287b6e68c   Frederic Weisbecker   tracing/function-...
398
399
400
401
402
403
   * Structure that defines an entry function trace.
   */
  struct ftrace_graph_ent {
  	unsigned long func; /* Current function */
  	int depth;
  };
dd0e545f0   Steven Rostedt   ftrace: printk fo...
404

71566a0d1   Frederic Weisbecker   tracing/fastboot:...
405
  /*
caf4b323b   Frederic Weisbecker   tracing, x86: add...
406
407
   * Structure that defines a return function trace.
   */
fb52607af   Frederic Weisbecker   tracing/function-...
408
  struct ftrace_graph_ret {
caf4b323b   Frederic Weisbecker   tracing, x86: add...
409
410
411
  	unsigned long func; /* Current function */
  	unsigned long long calltime;
  	unsigned long long rettime;
0231022cc   Frederic Weisbecker   tracing/function-...
412
413
  	/* Number of functions that overran the depth limit for current task */
  	unsigned long overrun;
287b6e68c   Frederic Weisbecker   tracing/function-...
414
  	int depth;
caf4b323b   Frederic Weisbecker   tracing, x86: add...
415
  };
62b915f10   Jiri Olsa   tracing: Add grap...
416
417
418
  /* Type of the callback handlers for tracing function graph*/
  typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); /* return */
  typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); /* entry */
fb52607af   Frederic Weisbecker   tracing/function-...
419
  #ifdef CONFIG_FUNCTION_GRAPH_TRACER
8b96f0119   Frederic Weisbecker   tracing/function-...
420

5ac9f6226   Steven Rostedt   function-graph: a...
421
  /* for init task */
f876d346e   Tetsuo Handa   tracing: append a...
422
  #define INIT_FTRACE_GRAPH		.ret_stack = NULL,
5ac9f6226   Steven Rostedt   function-graph: a...
423

8b96f0119   Frederic Weisbecker   tracing/function-...
424
  /*
712406a6b   Steven Rostedt   tracing/function-...
425
426
427
428
429
430
431
432
   * Stack of return addresses for functions
   * of a thread.
   * Used in struct thread_info
   */
  struct ftrace_ret_stack {
  	unsigned long ret;
  	unsigned long func;
  	unsigned long long calltime;
a2a16d6a3   Steven Rostedt   function-graph: a...
433
  	unsigned long long subtime;
71e308a23   Steven Rostedt   function-graph: a...
434
  	unsigned long fp;
712406a6b   Steven Rostedt   tracing/function-...
435
436
437
438
439
440
441
442
443
444
  };
  
  /*
   * Primary handler of a function return.
   * It relays on ftrace_return_to_handler.
   * Defined in entry_32/64.S
   */
  extern void return_to_handler(void);
  
  extern int
71e308a23   Steven Rostedt   function-graph: a...
445
446
  ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth,
  			 unsigned long frame_pointer);
712406a6b   Steven Rostedt   tracing/function-...
447
448
  
  /*
8b96f0119   Frederic Weisbecker   tracing/function-...
449
450
451
452
453
   * Sometimes we don't want to trace a function with the function
   * graph tracer but we want them to keep traced by the usual function
   * tracer if the function graph tracer is not configured.
   */
  #define __notrace_funcgraph		notrace
bcbc4f20b   Frederic Weisbecker   tracing/function-...
454
455
456
457
458
459
460
461
462
  /*
   * We want to which function is an entrypoint of a hardirq.
   * That will help us to put a signal on output.
   */
  #define __irq_entry		 __attribute__((__section__(".irqentry.text")))
  
  /* Limits of hardirq entrypoints */
  extern char __irqentry_text_start[];
  extern char __irqentry_text_end[];
f201ae235   Frederic Weisbecker   tracing/function-...
463
464
  #define FTRACE_RETFUNC_DEPTH 50
  #define FTRACE_RETSTACK_ALLOC_SIZE 32
287b6e68c   Frederic Weisbecker   tracing/function-...
465
466
  extern int register_ftrace_graph(trace_func_graph_ret_t retfunc,
  				trace_func_graph_ent_t entryfunc);
14a866c56   Steven Rostedt   ftrace: add ftrac...
467
  extern void ftrace_graph_stop(void);
287b6e68c   Frederic Weisbecker   tracing/function-...
468
469
470
  /* The current handlers in use */
  extern trace_func_graph_ret_t ftrace_graph_return;
  extern trace_func_graph_ent_t ftrace_graph_entry;
caf4b323b   Frederic Weisbecker   tracing, x86: add...
471

fb52607af   Frederic Weisbecker   tracing/function-...
472
  extern void unregister_ftrace_graph(void);
f201ae235   Frederic Weisbecker   tracing/function-...
473

fb52607af   Frederic Weisbecker   tracing/function-...
474
475
  extern void ftrace_graph_init_task(struct task_struct *t);
  extern void ftrace_graph_exit_task(struct task_struct *t);
868baf07b   Steven Rostedt   ftrace: Fix memor...
476
  extern void ftrace_graph_init_idle_task(struct task_struct *t, int cpu);
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
477
478
479
480
481
  
  static inline int task_curr_ret_stack(struct task_struct *t)
  {
  	return t->curr_ret_stack;
  }
380c4b141   Frederic Weisbecker   tracing/function-...
482
483
484
485
486
487
488
489
490
491
  
  static inline void pause_graph_tracing(void)
  {
  	atomic_inc(&current->tracing_graph_pause);
  }
  
  static inline void unpause_graph_tracing(void)
  {
  	atomic_dec(&current->tracing_graph_pause);
  }
5ac9f6226   Steven Rostedt   function-graph: a...
492
  #else /* !CONFIG_FUNCTION_GRAPH_TRACER */
8b96f0119   Frederic Weisbecker   tracing/function-...
493
494
  
  #define __notrace_funcgraph
bcbc4f20b   Frederic Weisbecker   tracing/function-...
495
  #define __irq_entry
5ac9f6226   Steven Rostedt   function-graph: a...
496
  #define INIT_FTRACE_GRAPH
8b96f0119   Frederic Weisbecker   tracing/function-...
497

fb52607af   Frederic Weisbecker   tracing/function-...
498
499
  static inline void ftrace_graph_init_task(struct task_struct *t) { }
  static inline void ftrace_graph_exit_task(struct task_struct *t) { }
868baf07b   Steven Rostedt   ftrace: Fix memor...
500
  static inline void ftrace_graph_init_idle_task(struct task_struct *t, int cpu) { }
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
501

62b915f10   Jiri Olsa   tracing: Add grap...
502
503
504
505
506
507
  static inline int register_ftrace_graph(trace_func_graph_ret_t retfunc,
  			  trace_func_graph_ent_t entryfunc)
  {
  	return -1;
  }
  static inline void unregister_ftrace_graph(void) { }
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
508
509
510
511
  static inline int task_curr_ret_stack(struct task_struct *tsk)
  {
  	return -1;
  }
380c4b141   Frederic Weisbecker   tracing/function-...
512
513
514
  
  static inline void pause_graph_tracing(void) { }
  static inline void unpause_graph_tracing(void) { }
5ac9f6226   Steven Rostedt   function-graph: a...
515
  #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
caf4b323b   Frederic Weisbecker   tracing, x86: add...
516

ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
517
  #ifdef CONFIG_TRACING
ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
  
  /* flags for current->trace */
  enum {
  	TSK_TRACE_FL_TRACE_BIT	= 0,
  	TSK_TRACE_FL_GRAPH_BIT	= 1,
  };
  enum {
  	TSK_TRACE_FL_TRACE	= 1 << TSK_TRACE_FL_TRACE_BIT,
  	TSK_TRACE_FL_GRAPH	= 1 << TSK_TRACE_FL_GRAPH_BIT,
  };
  
  static inline void set_tsk_trace_trace(struct task_struct *tsk)
  {
  	set_bit(TSK_TRACE_FL_TRACE_BIT, &tsk->trace);
  }
  
  static inline void clear_tsk_trace_trace(struct task_struct *tsk)
  {
  	clear_bit(TSK_TRACE_FL_TRACE_BIT, &tsk->trace);
  }
  
  static inline int test_tsk_trace_trace(struct task_struct *tsk)
  {
  	return tsk->trace & TSK_TRACE_FL_TRACE;
  }
  
  static inline void set_tsk_trace_graph(struct task_struct *tsk)
  {
  	set_bit(TSK_TRACE_FL_GRAPH_BIT, &tsk->trace);
  }
  
  static inline void clear_tsk_trace_graph(struct task_struct *tsk)
  {
  	clear_bit(TSK_TRACE_FL_GRAPH_BIT, &tsk->trace);
  }
  
  static inline int test_tsk_trace_graph(struct task_struct *tsk)
  {
  	return tsk->trace & TSK_TRACE_FL_GRAPH;
  }
cecbca96d   Frederic Weisbecker   tracing: Dump eit...
558
559
560
  enum ftrace_dump_mode;
  
  extern enum ftrace_dump_mode ftrace_dump_on_oops;
526211bc5   Ingo Molnar   tracing: move uti...
561

261842b7c   Steven Rostedt   tracing: add same...
562
563
564
  #ifdef CONFIG_PREEMPT
  #define INIT_TRACE_RECURSION		.trace_recursion = 0,
  #endif
ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
565
  #endif /* CONFIG_TRACING */
261842b7c   Steven Rostedt   tracing: add same...
566
567
568
  #ifndef INIT_TRACE_RECURSION
  #define INIT_TRACE_RECURSION
  #endif
b1818748b   Markus Metzger   x86, ftrace, hw-b...
569

e7b8e675d   Mike Frysinger   tracing: Unify ar...
570
571
572
573
574
  #ifdef CONFIG_FTRACE_SYSCALLS
  
  unsigned long arch_syscall_addr(int nr);
  
  #endif /* CONFIG_FTRACE_SYSCALLS */
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
575
  #endif /* _LINUX_FTRACE_H */