Steven Rostedt wrote:
On Wed, 21 Mar 2018 16:13:22 +0530
"Naveen N. Rao" <naveen.n....@linux.vnet.ibm.com> wrote:
int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs)
{
mod->arch.toc = my_r2(sechdrs, mod);
- mod->arch.tramp = create_ftrace_stub(sechdrs, mod);
+ mod->arch.tramp = create_ftrace_stub(sechdrs, mod,
+ (unsigned long)ftrace_caller);
+#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+ mod->arch.tramp_regs = create_ftrace_stub(sechdrs, mod,
+ (unsigned long)ftrace_regs_caller);
So you only reference ftrace_regs_caller if you have
DYNAMIC_FTRACE_WITH_REGS defined?
Yes.
+ if (!mod->arch.tramp_regs)
+ return -ENOENT;
+#endif
if (!mod->arch.tramp)
return -ENOENT;
diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
index 8f2380304ef1..7b81db85f76e 100644
--- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
+++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
@@ -20,8 +20,8 @@
#ifdef CONFIG_DYNAMIC_FTRACE
/*
*
- * ftrace_caller() is the function that replaces _mcount() when ftrace is
- * active.
+ * ftrace_caller()/ftrace_regs_caller() is the function that replaces _mcount()
+ * when ftrace is active.
*
* We arrive here after a function A calls function B, and we are the trace
* function for B. When we enter r1 points to A's stack frame, B has not yet
@@ -37,7 +37,7 @@
* Our job is to save the register state into a struct pt_regs (on the stack)
* and then arrange for the ftrace function to be called.
*/
Perhaps you want to add:
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
here.
I think that will always be set here. ftrace_64_mprofile.S is only built
for -mprofile-kernel and we select HAVE_DYNAMIC_FTRACE_WITH_REGS if
MPROFILE_KERNEL is enabled. It looks like there is no way to unset just
CONFIG_DYNAMIC_FTRACE_WITH_REGS and so, for -mprofile-kernel, we can
assume it is always set?
- Naveen