On Sun, 31 Jan 2021 16:14:38 +0800Hi, Steve,
Jinyang He <hejinyang@xxxxxxxxxxx> wrote:
In the past, we have always used the address of _mcount as the address ofNote, while you are making these changes, you may want to look at the new
ftrace_caller. It reduces one ftrace_modify_code operation when do ftrace
on modules on 64Bit platform in this way. In order to provide
DYNAMIC_FTRACE_WITH_REGS, we have to take _mcount out of ftrace_caller and
add a new definition of _mcount. It is necessary to modify 2 instructions.
Also add the definition of ftrace_regs_caller. ftrace_regs_caller will
store and restore more registers. Of course, some functions in ftrace.c
also need to consider ftrace_regs_caller. Modify these functions and add
the related code of ftrace_regs_caller.
feature of ftrace that has HAVE_DYNAMIC_FTRACE_WITH_ARGS.
I noticed that with x86 (and probably all other archs), you need to save
the arguments before calling the ftrace callbacks in the ftrace trampoline.
If done properly, this means that the callbacks should be able to access
the function arguments. What happens then, it structures the arguments in a
way that if the function was called with "WITH_REGS" set, its the full
pt_regs structure. Otherwise, it's a partial structure called "ftrace_regs".
See arch/x86/include/asm/ftrace.h for ftrace_regs.
Then the ftrace_regs is passed to the callback instead of pt_regs (for all
callbacks!).
If a callback has the REGS flag set (ftrace_caller_regs), then to get the
pt_regs, it needs to call:
struct pt_regs *regs = arch_ftrace_get_regs(ftrace_regs);
Where arch_ftrace_get_regs() returns the full pt_regs if the callback was
called from a ftrace_caller_regs trampoline, otherwise it must return NULL.
The reason to return NULL is that we don't want callbacks using pt_regs,
thinking it's fully populated when it is not.
But if HAVE_DYNAMIC_FTRACE_ARGS is set, then all ftrace callbacks
(regardless of REGS flag being set) has access to the arguments from the
ftrace_regs.
-- Steve