Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/ftrace: Have arch_ftrace_get_regs() return NULL unless FL_SAVE_REGS is set

When FL_SAVE_REGS is not set we get here via ftrace_caller()
which doesn't save all registers.

ftrace_caller() explicitely clears regs.msr, so we can rely
on it to know where we come from. We don't expect MSR register
to be 0 at all when involving ftrace.

Fixes: 40b035efe288 ("powerpc/ftrace: Implement CONFIG_DYNAMIC_FTRACE_WITH_ARGS")
Reported-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/2f9a7e898c93cc7438ef5ccd47cb9c3a9c5b53ef.1644949750.git.christophe.leroy@csgroup.eu

authored by

Christophe Leroy and committed by
Michael Ellerman
fc75f873 df45a557

+6 -1
+2 -1
arch/powerpc/include/asm/ftrace.h
··· 30 30 31 31 static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs) 32 32 { 33 - return &fregs->regs; 33 + /* We clear regs.msr in ftrace_call */ 34 + return fregs->regs.msr ? &fregs->regs : NULL; 34 35 } 35 36 36 37 static __always_inline void ftrace_instruction_pointer_set(struct ftrace_regs *fregs,
+4
arch/powerpc/kernel/trace/ftrace_mprofile.S
··· 205 205 PPC_STL r0, _LINK(r1) 206 206 mr r4, r0 207 207 208 + /* Clear MSR to flag as ftrace_caller versus frace_regs_caller */ 209 + li r8, 0 210 + PPC_STL r8, _MSR(r1) 211 + 208 212 /* Load &pt_regs in r6 for call below */ 209 213 addi r6, r1 ,STACK_FRAME_OVERHEAD 210 214