9d90b8bc66927a6b2c3a589e75f25dd0183dd978
[linux-2.6-microblaze.git] / arch / s390 / kernel / mcount.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright IBM Corp. 2008, 2009
4  *
5  */
6
7 #include <linux/linkage.h>
8 #include <asm/asm-offsets.h>
9 #include <asm/ftrace.h>
10 #include <asm/nospec-insn.h>
11 #include <asm/ptrace.h>
12 #include <asm/export.h>
13
14         GEN_BR_THUNK %r1
15         GEN_BR_THUNK %r14
16
17         .section .kprobes.text, "ax"
18
19 ENTRY(ftrace_stub)
20         BR_EX   %r14
21 ENDPROC(ftrace_stub)
22
23 #define STACK_FRAME_SIZE        (STACK_FRAME_OVERHEAD + __PT_SIZE)
24 #define STACK_PTREGS            (STACK_FRAME_OVERHEAD)
25 #define STACK_PTREGS_GPRS       (STACK_PTREGS + __PT_GPRS)
26 #define STACK_PTREGS_PSW        (STACK_PTREGS + __PT_PSW)
27 #define STACK_PTREGS_ORIG_GPR2  (STACK_PTREGS + __PT_ORIG_GPR2)
28 #define STACK_PTREGS_FLAGS      (STACK_PTREGS + __PT_FLAGS)
29 #ifdef __PACK_STACK
30 /* allocate just enough for r14, r15 and backchain */
31 #define TRACED_FUNC_FRAME_SIZE  24
32 #else
33 #define TRACED_FUNC_FRAME_SIZE  STACK_FRAME_OVERHEAD
34 #endif
35
36         .macro  ftrace_regs_entry, allregs=0
37         stg     %r14,(__SF_GPRS+8*8)(%r15)      # save traced function caller
38
39         .if \allregs == 1
40         lghi    %r14,0                          # save condition code
41         ipm     %r14                            # don't put any instructions
42         sllg    %r14,%r14,16                    # clobbering CC before this point
43         .endif
44
45         lgr     %r1,%r15
46         # allocate stack frame for ftrace_caller to contain traced function
47         aghi    %r15,-TRACED_FUNC_FRAME_SIZE
48         stg     %r1,__SF_BACKCHAIN(%r15)
49         stg     %r0,(__SF_GPRS+8*8)(%r15)
50         stg     %r15,(__SF_GPRS+9*8)(%r15)
51         # allocate pt_regs and stack frame for ftrace_trace_function
52         aghi    %r15,-STACK_FRAME_SIZE
53         stg     %r1,(STACK_PTREGS_GPRS+15*8)(%r15)
54         xc      STACK_PTREGS_ORIG_GPR2(8,%r15),STACK_PTREGS_ORIG_GPR2(%r15)
55
56         .if \allregs == 1
57         stg     %r14,(STACK_PTREGS_PSW)(%r15)
58         stosm   (STACK_PTREGS_PSW)(%r15),0
59 #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
60         mvghi   STACK_PTREGS_FLAGS(%r15),_PIF_FTRACE_FULL_REGS
61 #else
62         lghi    %r14,_PIF_FTRACE_FULL_REGS
63         stg     %r14,STACK_PTREGS_FLAGS(%r15)
64 #endif
65         .else
66         xc      STACK_PTREGS_FLAGS(8,%r15),STACK_PTREGS_FLAGS(%r15)
67         .endif
68
69         lg      %r14,(__SF_GPRS+8*8)(%r1)       # restore original return address
70         aghi    %r1,-TRACED_FUNC_FRAME_SIZE
71         stg     %r1,__SF_BACKCHAIN(%r15)
72         stg     %r0,(STACK_PTREGS_PSW+8)(%r15)
73         stmg    %r2,%r14,(STACK_PTREGS_GPRS+2*8)(%r15)
74         .endm
75
76 SYM_CODE_START(ftrace_regs_caller)
77         ftrace_regs_entry       1
78         j       ftrace_common
79 SYM_CODE_END(ftrace_regs_caller)
80
81 SYM_CODE_START(ftrace_caller)
82         ftrace_regs_entry       0
83         j       ftrace_common
84 SYM_CODE_END(ftrace_caller)
85
86 SYM_CODE_START(ftrace_common)
87 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
88         aghik   %r2,%r0,-MCOUNT_INSN_SIZE
89         lgrl    %r4,function_trace_op
90         lgrl    %r1,ftrace_func
91 #else
92         lgr     %r2,%r0
93         aghi    %r2,-MCOUNT_INSN_SIZE
94         larl    %r4,function_trace_op
95         lg      %r4,0(%r4)
96         larl    %r1,ftrace_func
97         lg      %r1,0(%r1)
98 #endif
99         lgr     %r3,%r14
100         la      %r5,STACK_PTREGS(%r15)
101         BASR_EX %r14,%r1
102 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
103 # The j instruction gets runtime patched to a nop instruction.
104 # See ftrace_enable_ftrace_graph_caller.
105 SYM_INNER_LABEL(ftrace_graph_caller, SYM_L_GLOBAL)
106         j       .Lftrace_graph_caller_end
107         lmg     %r2,%r3,(STACK_PTREGS_GPRS+14*8)(%r15)
108         lg      %r4,(STACK_PTREGS_PSW+8)(%r15)
109         brasl   %r14,prepare_ftrace_return
110         stg     %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
111 .Lftrace_graph_caller_end:
112 #endif
113         lg      %r0,(STACK_PTREGS_PSW+8)(%r15)
114 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
115         ltg     %r1,STACK_PTREGS_ORIG_GPR2(%r15)
116         locgrz  %r1,%r0
117 #else
118         lg      %r1,STACK_PTREGS_ORIG_GPR2(%r15)
119         ltgr    %r1,%r1
120         jnz     0f
121         lgr     %r1,%r0
122 #endif
123 0:      lmg     %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15)
124         BR_EX   %r1
125 SYM_CODE_END(ftrace_common)
126
127 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
128
129 SYM_FUNC_START(return_to_handler)
130         stmg    %r2,%r5,32(%r15)
131         lgr     %r1,%r15
132         aghi    %r15,-STACK_FRAME_OVERHEAD
133         stg     %r1,__SF_BACKCHAIN(%r15)
134         brasl   %r14,ftrace_return_to_handler
135         aghi    %r15,STACK_FRAME_OVERHEAD
136         lgr     %r14,%r2
137         lmg     %r2,%r5,32(%r15)
138         BR_EX   %r14
139 SYM_FUNC_END(return_to_handler)
140
141 #endif