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

s390/ftrace: enable HAVE_FUNCTION_GRAPH_RETVAL

Add support for tracing return values in the function graph tracer.
This requires return_to_handler() to record gpr2 and the frame pointer

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>

authored by

Sven Schnelle and committed by
Heiko Carstens
1256e70a 3325b4d8

+31 -2
+1
arch/s390/Kconfig
··· 174 174 select HAVE_FTRACE_MCOUNT_RECORD 175 175 select HAVE_FUNCTION_ARG_ACCESS_API 176 176 select HAVE_FUNCTION_ERROR_INJECTION 177 + select HAVE_FUNCTION_GRAPH_RETVAL 177 178 select HAVE_FUNCTION_GRAPH_TRACER 178 179 select HAVE_FUNCTION_TRACER 179 180 select HAVE_GCC_PLUGINS
+17
arch/s390/include/asm/ftrace.h
··· 54 54 return NULL; 55 55 } 56 56 57 + #ifdef CONFIG_FUNCTION_GRAPH_TRACER 58 + struct fgraph_ret_regs { 59 + unsigned long gpr2; 60 + unsigned long fp; 61 + }; 62 + 63 + static __always_inline unsigned long fgraph_ret_regs_return_value(struct fgraph_ret_regs *ret_regs) 64 + { 65 + return ret_regs->gpr2; 66 + } 67 + 68 + static __always_inline unsigned long fgraph_ret_regs_frame_pointer(struct fgraph_ret_regs *ret_regs) 69 + { 70 + return ret_regs->fp; 71 + } 72 + #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ 73 + 57 74 static __always_inline unsigned long 58 75 ftrace_regs_get_instruction_pointer(const struct ftrace_regs *fregs) 59 76 {
+7
arch/s390/kernel/asm-offsets.c
··· 12 12 #include <linux/sched.h> 13 13 #include <linux/purgatory.h> 14 14 #include <linux/pgtable.h> 15 + #include <linux/ftrace.h> 15 16 #include <asm/idle.h> 16 17 #include <asm/gmap.h> 17 18 #include <asm/stacktrace.h> ··· 178 177 DEFINE(OLDMEM_SIZE, PARMAREA + offsetof(struct parmarea, oldmem_size)); 179 178 DEFINE(COMMAND_LINE, PARMAREA + offsetof(struct parmarea, command_line)); 180 179 DEFINE(MAX_COMMAND_LINE_SIZE, PARMAREA + offsetof(struct parmarea, max_command_line_size)); 180 + #ifdef CONFIG_FUNCTION_GRAPH_TRACER 181 + /* function graph return value tracing */ 182 + OFFSET(__FGRAPH_RET_GPR2, fgraph_ret_regs, gpr2); 183 + OFFSET(__FGRAPH_RET_FP, fgraph_ret_regs, fp); 184 + DEFINE(__FGRAPH_RET_SIZE, sizeof(struct fgraph_ret_regs)); 185 + #endif 181 186 return 0; 182 187 }
+6 -2
arch/s390/kernel/mcount.S
··· 128 128 SYM_FUNC_START(return_to_handler) 129 129 stmg %r2,%r5,32(%r15) 130 130 lgr %r1,%r15 131 - aghi %r15,-STACK_FRAME_OVERHEAD 131 + aghi %r15,-(STACK_FRAME_OVERHEAD+__FGRAPH_RET_SIZE) 132 132 stg %r1,__SF_BACKCHAIN(%r15) 133 + aghik %r3,%r15,STACK_FRAME_OVERHEAD 134 + stg %r1,__FGRAPH_RET_FP(%r3) 135 + stg %r2,__FGRAPH_RET_GPR2(%r3) 136 + lgr %r2,%r3 133 137 brasl %r14,ftrace_return_to_handler 134 - aghi %r15,STACK_FRAME_OVERHEAD 138 + aghi %r15,STACK_FRAME_OVERHEAD+__FGRAPH_RET_SIZE 135 139 lgr %r14,%r2 136 140 lmg %r2,%r5,32(%r15) 137 141 BR_EX %r14