Impact: add infrastructure for function-return tracing Add low level support for ftrace return tracing. This plug-in stores return addresses on the thread_info structure of the current task. The index of the current return address is initialized when the task is the first one (init) and when a process forks (the child). It is not needed when a task does a sys_execve because after this syscall, it still needs to return on the kernel functions it called. Note that the code of return_to_handler has been suggested by Steven Rostedt as almost all of the ideas of improvements in this V3. For purpose of security, arch/x86/kernel/process_32.c is not traced because __switch_to() changes the current task during its execution. That could cause inconsistency in the stored return address of this function even if I didn't have any crash after testing with tracing on this function enabled. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
#ifndef _ASM_X86_FTRACE_H
|
|
#define _ASM_X86_FTRACE_H
|
|
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
#define MCOUNT_ADDR ((long)(mcount))
|
|
#define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */
|
|
|
|
#ifndef __ASSEMBLY__
|
|
extern void mcount(void);
|
|
|
|
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
|
{
|
|
/*
|
|
* call mcount is "e8 <4 byte offset>"
|
|
* The addr points to the 4 byte offset and the caller of this
|
|
* function wants the pointer to e8. Simply subtract one.
|
|
*/
|
|
return addr - 1;
|
|
}
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* CONFIG_FUNCTION_TRACER */
|
|
|
|
#ifdef CONFIG_FUNCTION_RET_TRACER
|
|
#define FTRACE_RET_STACK_SIZE 20
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/*
|
|
* 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;
|
|
};
|
|
|
|
/*
|
|
* Primary handler of a function return.
|
|
* It relays on ftrace_return_to_handler.
|
|
* Defined in entry32.S
|
|
*/
|
|
extern void return_to_handler(void);
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* CONFIG_FUNCTION_RET_TRACER */
|
|
|
|
#endif /* _ASM_X86_FTRACE_H */
|