Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
5d360a75 | 2 | /* |
a53c8fab | 3 | * Copyright IBM Corp. 2008, 2009 |
5d360a75 | 4 | * |
5d360a75 HC |
5 | */ |
6 | ||
144d634a | 7 | #include <linux/linkage.h> |
cf087343 | 8 | #include <asm/asm-offsets.h> |
aca91209 | 9 | #include <asm/ftrace.h> |
23a4d7fd | 10 | #include <asm/nospec-insn.h> |
53255c9a | 11 | #include <asm/ptrace.h> |
711f5df7 | 12 | #include <asm/export.h> |
cf087343 | 13 | |
dfd9f7ab | 14 | |
2ab3a0a9 HC |
15 | #define STACK_FRAME_SIZE (STACK_FRAME_OVERHEAD + __PT_SIZE) |
16 | #define STACK_PTREGS (STACK_FRAME_OVERHEAD) | |
17 | #define STACK_PTREGS_GPRS (STACK_PTREGS + __PT_GPRS) | |
18 | #define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW) | |
19 | #define STACK_PTREGS_ORIG_GPR2 (STACK_PTREGS + __PT_ORIG_GPR2) | |
1389f179 | 20 | #define STACK_PTREGS_FLAGS (STACK_PTREGS + __PT_FLAGS) |
42b01a55 | 21 | /* packed stack: allocate just enough for r14, r15 and backchain */ |
45f7a0da | 22 | #define TRACED_FUNC_FRAME_SIZE 24 |
53255c9a | 23 | |
63bf38ff TH |
24 | #ifdef CONFIG_FUNCTION_TRACER |
25 | ||
26 | GEN_BR_THUNK %r1 | |
27 | GEN_BR_THUNK %r14 | |
28 | ||
29 | .section .kprobes.text, "ax" | |
30 | ||
31 | ENTRY(ftrace_stub) | |
32 | BR_EX %r14 | |
33 | ENDPROC(ftrace_stub) | |
34 | ||
fee86a4e MR |
35 | SYM_CODE_START(ftrace_stub_direct_tramp) |
36 | lgr %r1, %r0 | |
37 | BR_EX %r1 | |
38 | SYM_CODE_END(ftrace_stub_direct_tramp) | |
39 | ||
89497968 | 40 | .macro ftrace_regs_entry, allregs=0 |
b4adfe55 | 41 | stg %r14,(__SF_GPRS+8*8)(%r15) # save traced function caller |
89497968 HC |
42 | |
43 | .if \allregs == 1 | |
1a5e3f26 HC |
44 | # save psw mask |
45 | # don't put any instructions clobbering CC before this point | |
1a5e3f26 HC |
46 | epsw %r1,%r14 |
47 | risbg %r14,%r1,0,31,32 | |
89497968 HC |
48 | .endif |
49 | ||
53255c9a | 50 | lgr %r1,%r15 |
45f7a0da VG |
51 | # allocate stack frame for ftrace_caller to contain traced function |
52 | aghi %r15,-TRACED_FUNC_FRAME_SIZE | |
53255c9a | 53 | stg %r1,__SF_BACKCHAIN(%r15) |
45f7a0da VG |
54 | stg %r0,(__SF_GPRS+8*8)(%r15) |
55 | stg %r15,(__SF_GPRS+9*8)(%r15) | |
56 | # allocate pt_regs and stack frame for ftrace_trace_function | |
57 | aghi %r15,-STACK_FRAME_SIZE | |
53255c9a | 58 | stg %r1,(STACK_PTREGS_GPRS+15*8)(%r15) |
2ab3a0a9 | 59 | xc STACK_PTREGS_ORIG_GPR2(8,%r15),STACK_PTREGS_ORIG_GPR2(%r15) |
89497968 HC |
60 | |
61 | .if \allregs == 1 | |
657480d9 | 62 | stg %r14,(STACK_PTREGS_PSW)(%r15) |
1389f179 | 63 | mvghi STACK_PTREGS_FLAGS(%r15),_PIF_FTRACE_FULL_REGS |
1389f179 HC |
64 | .else |
65 | xc STACK_PTREGS_FLAGS(8,%r15),STACK_PTREGS_FLAGS(%r15) | |
89497968 HC |
66 | .endif |
67 | ||
68 | lg %r14,(__SF_GPRS+8*8)(%r1) # restore original return address | |
45f7a0da VG |
69 | aghi %r1,-TRACED_FUNC_FRAME_SIZE |
70 | stg %r1,__SF_BACKCHAIN(%r15) | |
53255c9a HC |
71 | stg %r0,(STACK_PTREGS_PSW+8)(%r15) |
72 | stmg %r2,%r14,(STACK_PTREGS_GPRS+2*8)(%r15) | |
89497968 HC |
73 | .endm |
74 | ||
75 | SYM_CODE_START(ftrace_regs_caller) | |
76 | ftrace_regs_entry 1 | |
77 | j ftrace_common | |
78 | SYM_CODE_END(ftrace_regs_caller) | |
79 | ||
80 | SYM_CODE_START(ftrace_caller) | |
81 | ftrace_regs_entry 0 | |
82 | j ftrace_common | |
83 | SYM_CODE_END(ftrace_caller) | |
84 | ||
85 | SYM_CODE_START(ftrace_common) | |
53255c9a HC |
86 | #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES |
87 | aghik %r2,%r0,-MCOUNT_INSN_SIZE | |
88 | lgrl %r4,function_trace_op | |
f8c26027 | 89 | lgrl %r1,ftrace_func |
53255c9a HC |
90 | #else |
91 | lgr %r2,%r0 | |
92 | aghi %r2,-MCOUNT_INSN_SIZE | |
93 | larl %r4,function_trace_op | |
94 | lg %r4,0(%r4) | |
f8c26027 | 95 | larl %r1,ftrace_func |
53255c9a HC |
96 | lg %r1,0(%r1) |
97 | #endif | |
98 | lgr %r3,%r14 | |
99 | la %r5,STACK_PTREGS(%r15) | |
23a4d7fd | 100 | BASR_EX %r14,%r1 |
88dbd203 | 101 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
53255c9a | 102 | # The j instruction gets runtime patched to a nop instruction. |
0cccdda8 | 103 | # See ftrace_enable_ftrace_graph_caller. |
89497968 HC |
104 | SYM_INNER_LABEL(ftrace_graph_caller, SYM_L_GLOBAL) |
105 | j .Lftrace_graph_caller_end | |
ec7bf478 MS |
106 | lmg %r2,%r3,(STACK_PTREGS_GPRS+14*8)(%r15) |
107 | lg %r4,(STACK_PTREGS_PSW+8)(%r15) | |
53255c9a HC |
108 | brasl %r14,prepare_ftrace_return |
109 | stg %r2,(STACK_PTREGS_GPRS+14*8)(%r15) | |
89497968 | 110 | .Lftrace_graph_caller_end: |
88dbd203 | 111 | #endif |
2ab3a0a9 HC |
112 | lg %r0,(STACK_PTREGS_PSW+8)(%r15) |
113 | #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES | |
114 | ltg %r1,STACK_PTREGS_ORIG_GPR2(%r15) | |
115 | locgrz %r1,%r0 | |
116 | #else | |
117 | lg %r1,STACK_PTREGS_ORIG_GPR2(%r15) | |
118 | ltgr %r1,%r1 | |
119 | jnz 0f | |
120 | lgr %r1,%r0 | |
121 | #endif | |
122 | 0: lmg %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15) | |
23a4d7fd | 123 | BR_EX %r1 |
89497968 | 124 | SYM_CODE_END(ftrace_common) |
5d360a75 | 125 | |
88dbd203 HC |
126 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
127 | ||
89497968 | 128 | SYM_FUNC_START(return_to_handler) |
53255c9a HC |
129 | stmg %r2,%r5,32(%r15) |
130 | lgr %r1,%r15 | |
131 | aghi %r15,-STACK_FRAME_OVERHEAD | |
132 | stg %r1,__SF_BACKCHAIN(%r15) | |
133 | brasl %r14,ftrace_return_to_handler | |
134 | aghi %r15,STACK_FRAME_OVERHEAD | |
135 | lgr %r14,%r2 | |
136 | lmg %r2,%r5,32(%r15) | |
23a4d7fd | 137 | BR_EX %r14 |
89497968 | 138 | SYM_FUNC_END(return_to_handler) |
88dbd203 | 139 | |
6ac2a4dd | 140 | #endif |
63bf38ff TH |
141 | #endif /* CONFIG_FUNCTION_TRACER */ |
142 | ||
1a280f48 | 143 | #ifdef CONFIG_RETHOOK |
63bf38ff | 144 | |
1a280f48 | 145 | SYM_FUNC_START(arch_rethook_trampoline) |
63bf38ff TH |
146 | |
147 | stg %r14,(__SF_GPRS+8*8)(%r15) | |
148 | lay %r15,-STACK_FRAME_SIZE(%r15) | |
149 | stmg %r0,%r14,STACK_PTREGS_GPRS(%r15) | |
150 | ||
151 | # store original stack pointer in backchain and pt_regs | |
152 | lay %r7,STACK_FRAME_SIZE(%r15) | |
153 | stg %r7,__SF_BACKCHAIN(%r15) | |
154 | stg %r7,STACK_PTREGS_GPRS+(15*8)(%r15) | |
155 | ||
156 | # store full psw | |
157 | epsw %r2,%r3 | |
158 | risbg %r3,%r2,0,31,32 | |
159 | stg %r3,STACK_PTREGS_PSW(%r15) | |
1a280f48 | 160 | larl %r1,arch_rethook_trampoline |
63bf38ff TH |
161 | stg %r1,STACK_PTREGS_PSW+8(%r15) |
162 | ||
163 | lay %r2,STACK_PTREGS(%r15) | |
1a280f48 | 164 | brasl %r14,arch_rethook_trampoline_callback |
63bf38ff TH |
165 | |
166 | mvc __SF_EMPTY(16,%r7),STACK_PTREGS_PSW(%r15) | |
167 | lmg %r0,%r15,STACK_PTREGS_GPRS(%r15) | |
168 | lpswe __SF_EMPTY(%r15) | |
169 | ||
1a280f48 | 170 | SYM_FUNC_END(arch_rethook_trampoline) |
63bf38ff | 171 | |
1a280f48 | 172 | #endif /* CONFIG_RETHOOK */ |