Blame view

include/linux/ftrace.h 26.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>
a1e2e31d1   Steven Rostedt   ftrace: Return pt...
11
  #include <linux/ptrace.h>
0012693ad   Frederic Weisbecker   tracing/function-...
12
  #include <linux/ktime.h>
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
13
  #include <linux/sched.h>
0012693ad   Frederic Weisbecker   tracing/function-...
14
15
16
  #include <linux/types.h>
  #include <linux/init.h>
  #include <linux/fs.h>
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
17

c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
18
  #include <asm/ftrace.h>
2f5f6ad93   Steven Rostedt   ftrace: Pass ftra...
19
20
21
22
23
24
25
26
  /*
   * If the arch supports passing the variable contents of
   * function_trace_op as the third parameter back from the
   * mcount call, then the arch should define this as 1.
   */
  #ifndef ARCH_SUPPORTS_FTRACE_OPS
  #define ARCH_SUPPORTS_FTRACE_OPS 0
  #endif
ccf3672d5   Steven Rostedt   ftrace: Consolida...
27
28
29
30
31
  /*
   * If the arch's mcount caller does not support all of ftrace's
   * features, then it must call an indirect function that
   * does. Or at least does enough to prevent any unwelcomed side effects.
   */
7544256aa   Steven Rostedt (Red Hat)   ftrace: Remove ch...
32
  #if !ARCH_SUPPORTS_FTRACE_OPS
ccf3672d5   Steven Rostedt   ftrace: Consolida...
33
34
35
36
  # define FTRACE_FORCE_LIST_FUNC 1
  #else
  # define FTRACE_FORCE_LIST_FUNC 0
  #endif
de4772542   Paul Gortmaker   include: replace ...
37
  struct module;
04da85b86   Steven Rostedt   ftrace: Fix warni...
38
  struct ftrace_hash;
606576ce8   Steven Rostedt   ftrace: rename FT...
39
  #ifdef CONFIG_FUNCTION_TRACER
3e1932ad5   Ingo Molnar   tracing/fastboot:...
40

b0fc494fa   Steven Rostedt   ftrace: add ftrac...
41
42
43
  extern int ftrace_enabled;
  extern int
  ftrace_enable_sysctl(struct ctl_table *table, int write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
44
  		     void __user *buffer, size_t *lenp,
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
45
  		     loff_t *ppos);
2f5f6ad93   Steven Rostedt   ftrace: Pass ftra...
46
47
48
  struct ftrace_ops;
  
  typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,
a1e2e31d1   Steven Rostedt   ftrace: Return pt...
49
  			      struct ftrace_ops *op, struct pt_regs *regs);
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
50

e248491ac   Jiri Olsa   ftrace: Add enabl...
51
52
53
54
55
  /*
   * FTRACE_OPS_FL_* bits denote the state of ftrace_ops struct and are
   * set in the flags member.
   *
   * ENABLED - set/unset when ftrace_ops is registered/unregistered
e248491ac   Jiri Olsa   ftrace: Add enabl...
56
57
58
59
60
61
   * DYNAMIC - set when ftrace_ops is registered to denote dynamically
   *           allocated ftrace_ops which need special care
   * CONTROL - set manualy by ftrace_ops user to denote the ftrace_ops
   *           could be controled by following calls:
   *             ftrace_function_local_enable
   *             ftrace_function_local_disable
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
62
63
64
   * SAVE_REGS - The ftrace_ops wants regs saved at each function called
   *            and passed to the callback. If this flag is set, but the
   *            architecture does not support passing regs
06aeaaeab   Masami Hiramatsu   ftrace: Move ARCH...
65
   *            (CONFIG_DYNAMIC_FTRACE_WITH_REGS is not defined), then the
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
66
67
68
69
70
71
72
73
74
75
   *            ftrace_ops will fail to register, unless the next flag
   *            is set.
   * SAVE_REGS_IF_SUPPORTED - This is the same as SAVE_REGS, but if the
   *            handler can handle an arch that does not save regs
   *            (the handler tests if regs == NULL), then it can set
   *            this flag instead. It will not fail registering the ftrace_ops
   *            but, the regs field will be NULL if the arch does not support
   *            passing regs to the handler.
   *            Note, if this flag is set, the SAVE_REGS flag will automatically
   *            get set upon registering the ftrace_ops, if the arch supports it.
4740974a6   Steven Rostedt   ftrace: Add defau...
76
77
78
79
   * RECURSION_SAFE - The ftrace_ops can set this to tell the ftrace infrastructure
   *            that the call back has its own recursion protection. If it does
   *            not set this, then the ftrace infrastructure will add recursion
   *            protection for the caller.
395b97a3a   Steven Rostedt (Red Hat)   ftrace: Do not ca...
80
   * STUB   - The ftrace_ops is just a place holder.
f04f24fb7   Masami Hiramatsu   ftrace, kprobes: ...
81
82
   * INITIALIZED - The ftrace_ops has already been initialized (first use time
   *            register_ftrace_function() is called, it will initialized the ops)
591dffdad   Steven Rostedt (Red Hat)   ftrace: Allow for...
83
   * DELETED - The ops are being deleted, do not let them be registered again.
e248491ac   Jiri Olsa   ftrace: Add enabl...
84
   */
b848914ce   Steven Rostedt   ftrace: Implement...
85
  enum {
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
86
  	FTRACE_OPS_FL_ENABLED			= 1 << 0,
4104d326b   Steven Rostedt (Red Hat)   ftrace: Remove gl...
87
88
89
90
91
92
93
94
  	FTRACE_OPS_FL_DYNAMIC			= 1 << 1,
  	FTRACE_OPS_FL_CONTROL			= 1 << 2,
  	FTRACE_OPS_FL_SAVE_REGS			= 1 << 3,
  	FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED	= 1 << 4,
  	FTRACE_OPS_FL_RECURSION_SAFE		= 1 << 5,
  	FTRACE_OPS_FL_STUB			= 1 << 6,
  	FTRACE_OPS_FL_INITIALIZED		= 1 << 7,
  	FTRACE_OPS_FL_DELETED			= 1 << 8,
b848914ce   Steven Rostedt   ftrace: Implement...
95
  };
b7e00a6c5   Steven Rostedt (Red Hat)   ftrace: Add priva...
96
97
98
99
100
101
102
103
104
105
106
  /*
   * Note, ftrace_ops can be referenced outside of RCU protection.
   * (Although, for perf, the control ops prevent that). If ftrace_ops is
   * allocated and not part of kernel core data, the unregistering of it will
   * perform a scheduling on all CPUs to make sure that there are no more users.
   * Depending on the load of the system that may take a bit of time.
   *
   * Any private data added must also take care not to be freed and if private
   * data is added to a ftrace_ops that is in core code, the user of the
   * ftrace_ops must perform a schedule_on_each_cpu() before freeing it.
   */
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
107
  struct ftrace_ops {
f45948e89   Steven Rostedt   ftrace: Create a ...
108
109
  	ftrace_func_t			func;
  	struct ftrace_ops		*next;
b848914ce   Steven Rostedt   ftrace: Implement...
110
  	unsigned long			flags;
b7e00a6c5   Steven Rostedt (Red Hat)   ftrace: Add priva...
111
  	void				*private;
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
112
  	int __percpu			*disabled;
f45948e89   Steven Rostedt   ftrace: Create a ...
113
  #ifdef CONFIG_DYNAMIC_FTRACE
0162d621d   Steven Rostedt (Red Hat)   ftrace: Rename ft...
114
  	int				nr_trampolines;
f45948e89   Steven Rostedt   ftrace: Create a ...
115
116
  	struct ftrace_hash		*notrace_hash;
  	struct ftrace_hash		*filter_hash;
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
117
  	struct ftrace_hash		*tramp_hash;
f04f24fb7   Masami Hiramatsu   ftrace, kprobes: ...
118
  	struct mutex			regex_lock;
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
119
  	unsigned long			trampoline;
f45948e89   Steven Rostedt   ftrace: Create a ...
120
  #endif
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
121
  };
e7d3737ea   Frederic Weisbecker   tracing/function-...
122
123
124
125
126
127
128
129
130
131
  /*
   * 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;
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
132
133
134
135
136
137
138
139
140
141
  /*
   * 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);
e248491ac   Jiri Olsa   ftrace: Add enabl...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  /**
   * ftrace_function_local_enable - enable controlled ftrace_ops on current cpu
   *
   * This function enables tracing on current cpu by decreasing
   * the per cpu control variable.
   * It must be called with preemption disabled and only on ftrace_ops
   * registered with FTRACE_OPS_FL_CONTROL. If called without preemption
   * disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled.
   */
  static inline void ftrace_function_local_enable(struct ftrace_ops *ops)
  {
  	if (WARN_ON_ONCE(!(ops->flags & FTRACE_OPS_FL_CONTROL)))
  		return;
  
  	(*this_cpu_ptr(ops->disabled))--;
  }
  
  /**
   * ftrace_function_local_disable - enable controlled ftrace_ops on current cpu
   *
   * This function enables tracing on current cpu by decreasing
   * the per cpu control variable.
   * It must be called with preemption disabled and only on ftrace_ops
   * registered with FTRACE_OPS_FL_CONTROL. If called without preemption
   * disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled.
   */
  static inline void ftrace_function_local_disable(struct ftrace_ops *ops)
  {
  	if (WARN_ON_ONCE(!(ops->flags & FTRACE_OPS_FL_CONTROL)))
  		return;
  
  	(*this_cpu_ptr(ops->disabled))++;
  }
  
  /**
   * ftrace_function_local_disabled - returns ftrace_ops disabled value
   *                                  on current cpu
   *
   * This function returns value of ftrace_ops::disabled on current cpu.
   * It must be called with preemption disabled and only on ftrace_ops
   * registered with FTRACE_OPS_FL_CONTROL. If called without preemption
   * disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled.
   */
  static inline int ftrace_function_local_disabled(struct ftrace_ops *ops)
  {
  	WARN_ON_ONCE(!(ops->flags & FTRACE_OPS_FL_CONTROL));
  	return *this_cpu_ptr(ops->disabled);
  }
a1e2e31d1   Steven Rostedt   ftrace: Return pt...
190
191
  extern void ftrace_stub(unsigned long a0, unsigned long a1,
  			struct ftrace_ops *op, struct pt_regs *regs);
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
192

606576ce8   Steven Rostedt   ftrace: rename FT...
193
  #else /* !CONFIG_FUNCTION_TRACER */
4dbf6bc23   Steven Rostedt   tracing: Convert ...
194
195
196
197
198
199
  /*
   * (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; })
ea701f11d   Steven Rostedt   ftrace: Add selft...
200
201
202
203
  static inline int ftrace_nr_registered_ops(void)
  {
  	return 0;
  }
4dbf6bc23   Steven Rostedt   tracing: Convert ...
204
  static inline void clear_ftrace_function(void) { }
81adbdc02   Steven Rostedt   ftrace: only have...
205
  static inline void ftrace_kill(void) { }
606576ce8   Steven Rostedt   ftrace: rename FT...
206
  #endif /* CONFIG_FUNCTION_TRACER */
352ad25aa   Steven Rostedt   ftrace: tracer fo...
207

f38f1d2aa   Steven Rostedt   trace: add a way ...
208
209
210
211
  #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...
212
  		   void __user *buffer, size_t *lenp,
f38f1d2aa   Steven Rostedt   trace: add a way ...
213
214
  		   loff_t *ppos);
  #endif
f6180773d   Steven Rostedt   ftrace: add comma...
215
216
217
  struct ftrace_func_command {
  	struct list_head	list;
  	char			*name;
43dd61c9a   Steven Rostedt   ftrace: Fix regre...
218
219
  	int			(*func)(struct ftrace_hash *hash,
  					char *func, char *cmd,
f6180773d   Steven Rostedt   ftrace: add comma...
220
221
  					char *params, int enable);
  };
3d0833953   Steven Rostedt   ftrace: dynamic e...
222
  #ifdef CONFIG_DYNAMIC_FTRACE
31e889098   Steven Rostedt   ftrace: pass modu...
223

000ab6911   Steven Rostedt   ftrace: allow arc...
224
225
  int ftrace_arch_code_modify_prepare(void);
  int ftrace_arch_code_modify_post_process(void);
c88fd8634   Steven Rostedt   ftrace: Allow arc...
226
  void ftrace_bug(int err, unsigned long ip);
809dcf29c   Steven Rostedt   ftrace: add prett...
227
  struct seq_file;
b6887d791   Steven Rostedt   ftrace: rename _h...
228
  struct ftrace_probe_ops {
59df055f1   Steven Rostedt   ftrace: trace dif...
229
230
231
  	void			(*func)(unsigned long ip,
  					unsigned long parent_ip,
  					void **data);
e67efb93f   Steven Rostedt (Red Hat)   ftrace: Clean up ...
232
233
234
235
  	int			(*init)(struct ftrace_probe_ops *ops,
  					unsigned long ip, void **data);
  	void			(*free)(struct ftrace_probe_ops *ops,
  					unsigned long ip, void **data);
809dcf29c   Steven Rostedt   ftrace: add prett...
236
237
  	int			(*print)(struct seq_file *m,
  					 unsigned long ip,
b6887d791   Steven Rostedt   ftrace: rename _h...
238
  					 struct ftrace_probe_ops *ops,
809dcf29c   Steven Rostedt   ftrace: add prett...
239
  					 void *data);
59df055f1   Steven Rostedt   ftrace: trace dif...
240
241
242
  };
  
  extern int
b6887d791   Steven Rostedt   ftrace: rename _h...
243
  register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
59df055f1   Steven Rostedt   ftrace: trace dif...
244
245
  			      void *data);
  extern void
b6887d791   Steven Rostedt   ftrace: rename _h...
246
  unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
59df055f1   Steven Rostedt   ftrace: trace dif...
247
248
  				void *data);
  extern void
b6887d791   Steven Rostedt   ftrace: rename _h...
249
250
  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...
251

d88471cb8   Sasha Levin   ftrace: Constify ...
252
  extern int ftrace_text_reserved(const void *start, const void *end);
2cfa19780   Masami Hiramatsu   ftrace/alternativ...
253

ea701f11d   Steven Rostedt   ftrace: Add selft...
254
  extern int ftrace_nr_registered_ops(void);
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  /*
   * The dyn_ftrace record's flags field is split into two parts.
   * the first part which is '0-FTRACE_REF_MAX' is a counter of
   * the number of callbacks that have registered the function that
   * the dyn_ftrace descriptor represents.
   *
   * The second part is a mask:
   *  ENABLED - the function is being traced
   *  REGS    - the record wants the function to save regs
   *  REGS_EN - the function is set up to save regs.
   *
   * When a new ftrace_ops is registered and wants a function to save
   * pt_regs, the rec->flag REGS is set. When the function has been
   * set up to save regs, the REG_EN flag is set. Once a function
   * starts saving regs it will do so until all ftrace_ops are removed
   * from tracing that function.
   */
3c1720f00   Steven Rostedt   ftrace: move memo...
272
  enum {
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
273
  	FTRACE_FL_ENABLED	= (1UL << 31),
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
274
  	FTRACE_FL_REGS		= (1UL << 30),
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
275
276
277
  	FTRACE_FL_REGS_EN	= (1UL << 29),
  	FTRACE_FL_TRAMP		= (1UL << 28),
  	FTRACE_FL_TRAMP_EN	= (1UL << 27),
3c1720f00   Steven Rostedt   ftrace: move memo...
278
  };
79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
279
280
  #define FTRACE_REF_MAX_SHIFT	27
  #define FTRACE_FL_BITS		5
cf2cb0b27   Steven Rostedt (Red Hat)   ftrace: Use macro...
281
282
283
  #define FTRACE_FL_MASKED_BITS	((1UL << FTRACE_FL_BITS) - 1)
  #define FTRACE_FL_MASK		(FTRACE_FL_MASKED_BITS << FTRACE_REF_MAX_SHIFT)
  #define FTRACE_REF_MAX		((1UL << FTRACE_REF_MAX_SHIFT) - 1)
ed926f9b3   Steven Rostedt   ftrace: Use count...
284

0376bde11   Steven Rostedt (Red Hat)   ftrace: Add ftrac...
285
  #define ftrace_rec_count(rec)	((rec)->flags & ~FTRACE_FL_MASK)
3d0833953   Steven Rostedt   ftrace: dynamic e...
286
  struct dyn_ftrace {
a762782d7   Jiri Slaby   ftrace: Remove fr...
287
  	unsigned long		ip; /* address of mcount call-site */
85ae32ae0   Steven Rostedt   ftrace: Replace r...
288
  	unsigned long		flags;
a762782d7   Jiri Slaby   ftrace: Remove fr...
289
  	struct dyn_arch_ftrace	arch;
3d0833953   Steven Rostedt   ftrace: dynamic e...
290
  };
e1c08bdd9   Steven Rostedt   ftrace: force rec...
291
  int ftrace_force_update(void);
647664eaf   Masami Hiramatsu   ftrace: add ftrac...
292
293
  int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip,
  			 int remove, int reset);
ac483c446   Jiri Olsa   ftrace: Change fi...
294
  int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
936e074b2   Steven Rostedt   ftrace: Modify ft...
295
  		       int len, int reset);
ac483c446   Jiri Olsa   ftrace: Change fi...
296
  int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
936e074b2   Steven Rostedt   ftrace: Modify ft...
297
298
299
  			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);
5500fa511   Jiri Olsa   ftrace, perf: Add...
300
  void ftrace_free_filter(struct ftrace_ops *ops);
e1c08bdd9   Steven Rostedt   ftrace: force rec...
301

f6180773d   Steven Rostedt   ftrace: add comma...
302
303
  int register_ftrace_command(struct ftrace_func_command *cmd);
  int unregister_ftrace_command(struct ftrace_func_command *cmd);
c88fd8634   Steven Rostedt   ftrace: Allow arc...
304
305
306
307
308
309
310
  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),
  };
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
311
312
313
314
315
316
317
318
319
  /*
   * The FTRACE_UPDATE_* enum is used to pass information back
   * from the ftrace_update_record() and ftrace_test_record()
   * functions. These are called by the code update routines
   * to find out what is to be done for a given function.
   *
   *  IGNORE           - The function is already what we want it to be
   *  MAKE_CALL        - Start tracing the function
   *  MODIFY_CALL      - Stop saving regs for the function
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
320
321
   *  MAKE_NOP         - Stop tracing the function
   */
c88fd8634   Steven Rostedt   ftrace: Allow arc...
322
323
324
  enum {
  	FTRACE_UPDATE_IGNORE,
  	FTRACE_UPDATE_MAKE_CALL,
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
325
  	FTRACE_UPDATE_MODIFY_CALL,
c88fd8634   Steven Rostedt   ftrace: Allow arc...
326
327
  	FTRACE_UPDATE_MAKE_NOP,
  };
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
328
329
330
331
  enum {
  	FTRACE_ITER_FILTER	= (1 << 0),
  	FTRACE_ITER_NOTRACE	= (1 << 1),
  	FTRACE_ITER_PRINTALL	= (1 << 2),
69a3083c4   Steven Rostedt   ftrace: Decouple ...
332
333
334
  	FTRACE_ITER_DO_HASH	= (1 << 3),
  	FTRACE_ITER_HASH	= (1 << 4),
  	FTRACE_ITER_ENABLED	= (1 << 5),
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
335
  };
c88fd8634   Steven Rostedt   ftrace: Allow arc...
336
337
338
339
340
341
342
  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);
08d636b6d   Steven Rostedt   ftrace/x86: Have ...
343
344
345
346
  #define for_ftrace_rec_iter(iter)		\
  	for (iter = ftrace_rec_iter_start();	\
  	     iter;				\
  	     iter = ftrace_rec_iter_next(iter))
c88fd8634   Steven Rostedt   ftrace: Allow arc...
347
348
349
  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);
f0cf973a2   Steven Rostedt   ftrace: Return re...
350
  unsigned long ftrace_location(unsigned long ip);
7413af1fb   Steven Rostedt (Red Hat)   ftrace: Make get_...
351
352
  unsigned long ftrace_get_addr_new(struct dyn_ftrace *rec);
  unsigned long ftrace_get_addr_curr(struct dyn_ftrace *rec);
c88fd8634   Steven Rostedt   ftrace: Allow arc...
353
354
  
  extern ftrace_func_t ftrace_trace_function;
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
355
356
357
358
359
360
  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);
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
361
  int ftrace_regex_release(struct inode *inode, struct file *file);
2a85a37f1   Steven Rostedt   ftrace: Allow acc...
362
363
  void __init
  ftrace_set_early_filter(struct ftrace_ops *ops, char *buf, int enable);
3d0833953   Steven Rostedt   ftrace: dynamic e...
364
  /* defined in arch */
3c1720f00   Steven Rostedt   ftrace: move memo...
365
  extern int ftrace_ip_converted(unsigned long ip);
3a36cb11c   Jiri Slaby   ftrace: Do not pa...
366
  extern int ftrace_dyn_arch_init(void);
e4f5d5440   Steven Rostedt   ftrace/x86: Have ...
367
  extern void ftrace_replace_code(int enable);
d61f82d06   Steven Rostedt   ftrace: use dynam...
368
369
  extern int ftrace_update_ftrace_func(ftrace_func_t func);
  extern void ftrace_caller(void);
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
370
  extern void ftrace_regs_caller(void);
d61f82d06   Steven Rostedt   ftrace: use dynam...
371
  extern void ftrace_call(void);
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
372
  extern void ftrace_regs_call(void);
d61f82d06   Steven Rostedt   ftrace: use dynam...
373
  extern void mcount_call(void);
f00012074   Shaohua Li   ftrace, ia64: Add...
374

8ed3e2cfe   Steven Rostedt   ftrace: Make ftra...
375
  void ftrace_modify_all_code(int command);
f00012074   Shaohua Li   ftrace, ia64: Add...
376
377
378
  #ifndef FTRACE_ADDR
  #define FTRACE_ADDR ((unsigned long)ftrace_caller)
  #endif
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
379

79922b800   Steven Rostedt (Red Hat)   ftrace: Optimize ...
380
381
382
  #ifndef FTRACE_GRAPH_ADDR
  #define FTRACE_GRAPH_ADDR ((unsigned long)ftrace_graph_caller)
  #endif
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
383
  #ifndef FTRACE_REGS_ADDR
06aeaaeab   Masami Hiramatsu   ftrace: Move ARCH...
384
  #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
385
386
387
388
389
  # define FTRACE_REGS_ADDR ((unsigned long)ftrace_regs_caller)
  #else
  # define FTRACE_REGS_ADDR FTRACE_ADDR
  #endif
  #endif
646d7043a   Steven Rostedt (Red Hat)   ftrace: Allow arc...
390
391
392
393
394
395
396
397
398
  /*
   * If an arch would like functions that are only traced
   * by the function graph tracer to jump directly to its own
   * trampoline, then they can define FTRACE_GRAPH_TRAMP_ADDR
   * to be that address to jump to.
   */
  #ifndef FTRACE_GRAPH_TRAMP_ADDR
  #define FTRACE_GRAPH_TRAMP_ADDR ((unsigned long) 0)
  #endif
fb52607af   Frederic Weisbecker   tracing/function-...
399
400
  #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  extern void ftrace_graph_caller(void);
5a45cfe1c   Steven Rostedt   ftrace: use code ...
401
402
403
404
405
  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-...
406
  #endif
ad90c0e3c   Steven Rostedt   ftrace: user upda...
407

31e889098   Steven Rostedt   ftrace: pass modu...
408
  /**
57794a9d4   Wenji Huang   trace: trivial fi...
409
   * ftrace_make_nop - convert code into nop
31e889098   Steven Rostedt   ftrace: pass modu...
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
   * @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 ...
431

593eb8a2d   Steven Rostedt   ftrace: return er...
432
  /**
31e889098   Steven Rostedt   ftrace: pass modu...
433
434
435
   * 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...
436
437
438
439
440
441
442
   *
   * 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...
443
444
   * The code segment at @rec->ip should be a nop
   *
593eb8a2d   Steven Rostedt   ftrace: return er...
445
446
447
448
449
450
451
   * 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...
452
  extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr);
06aeaaeab   Masami Hiramatsu   ftrace: Move ARCH...
453
  #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
08f6fba50   Steven Rostedt   ftrace/x86: Add s...
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
  /**
   * ftrace_modify_call - convert from one addr to another (no nop)
   * @rec: the mcount call site record
   * @old_addr: the address expected to be currently called to
   * @addr: the address to change to
   *
   * 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 @old_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_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
  			      unsigned long addr);
  #else
  /* Should never be called */
  static inline int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
  				     unsigned long addr)
  {
  	return -EINVAL;
  }
  #endif
31e889098   Steven Rostedt   ftrace: pass modu...
485
486
  /* May be defined in arch */
  extern int ftrace_arch_read_dyn_info(char *buf, int size);
593eb8a2d   Steven Rostedt   ftrace: return er...
487

ecea656d1   Abhishek Sagar   ftrace: freeze kp...
488
  extern int skip_trace(unsigned long ip);
a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
489
  extern void ftrace_module_init(struct module *mod);
ecea656d1   Abhishek Sagar   ftrace: freeze kp...
490

c0719e5a4   Steven Rostedt   ftrace: use ftrac...
491
492
  extern void ftrace_disable_daemon(void);
  extern void ftrace_enable_daemon(void);
4dc936769   Steven Rostedt   ftrace: Make ftra...
493
  #else /* CONFIG_DYNAMIC_FTRACE */
4dbf6bc23   Steven Rostedt   tracing: Convert ...
494
495
  static inline int skip_trace(unsigned long ip) { return 0; }
  static inline int ftrace_force_update(void) { return 0; }
4dbf6bc23   Steven Rostedt   tracing: Convert ...
496
497
  static inline void ftrace_disable_daemon(void) { }
  static inline void ftrace_enable_daemon(void) { }
e7247a15f   jolsa@redhat.com   tracing: correct ...
498
  static inline void ftrace_release_mod(struct module *mod) {}
a949ae560   Steven Rostedt (Red Hat)   ftrace/module: Ha...
499
  static inline void ftrace_module_init(struct module *mod) {}
38de93abe   Tom Zanussi   tracing: Make reg...
500
  static inline __init int register_ftrace_command(struct ftrace_func_command *cmd)
f6180773d   Steven Rostedt   ftrace: add comma...
501
  {
97d0bb8dc   Ingo Molnar   ftrace: fix !CONF...
502
  	return -EINVAL;
f6180773d   Steven Rostedt   ftrace: add comma...
503
  }
38de93abe   Tom Zanussi   tracing: Make reg...
504
  static inline __init int unregister_ftrace_command(char *cmd_name)
f6180773d   Steven Rostedt   ftrace: add comma...
505
  {
97d0bb8dc   Ingo Molnar   ftrace: fix !CONF...
506
  	return -EINVAL;
f6180773d   Steven Rostedt   ftrace: add comma...
507
  }
d88471cb8   Sasha Levin   ftrace: Constify ...
508
  static inline int ftrace_text_reserved(const void *start, const void *end)
2cfa19780   Masami Hiramatsu   ftrace/alternativ...
509
510
511
  {
  	return 0;
  }
4dc936769   Steven Rostedt   ftrace: Make ftra...
512
513
514
515
  static inline unsigned long ftrace_location(unsigned long ip)
  {
  	return 0;
  }
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
516
517
518
519
520
521
522
  
  /*
   * 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...
523
  #define ftrace_set_early_filter(ops, buf, enable) do { } while (0)
647664eaf   Masami Hiramatsu   ftrace: add ftrac...
524
  #define ftrace_set_filter_ip(ops, ip, remove, reset) ({ -ENODEV; })
5500fa511   Jiri Olsa   ftrace, perf: Add...
525
526
527
  #define ftrace_set_filter(ops, buf, len, reset) ({ -ENODEV; })
  #define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })
  #define ftrace_free_filter(ops) do { } while (0)
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
528
529
530
531
532
  
  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; }
fc13cb0ce   Steven Rostedt   ftrace: Allow oth...
533
534
  static inline int
  ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
ecea656d1   Abhishek Sagar   ftrace: freeze kp...
535
  #endif /* CONFIG_DYNAMIC_FTRACE */
352ad25aa   Steven Rostedt   ftrace: tracer fo...
536

aeaee8a2c   Ingo Molnar   ftrace: build fix
537
538
  /* totally disable ftrace - can not re-enable after this */
  void ftrace_kill(void);
f43fdad86   Ingo Molnar   ftrace: fix kexec
539
540
  static inline void tracer_disable(void)
  {
606576ce8   Steven Rostedt   ftrace: rename FT...
541
  #ifdef CONFIG_FUNCTION_TRACER
f43fdad86   Ingo Molnar   ftrace: fix kexec
542
543
544
  	ftrace_enabled = 0;
  #endif
  }
370027358   Huang Ying   ftrace: fix incor...
545
546
  /*
   * Ftrace disable/restore without lock. Some synchronization mechanism
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
547
   * must be used to prevent ftrace_enabled to be changed between
370027358   Huang Ying   ftrace: fix incor...
548
549
   * disable/restore.
   */
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
550
551
  static inline int __ftrace_enabled_save(void)
  {
606576ce8   Steven Rostedt   ftrace: rename FT...
552
  #ifdef CONFIG_FUNCTION_TRACER
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
553
554
555
556
557
558
559
560
561
562
  	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...
563
  #ifdef CONFIG_FUNCTION_TRACER
9bdeb7b5d   Huang Ying   kexec jump: __ftr...
564
565
566
  	ftrace_enabled = enabled;
  #endif
  }
eed542d69   AKASHI Takahiro   ftrace: Make CALL...
567
568
569
570
571
572
573
  /* All archs should have this, but we define it for consistency */
  #ifndef ftrace_return_address0
  # define ftrace_return_address0 __builtin_return_address(0)
  #endif
  
  /* Archs may use other ways for ADDR1 and beyond */
  #ifndef ftrace_return_address
c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
574
  # ifdef CONFIG_FRAME_POINTER
eed542d69   AKASHI Takahiro   ftrace: Make CALL...
575
  #  define ftrace_return_address(n) __builtin_return_address(n)
c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
576
  # else
eed542d69   AKASHI Takahiro   ftrace: Make CALL...
577
  #  define ftrace_return_address(n) 0UL
c79a61f55   Uwe Kleine-Koenig   tracing: make CAL...
578
  # endif
eed542d69   AKASHI Takahiro   ftrace: Make CALL...
579
580
581
582
583
584
585
586
587
  #endif
  
  #define CALLER_ADDR0 ((unsigned long)ftrace_return_address0)
  #define CALLER_ADDR1 ((unsigned long)ftrace_return_address(1))
  #define CALLER_ADDR2 ((unsigned long)ftrace_return_address(2))
  #define CALLER_ADDR3 ((unsigned long)ftrace_return_address(3))
  #define CALLER_ADDR4 ((unsigned long)ftrace_return_address(4))
  #define CALLER_ADDR5 ((unsigned long)ftrace_return_address(5))
  #define CALLER_ADDR6 ((unsigned long)ftrace_return_address(6))
352ad25aa   Steven Rostedt   ftrace: tracer fo...
588

81d68a96a   Steven Rostedt   ftrace: trace irq...
589
  #ifdef CONFIG_IRQSOFF_TRACER
489f13961   Ingo Molnar   ftrace: fix build...
590
591
    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...
592
  #else
4dbf6bc23   Steven Rostedt   tracing: Convert ...
593
594
    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...
595
  #endif
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
596
  #ifdef CONFIG_PREEMPT_TRACER
489f13961   Ingo Molnar   ftrace: fix build...
597
598
    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...
599
  #else
b02ee9a33   Minho Ban   tracing: Prevent ...
600
601
602
603
604
605
  /*
   * Use defines instead of static inlines because some arches will make code out
   * of the CALLER_ADDR, when we really want these to be a real nop.
   */
  # define trace_preempt_on(a0, a1) do { } while (0)
  # define trace_preempt_off(a0, a1) do { } while (0)
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
606
  #endif
68bf21aa1   Steven Rostedt   ftrace: mcount ca...
607
608
609
610
611
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  extern void ftrace_init(void);
  #else
  static inline void ftrace_init(void) { }
  #endif
71566a0d1   Frederic Weisbecker   tracing/fastboot:...
612
  /*
287b6e68c   Frederic Weisbecker   tracing/function-...
613
614
615
616
617
618
   * Structure that defines an entry function trace.
   */
  struct ftrace_graph_ent {
  	unsigned long func; /* Current function */
  	int depth;
  };
dd0e545f0   Steven Rostedt   ftrace: printk fo...
619

71566a0d1   Frederic Weisbecker   tracing/fastboot:...
620
  /*
caf4b323b   Frederic Weisbecker   tracing, x86: add...
621
622
   * Structure that defines a return function trace.
   */
fb52607af   Frederic Weisbecker   tracing/function-...
623
  struct ftrace_graph_ret {
caf4b323b   Frederic Weisbecker   tracing, x86: add...
624
625
626
  	unsigned long func; /* Current function */
  	unsigned long long calltime;
  	unsigned long long rettime;
0231022cc   Frederic Weisbecker   tracing/function-...
627
628
  	/* Number of functions that overran the depth limit for current task */
  	unsigned long overrun;
287b6e68c   Frederic Weisbecker   tracing/function-...
629
  	int depth;
caf4b323b   Frederic Weisbecker   tracing, x86: add...
630
  };
62b915f10   Jiri Olsa   tracing: Add grap...
631
632
633
  /* 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-...
634
  #ifdef CONFIG_FUNCTION_GRAPH_TRACER
8b96f0119   Frederic Weisbecker   tracing/function-...
635

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

8b96f0119   Frederic Weisbecker   tracing/function-...
639
  /*
712406a6b   Steven Rostedt   tracing/function-...
640
641
642
643
644
645
646
647
   * 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...
648
  	unsigned long long subtime;
71e308a23   Steven Rostedt   function-graph: a...
649
  	unsigned long fp;
712406a6b   Steven Rostedt   tracing/function-...
650
651
652
653
654
655
656
657
658
659
  };
  
  /*
   * 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...
660
661
  ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth,
  			 unsigned long frame_pointer);
712406a6b   Steven Rostedt   tracing/function-...
662
663
  
  /*
8b96f0119   Frederic Weisbecker   tracing/function-...
664
665
666
667
668
   * 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-...
669
670
671
672
673
674
675
676
677
  /*
   * 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[];
29ad23b00   Namhyung Kim   ftrace: Add set_g...
678
  #define FTRACE_NOTRACE_DEPTH 65536
f201ae235   Frederic Weisbecker   tracing/function-...
679
680
  #define FTRACE_RETFUNC_DEPTH 50
  #define FTRACE_RETSTACK_ALLOC_SIZE 32
287b6e68c   Frederic Weisbecker   tracing/function-...
681
682
  extern int register_ftrace_graph(trace_func_graph_ret_t retfunc,
  				trace_func_graph_ent_t entryfunc);
1b2f121c1   Steven Rostedt (Red Hat)   ftrace-graph: Rem...
683
  extern bool ftrace_graph_is_dead(void);
14a866c56   Steven Rostedt   ftrace: add ftrac...
684
  extern void ftrace_graph_stop(void);
287b6e68c   Frederic Weisbecker   tracing/function-...
685
686
687
  /* 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...
688

fb52607af   Frederic Weisbecker   tracing/function-...
689
  extern void unregister_ftrace_graph(void);
f201ae235   Frederic Weisbecker   tracing/function-...
690

fb52607af   Frederic Weisbecker   tracing/function-...
691
692
  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...
693
  extern void ftrace_graph_init_idle_task(struct task_struct *t, int cpu);
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
694
695
696
697
698
  
  static inline int task_curr_ret_stack(struct task_struct *t)
  {
  	return t->curr_ret_stack;
  }
380c4b141   Frederic Weisbecker   tracing/function-...
699
700
701
702
703
704
705
706
707
708
  
  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...
709
  #else /* !CONFIG_FUNCTION_GRAPH_TRACER */
8b96f0119   Frederic Weisbecker   tracing/function-...
710
711
  
  #define __notrace_funcgraph
bcbc4f20b   Frederic Weisbecker   tracing/function-...
712
  #define __irq_entry
5ac9f6226   Steven Rostedt   function-graph: a...
713
  #define INIT_FTRACE_GRAPH
8b96f0119   Frederic Weisbecker   tracing/function-...
714

fb52607af   Frederic Weisbecker   tracing/function-...
715
716
  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...
717
  static inline void ftrace_graph_init_idle_task(struct task_struct *t, int cpu) { }
21a8c466f   Frederic Weisbecker   tracing/ftrace: p...
718

62b915f10   Jiri Olsa   tracing: Add grap...
719
720
721
722
723
724
  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...
725
726
727
728
  static inline int task_curr_ret_stack(struct task_struct *tsk)
  {
  	return -1;
  }
380c4b141   Frederic Weisbecker   tracing/function-...
729
730
731
  
  static inline void pause_graph_tracing(void) { }
  static inline void unpause_graph_tracing(void) { }
5ac9f6226   Steven Rostedt   function-graph: a...
732
  #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
caf4b323b   Frederic Weisbecker   tracing, x86: add...
733

ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
734
  #ifdef CONFIG_TRACING
ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
  
  /* 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...
775
776
777
  enum ftrace_dump_mode;
  
  extern enum ftrace_dump_mode ftrace_dump_on_oops;
526211bc5   Ingo Molnar   tracing: move uti...
778

de7edd314   Steven Rostedt (Red Hat)   tracing: Disable ...
779
780
  extern void disable_trace_on_warning(void);
  extern int __disable_trace_on_warning;
261842b7c   Steven Rostedt   tracing: add same...
781
782
783
  #ifdef CONFIG_PREEMPT
  #define INIT_TRACE_RECURSION		.trace_recursion = 0,
  #endif
de7edd314   Steven Rostedt (Red Hat)   tracing: Disable ...
784
785
  #else /* CONFIG_TRACING */
  static inline void  disable_trace_on_warning(void) { }
ea4e2bc4d   Steven Rostedt   ftrace: graph of ...
786
  #endif /* CONFIG_TRACING */
261842b7c   Steven Rostedt   tracing: add same...
787
788
789
  #ifndef INIT_TRACE_RECURSION
  #define INIT_TRACE_RECURSION
  #endif
b1818748b   Markus Metzger   x86, ftrace, hw-b...
790

e7b8e675d   Mike Frysinger   tracing: Unify ar...
791
792
793
794
795
  #ifdef CONFIG_FTRACE_SYSCALLS
  
  unsigned long arch_syscall_addr(int nr);
  
  #endif /* CONFIG_FTRACE_SYSCALLS */
16444a8a4   Arnaldo Carvalho de Melo   ftrace: add basic...
796
  #endif /* _LINUX_FTRACE_H */