diff options
Diffstat (limited to 'arch/s390/kernel/mcount.S')
| -rw-r--r-- | arch/s390/kernel/mcount.S | 87 |
1 files changed, 51 insertions, 36 deletions
diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S index 80641224a09..08dcf21cb8d 100644 --- a/arch/s390/kernel/mcount.S +++ b/arch/s390/kernel/mcount.S @@ -1,58 +1,73 @@ /* - * Copyright IBM Corp. 2008 + * 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> -#ifndef CONFIG_64BIT -.globl _mcount -_mcount: - stm %r0,%r5,8(%r15) + .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 %r1,%r15 + lr %r0,%r15 ahi %r15,-96 l %r3,100(%r15) la %r2,0(%r14) - st %r1,__SF_BACKCHAIN(%r15) + st %r0,__SF_BACKCHAIN(%r15) la %r3,0(%r3) - bras %r14,0f - .long ftrace_trace_function -0: l %r14,0(%r14) + 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 - lm %r0,%r5,8(%r15) l %r14,56(%r15) +3: lm %r2,%r5,16(%r15) br %r14 -.globl ftrace_stub -ftrace_stub: - br %r14 - -#else /* CONFIG_64BIT */ - -.globl _mcount -_mcount: - stmg %r0,%r5,16(%r15) - stg %r14,112(%r15) - lgr %r1,%r15 - aghi %r15,-160 - stg %r1,__SF_BACKCHAIN(%r15) - lgr %r2,%r14 - lg %r3,168(%r15) - larl %r14,ftrace_trace_function - lg %r14,0(%r14) - basr %r14,%r14 - aghi %r15,160 - lmg %r0,%r5,16(%r15) - lg %r14,112(%r15) - br %r14 +#ifdef CONFIG_FUNCTION_GRAPH_TRACER -.globl ftrace_stub -ftrace_stub: +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 /* CONFIG_64BIT */ +#endif |
