On Tue, 5 Sep 2023 22:36:33 +0900 Masami Hiramatsu (Google) <mhiramat@xxxxxxxxxx> wrote: > Yes, arch_rethook_trampoline() is good. It needs to save all registers. > > In this series, I'm trying to change the pt_regs with ftrace_regs which will > reduce trampoline overhead if DYNAMIC_FTRACE_WITH_ARGS=y. > > kprobe -> (pt_regs) -> rethook_try_hook() > fprobe -> (ftrace_regs) -> rethook_try_hook_ftrace() # new function > > Thus, we need to ensure that the ftrace_regs which is saved in the ftrace > *without* FTRACE_WITH_REGS flags, can be used for hooking the function > return. I saw; > > void arch_rethook_prepare(struct rethook_node *rh, struct pt_regs *regs, bool mcount) > { > rh->ret_addr = regs->gprs[14]; > rh->frame = regs->gprs[15]; > > /* Replace the return addr with trampoline addr */ > regs->gprs[14] = (unsigned long)&arch_rethook_trampoline; > } > > gprs[15] is a stack pointer, so it is saved in ftrace_regs too, but what about > gprs[14]? (I guess it is a link register) > We need to read the gprs[14] and ensure that is restored to gpr14 when the > ftrace is exit even without FTRACE_WITH_REGS flag. > > IOW, it is ftrace save regs/restore regs code issue. I need to check how the > function_graph implements it. I would argue that the link register should also be saved in ftrace_regs. The thing that ftrace_regs is not suppose to save is the general purpose registers. -- Steve