/* * Copyright IBM Corp. 2008, 2009 * * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, * */ #include <linux/linkage.h> #include <asm/asm-offsets.h> #include <asm/ftrace.h> .section .kprobes.text, "ax" ENTRY(ftrace_stub) br %r14 ENTRY(_mcount) #ifdef CONFIG_DYNAMIC_FTRACE br %r14 ENTRY(ftrace_caller) #endif stm %r2,%r5,16(%r15) bras %r1,2f 0: .long ftrace_trace_function 1: .long function_trace_stop 2: l %r2,1b-0b(%r1) icm %r2,0xf,0(%r2) jnz 3f st %r14,56(%r15) lr %r0,%r15 ahi %r15,-96 l %r3,100(%r15) la %r2,0(%r14) st %r0,__SF_BACKCHAIN(%r15) la %r3,0(%r3) ahi %r2,-MCOUNT_INSN_SIZE l %r14,0b-0b(%r1) l %r14,0(%r14) basr %r14,%r14 #ifdef CONFIG_FUNCTION_GRAPH_TRACER l %r2,100(%r15) l %r3,152(%r15) ENTRY(ftrace_graph_caller) # The bras instruction gets runtime patched to call prepare_ftrace_return. # See ftrace_enable_ftrace_graph_caller. The patched instruction is: # bras %r14,prepare_ftrace_return bras %r14,0f 0: st %r2,100(%r15) #endif ahi %r15,96 l %r14,56(%r15) 3: lm %r2,%r5,16(%r15) br %r14 #ifdef CONFIG_FUNCTION_GRAPH_TRACER ENTRY(return_to_handler) stm %r2,%r5,16(%r15) st %r14,56(%r15) lr %r0,%r15 ahi %r15,-96 st %r0,__SF_BACKCHAIN(%r15) bras %r1,0f .long ftrace_return_to_handler 0: l %r2,0b-0b(%r1) basr %r14,%r2 lr %r14,%r2 ahi %r15,96 lm %r2,%r5,16(%r15) br %r14 #endif