#ifndef _LINUX_FTRACE_H#define _LINUX_FTRACE_H#ifdef CONFIG_FTRACE#include <linux/linkage.h>#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))typedefvoid(*ftrace_func_t)(unsignedlongip,unsignedlongparent_ip);structftrace_ops{ftrace_func_tfunc;structftrace_ops*next;};/* * 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. */intregister_ftrace_function(structftrace_ops*ops);intunregister_ftrace_function(structftrace_ops*ops);voidclear_ftrace_function(void);externvoidftrace_stub(unsignedlonga0,unsignedlonga1);externvoidmcount(void);#else /* !CONFIG_FTRACE */# define register_ftrace_function(ops) do { } while (0)# define unregister_ftrace_function(ops) do { } while (0)# define clear_ftrace_function(ops) do { } while (0)#endif /* CONFIG_FTRACE */#endif /* _LINUX_FTRACE_H */