Loading...
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright IBM Corp. 2008, 2009
4 *
5 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
6 *
7 */
8
9#include <linux/linkage.h>
10#include <asm/asm-offsets.h>
11#include <asm/ftrace.h>
12#include <asm/nospec-insn.h>
13#include <asm/ptrace.h>
14#include <asm/export.h>
15
16 GEN_BR_THUNK %r1
17 GEN_BR_THUNK %r14
18
19 .section .kprobes.text, "ax"
20
21ENTRY(ftrace_stub)
22 BR_EX %r14
23
24#define STACK_FRAME_SIZE (STACK_FRAME_OVERHEAD + __PT_SIZE)
25#define STACK_PTREGS (STACK_FRAME_OVERHEAD)
26#define STACK_PTREGS_GPRS (STACK_PTREGS + __PT_GPRS)
27#define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW)
28
29ENTRY(_mcount)
30 BR_EX %r14
31
32EXPORT_SYMBOL(_mcount)
33
34ENTRY(ftrace_caller)
35 .globl ftrace_regs_caller
36 .set ftrace_regs_caller,ftrace_caller
37 lgr %r1,%r15
38#ifndef CC_USING_HOTPATCH
39 aghi %r0,MCOUNT_RETURN_FIXUP
40#endif
41 aghi %r15,-STACK_FRAME_SIZE
42 stg %r1,__SF_BACKCHAIN(%r15)
43 stg %r1,(STACK_PTREGS_GPRS+15*8)(%r15)
44 stg %r0,(STACK_PTREGS_PSW+8)(%r15)
45 stmg %r2,%r14,(STACK_PTREGS_GPRS+2*8)(%r15)
46#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
47 aghik %r2,%r0,-MCOUNT_INSN_SIZE
48 lgrl %r4,function_trace_op
49 lgrl %r1,ftrace_trace_function
50#else
51 lgr %r2,%r0
52 aghi %r2,-MCOUNT_INSN_SIZE
53 larl %r4,function_trace_op
54 lg %r4,0(%r4)
55 larl %r1,ftrace_trace_function
56 lg %r1,0(%r1)
57#endif
58 lgr %r3,%r14
59 la %r5,STACK_PTREGS(%r15)
60 BASR_EX %r14,%r1
61#ifdef CONFIG_FUNCTION_GRAPH_TRACER
62# The j instruction gets runtime patched to a nop instruction.
63# See ftrace_enable_ftrace_graph_caller.
64ENTRY(ftrace_graph_caller)
65 j ftrace_graph_caller_end
66 lg %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
67 lg %r3,(STACK_PTREGS_PSW+8)(%r15)
68 brasl %r14,prepare_ftrace_return
69 stg %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
70ftrace_graph_caller_end:
71 .globl ftrace_graph_caller_end
72#endif
73 lg %r1,(STACK_PTREGS_PSW+8)(%r15)
74 lmg %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15)
75 BR_EX %r1
76
77#ifdef CONFIG_FUNCTION_GRAPH_TRACER
78
79ENTRY(return_to_handler)
80 stmg %r2,%r5,32(%r15)
81 lgr %r1,%r15
82 aghi %r15,-STACK_FRAME_OVERHEAD
83 stg %r1,__SF_BACKCHAIN(%r15)
84 brasl %r14,ftrace_return_to_handler
85 aghi %r15,STACK_FRAME_OVERHEAD
86 lgr %r14,%r2
87 lmg %r2,%r5,32(%r15)
88 BR_EX %r14
89
90#endif
1/*
2 * Copyright IBM Corp. 2008,2009
3 *
4 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
5 *
6 */
7
8#include <linux/linkage.h>
9#include <asm/asm-offsets.h>
10
11 .section .kprobes.text, "ax"
12
13ENTRY(ftrace_stub)
14 br %r14
15
16ENTRY(_mcount)
17#ifdef CONFIG_DYNAMIC_FTRACE
18 br %r14
19
20ENTRY(ftrace_caller)
21#endif
22 stm %r2,%r5,16(%r15)
23 bras %r1,2f
240: .long ftrace_trace_function
251: .long function_trace_stop
262: l %r2,1b-0b(%r1)
27 icm %r2,0xf,0(%r2)
28 jnz 3f
29 st %r14,56(%r15)
30 lr %r0,%r15
31 ahi %r15,-96
32 l %r3,100(%r15)
33 la %r2,0(%r14)
34 st %r0,__SF_BACKCHAIN(%r15)
35 la %r3,0(%r3)
36 l %r14,0b-0b(%r1)
37 l %r14,0(%r14)
38 basr %r14,%r14
39#ifdef CONFIG_FUNCTION_GRAPH_TRACER
40 l %r2,100(%r15)
41 l %r3,152(%r15)
42ENTRY(ftrace_graph_caller)
43# The bras instruction gets runtime patched to call prepare_ftrace_return.
44# See ftrace_enable_ftrace_graph_caller. The patched instruction is:
45# bras %r14,prepare_ftrace_return
46 bras %r14,0f
470: st %r2,100(%r15)
48#endif
49 ahi %r15,96
50 l %r14,56(%r15)
513: lm %r2,%r5,16(%r15)
52 br %r14
53
54#ifdef CONFIG_FUNCTION_GRAPH_TRACER
55
56ENTRY(return_to_handler)
57 stm %r2,%r5,16(%r15)
58 st %r14,56(%r15)
59 lr %r0,%r15
60 ahi %r15,-96
61 st %r0,__SF_BACKCHAIN(%r15)
62 bras %r1,0f
63 .long ftrace_return_to_handler
640: l %r2,0b-0b(%r1)
65 basr %r14,%r2
66 lr %r14,%r2
67 ahi %r15,96
68 lm %r2,%r5,16(%r15)
69 br %r14
70
71#endif