aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/ftrace.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/ftrace.h')
-rw-r--r--include/linux/ftrace.h58
1 files changed, 28 insertions, 30 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index ae9504b4b67d..404a686a3644 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -62,9 +62,6 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,
62 * set in the flags member. 62 * set in the flags member.
63 * 63 *
64 * ENABLED - set/unset when ftrace_ops is registered/unregistered 64 * ENABLED - set/unset when ftrace_ops is registered/unregistered
65 * GLOBAL - set manualy by ftrace_ops user to denote the ftrace_ops
66 * is part of the global tracers sharing the same filter
67 * via set_ftrace_* debugfs files.
68 * DYNAMIC - set when ftrace_ops is registered to denote dynamically 65 * DYNAMIC - set when ftrace_ops is registered to denote dynamically
69 * allocated ftrace_ops which need special care 66 * allocated ftrace_ops which need special care
70 * CONTROL - set manualy by ftrace_ops user to denote the ftrace_ops 67 * CONTROL - set manualy by ftrace_ops user to denote the ftrace_ops
@@ -96,15 +93,14 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,
96 */ 93 */
97enum { 94enum {
98 FTRACE_OPS_FL_ENABLED = 1 << 0, 95 FTRACE_OPS_FL_ENABLED = 1 << 0,
99 FTRACE_OPS_FL_GLOBAL = 1 << 1, 96 FTRACE_OPS_FL_DYNAMIC = 1 << 1,
100 FTRACE_OPS_FL_DYNAMIC = 1 << 2, 97 FTRACE_OPS_FL_CONTROL = 1 << 2,
101 FTRACE_OPS_FL_CONTROL = 1 << 3, 98 FTRACE_OPS_FL_SAVE_REGS = 1 << 3,
102 FTRACE_OPS_FL_SAVE_REGS = 1 << 4, 99 FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 1 << 4,
103 FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 1 << 5, 100 FTRACE_OPS_FL_RECURSION_SAFE = 1 << 5,
104 FTRACE_OPS_FL_RECURSION_SAFE = 1 << 6, 101 FTRACE_OPS_FL_STUB = 1 << 6,
105 FTRACE_OPS_FL_STUB = 1 << 7, 102 FTRACE_OPS_FL_INITIALIZED = 1 << 7,
106 FTRACE_OPS_FL_INITIALIZED = 1 << 8, 103 FTRACE_OPS_FL_DELETED = 1 << 8,
107 FTRACE_OPS_FL_DELETED = 1 << 9,
108}; 104};
109 105
110/* 106/*
@@ -366,14 +362,12 @@ enum {
366 * IGNORE - The function is already what we want it to be 362 * IGNORE - The function is already what we want it to be
367 * MAKE_CALL - Start tracing the function 363 * MAKE_CALL - Start tracing the function
368 * MODIFY_CALL - Stop saving regs for the function 364 * MODIFY_CALL - Stop saving regs for the function
369 * MODIFY_CALL_REGS - Start saving regs for the function
370 * MAKE_NOP - Stop tracing the function 365 * MAKE_NOP - Stop tracing the function
371 */ 366 */
372enum { 367enum {
373 FTRACE_UPDATE_IGNORE, 368 FTRACE_UPDATE_IGNORE,
374 FTRACE_UPDATE_MAKE_CALL, 369 FTRACE_UPDATE_MAKE_CALL,
375 FTRACE_UPDATE_MODIFY_CALL, 370 FTRACE_UPDATE_MODIFY_CALL,
376 FTRACE_UPDATE_MODIFY_CALL_REGS,
377 FTRACE_UPDATE_MAKE_NOP, 371 FTRACE_UPDATE_MAKE_NOP,
378}; 372};
379 373
@@ -404,6 +398,8 @@ int ftrace_update_record(struct dyn_ftrace *rec, int enable);
404int ftrace_test_record(struct dyn_ftrace *rec, int enable); 398int ftrace_test_record(struct dyn_ftrace *rec, int enable);
405void ftrace_run_stop_machine(int command); 399void ftrace_run_stop_machine(int command);
406unsigned long ftrace_location(unsigned long ip); 400unsigned long ftrace_location(unsigned long ip);
401unsigned long ftrace_get_addr_new(struct dyn_ftrace *rec);
402unsigned long ftrace_get_addr_curr(struct dyn_ftrace *rec);
407 403
408extern ftrace_func_t ftrace_trace_function; 404extern ftrace_func_t ftrace_trace_function;
409 405
@@ -616,25 +612,27 @@ static inline void __ftrace_enabled_restore(int enabled)
616#endif 612#endif
617} 613}
618 614
619#ifndef HAVE_ARCH_CALLER_ADDR 615/* All archs should have this, but we define it for consistency */
616#ifndef ftrace_return_address0
617# define ftrace_return_address0 __builtin_return_address(0)
618#endif
619
620/* Archs may use other ways for ADDR1 and beyond */
621#ifndef ftrace_return_address
620# ifdef CONFIG_FRAME_POINTER 622# ifdef CONFIG_FRAME_POINTER
621# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) 623# define ftrace_return_address(n) __builtin_return_address(n)
622# define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1))
623# define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2))
624# define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3))
625# define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4))
626# define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5))
627# define CALLER_ADDR6 ((unsigned long)__builtin_return_address(6))
628# else 624# else
629# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) 625# define ftrace_return_address(n) 0UL
630# define CALLER_ADDR1 0UL
631# define CALLER_ADDR2 0UL
632# define CALLER_ADDR3 0UL
633# define CALLER_ADDR4 0UL
634# define CALLER_ADDR5 0UL
635# define CALLER_ADDR6 0UL
636# endif 626# endif
637#endif /* ifndef HAVE_ARCH_CALLER_ADDR */ 627#endif
628
629#define CALLER_ADDR0 ((unsigned long)ftrace_return_address0)
630#define CALLER_ADDR1 ((unsigned long)ftrace_return_address(1))
631#define CALLER_ADDR2 ((unsigned long)ftrace_return_address(2))
632#define CALLER_ADDR3 ((unsigned long)ftrace_return_address(3))
633#define CALLER_ADDR4 ((unsigned long)ftrace_return_address(4))
634#define CALLER_ADDR5 ((unsigned long)ftrace_return_address(5))
635#define CALLER_ADDR6 ((unsigned long)ftrace_return_address(6))
638 636
639#ifdef CONFIG_IRQSOFF_TRACER 637#ifdef CONFIG_IRQSOFF_TRACER
640 extern void time_hardirqs_on(unsigned long a0, unsigned long a1); 638 extern void time_hardirqs_on(unsigned long a0, unsigned long a1);