xref: /openbmc/linux/arch/s390/kernel/mcount.S (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
25d360a75SHeiko Carstens/*
3dfd9f7abSHeiko Carstens * Copyright IBM Corp. 2008, 2009
45d360a75SHeiko Carstens *
55d360a75SHeiko Carstens */
65d360a75SHeiko Carstens
7144d634aSJan Glauber#include <linux/linkage.h>
8cf087343SHeiko Carstens#include <asm/asm-offsets.h>
9aca91209SHeiko Carstens#include <asm/ftrace.h>
1023a4d7fdSMartin Schwidefsky#include <asm/nospec-insn.h>
1153255c9aSHeiko Carstens#include <asm/ptrace.h>
12dfd9f7abSHeiko Carstens
13e3123dfbSSven Schnelle#define STACK_FRAME_SIZE_PTREGS		(STACK_FRAME_OVERHEAD + __PT_SIZE)
1453255c9aSHeiko Carstens#define STACK_PTREGS			(STACK_FRAME_OVERHEAD)
1553255c9aSHeiko Carstens#define STACK_PTREGS_GPRS		(STACK_PTREGS + __PT_GPRS)
1653255c9aSHeiko Carstens#define STACK_PTREGS_PSW		(STACK_PTREGS + __PT_PSW)
17e3123dfbSSven Schnelle
18e3123dfbSSven Schnelle#define STACK_FRAME_SIZE_FREGS		(STACK_FRAME_OVERHEAD + __FTRACE_REGS_SIZE)
19e3123dfbSSven Schnelle#define STACK_FREGS			(STACK_FRAME_OVERHEAD)
20e3123dfbSSven Schnelle#define STACK_FREGS_PTREGS		(STACK_FRAME_OVERHEAD + __FTRACE_REGS_PT_REGS)
21e3123dfbSSven Schnelle#define STACK_FREGS_PTREGS_GPRS		(STACK_FREGS_PTREGS + __PT_GPRS)
22e3123dfbSSven Schnelle#define STACK_FREGS_PTREGS_PSW		(STACK_FREGS_PTREGS + __PT_PSW)
23e3123dfbSSven Schnelle#define STACK_FREGS_PTREGS_ORIG_GPR2	(STACK_FREGS_PTREGS + __PT_ORIG_GPR2)
24e3123dfbSSven Schnelle#define STACK_FREGS_PTREGS_FLAGS	(STACK_FREGS_PTREGS + __PT_FLAGS)
25e3123dfbSSven Schnelle
2642b01a55SVasily Gorbik/* packed stack: allocate just enough for r14, r15 and backchain */
2745f7a0daSVasily Gorbik#define TRACED_FUNC_FRAME_SIZE	24
2853255c9aSHeiko Carstens
2963bf38ffSTobias Huschle#ifdef CONFIG_FUNCTION_TRACER
3063bf38ffSTobias Huschle
3163bf38ffSTobias Huschle	GEN_BR_THUNK %r1
3263bf38ffSTobias Huschle	GEN_BR_THUNK %r14
3363bf38ffSTobias Huschle
3463bf38ffSTobias Huschle	.section .kprobes.text, "ax"
3563bf38ffSTobias Huschle
36aaaac068SHeiko CarstensSYM_FUNC_START(ftrace_stub)
3763bf38ffSTobias Huschle	BR_EX	%r14
38aaaac068SHeiko CarstensSYM_FUNC_END(ftrace_stub)
3963bf38ffSTobias Huschle
40fee86a4eSMark RutlandSYM_CODE_START(ftrace_stub_direct_tramp)
41fee86a4eSMark Rutland	lgr	%r1, %r0
42fee86a4eSMark Rutland	BR_EX	%r1
43fee86a4eSMark RutlandSYM_CODE_END(ftrace_stub_direct_tramp)
44fee86a4eSMark Rutland
4589497968SHeiko Carstens	.macro	ftrace_regs_entry, allregs=0
46b4adfe55SVasily Gorbik	stg	%r14,(__SF_GPRS+8*8)(%r15)	# save traced function caller
4789497968SHeiko Carstens
4889497968SHeiko Carstens	.if \allregs == 1
491a5e3f26SHeiko Carstens	# save psw mask
501a5e3f26SHeiko Carstens	# don't put any instructions clobbering CC before this point
511a5e3f26SHeiko Carstens	epsw	%r1,%r14
521a5e3f26SHeiko Carstens	risbg	%r14,%r1,0,31,32
5389497968SHeiko Carstens	.endif
5489497968SHeiko Carstens
5553255c9aSHeiko Carstens	lgr	%r1,%r15
5645f7a0daSVasily Gorbik	# allocate stack frame for ftrace_caller to contain traced function
5745f7a0daSVasily Gorbik	aghi	%r15,-TRACED_FUNC_FRAME_SIZE
5853255c9aSHeiko Carstens	stg	%r1,__SF_BACKCHAIN(%r15)
5945f7a0daSVasily Gorbik	stg	%r0,(__SF_GPRS+8*8)(%r15)
6045f7a0daSVasily Gorbik	stg	%r15,(__SF_GPRS+9*8)(%r15)
61e3123dfbSSven Schnelle	# allocate ftrace_regs and stack frame for ftrace_trace_function
62e3123dfbSSven Schnelle	aghi	%r15,-STACK_FRAME_SIZE_FREGS
63e3123dfbSSven Schnelle	stg	%r1,(STACK_FREGS_PTREGS_GPRS+15*8)(%r15)
64e3123dfbSSven Schnelle	xc	STACK_FREGS_PTREGS_ORIG_GPR2(8,%r15),STACK_FREGS_PTREGS_ORIG_GPR2(%r15)
6589497968SHeiko Carstens
6689497968SHeiko Carstens	.if \allregs == 1
67e3123dfbSSven Schnelle	stg	%r14,(STACK_FREGS_PTREGS_PSW)(%r15)
68e3123dfbSSven Schnelle	mvghi	STACK_FREGS_PTREGS_FLAGS(%r15),_PIF_FTRACE_FULL_REGS
691389f179SHeiko Carstens	.else
70e3123dfbSSven Schnelle	xc	STACK_FREGS_PTREGS_FLAGS(8,%r15),STACK_FREGS_PTREGS_FLAGS(%r15)
7189497968SHeiko Carstens	.endif
7289497968SHeiko Carstens
7389497968SHeiko Carstens	lg	%r14,(__SF_GPRS+8*8)(%r1)	# restore original return address
7445f7a0daSVasily Gorbik	aghi	%r1,-TRACED_FUNC_FRAME_SIZE
7545f7a0daSVasily Gorbik	stg	%r1,__SF_BACKCHAIN(%r15)
76e3123dfbSSven Schnelle	stg	%r0,(STACK_FREGS_PTREGS_PSW+8)(%r15)
77e3123dfbSSven Schnelle	stmg	%r2,%r14,(STACK_FREGS_PTREGS_GPRS+2*8)(%r15)
7889497968SHeiko Carstens	.endm
7989497968SHeiko Carstens
8089497968SHeiko CarstensSYM_CODE_START(ftrace_regs_caller)
8189497968SHeiko Carstens	ftrace_regs_entry	1
8289497968SHeiko Carstens	j	ftrace_common
8389497968SHeiko CarstensSYM_CODE_END(ftrace_regs_caller)
8489497968SHeiko Carstens
8589497968SHeiko CarstensSYM_CODE_START(ftrace_caller)
8689497968SHeiko Carstens	ftrace_regs_entry	0
8789497968SHeiko Carstens	j	ftrace_common
8889497968SHeiko CarstensSYM_CODE_END(ftrace_caller)
8989497968SHeiko Carstens
9089497968SHeiko CarstensSYM_CODE_START(ftrace_common)
9153255c9aSHeiko Carstens#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
9253255c9aSHeiko Carstens	aghik	%r2,%r0,-MCOUNT_INSN_SIZE
9353255c9aSHeiko Carstens	lgrl	%r4,function_trace_op
94f8c26027SVasily Gorbik	lgrl	%r1,ftrace_func
9553255c9aSHeiko Carstens#else
9653255c9aSHeiko Carstens	lgr	%r2,%r0
9753255c9aSHeiko Carstens	aghi	%r2,-MCOUNT_INSN_SIZE
9853255c9aSHeiko Carstens	larl	%r4,function_trace_op
9953255c9aSHeiko Carstens	lg	%r4,0(%r4)
100f8c26027SVasily Gorbik	larl	%r1,ftrace_func
10153255c9aSHeiko Carstens	lg	%r1,0(%r1)
10288dbd203SHeiko Carstens#endif
10353255c9aSHeiko Carstens	lgr	%r3,%r14
104e3123dfbSSven Schnelle	la	%r5,STACK_FREGS(%r15)
10523a4d7fdSMartin Schwidefsky	BASR_EX	%r14,%r1
10653255c9aSHeiko Carstens#ifdef CONFIG_FUNCTION_GRAPH_TRACER
10753255c9aSHeiko Carstens# The j instruction gets runtime patched to a nop instruction.
1080cccdda8SHeiko Carstens# See ftrace_enable_ftrace_graph_caller.
10989497968SHeiko CarstensSYM_INNER_LABEL(ftrace_graph_caller, SYM_L_GLOBAL)
11089497968SHeiko Carstens	j	.Lftrace_graph_caller_end
111e3123dfbSSven Schnelle	lmg	%r2,%r3,(STACK_FREGS_PTREGS_GPRS+14*8)(%r15)
112e3123dfbSSven Schnelle	lg	%r4,(STACK_FREGS_PTREGS_PSW+8)(%r15)
11353255c9aSHeiko Carstens	brasl	%r14,prepare_ftrace_return
114e3123dfbSSven Schnelle	stg	%r2,(STACK_FREGS_PTREGS_GPRS+14*8)(%r15)
11589497968SHeiko Carstens.Lftrace_graph_caller_end:
11653255c9aSHeiko Carstens#endif
117e3123dfbSSven Schnelle	lg	%r0,(STACK_FREGS_PTREGS_PSW+8)(%r15)
1182ab3a0a9SHeiko Carstens#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
119e3123dfbSSven Schnelle	ltg	%r1,STACK_FREGS_PTREGS_ORIG_GPR2(%r15)
1202ab3a0a9SHeiko Carstens	locgrz	%r1,%r0
1212ab3a0a9SHeiko Carstens#else
122e3123dfbSSven Schnelle	lg	%r1,STACK_FREGS_PTREGS_ORIG_GPR2(%r15)
1232ab3a0a9SHeiko Carstens	ltgr	%r1,%r1
1242ab3a0a9SHeiko Carstens	jnz	0f
1252ab3a0a9SHeiko Carstens	lgr	%r1,%r0
1262ab3a0a9SHeiko Carstens#endif
127e3123dfbSSven Schnelle0:	lmg	%r2,%r15,(STACK_FREGS_PTREGS_GPRS+2*8)(%r15)
12823a4d7fdSMartin Schwidefsky	BR_EX	%r1
12989497968SHeiko CarstensSYM_CODE_END(ftrace_common)
130dfd9f7abSHeiko Carstens
13188dbd203SHeiko Carstens#ifdef CONFIG_FUNCTION_GRAPH_TRACER
13288dbd203SHeiko Carstens
13389497968SHeiko CarstensSYM_FUNC_START(return_to_handler)
13453255c9aSHeiko Carstens	stmg	%r2,%r5,32(%r15)
13553255c9aSHeiko Carstens	lgr	%r1,%r15
1361256e70aSSven Schnelle	aghi	%r15,-(STACK_FRAME_OVERHEAD+__FGRAPH_RET_SIZE)
13753255c9aSHeiko Carstens	stg	%r1,__SF_BACKCHAIN(%r15)
138*7b27d9efSHeiko Carstens	la	%r3,STACK_FRAME_OVERHEAD(%r15)
1391256e70aSSven Schnelle	stg	%r1,__FGRAPH_RET_FP(%r3)
1401256e70aSSven Schnelle	stg	%r2,__FGRAPH_RET_GPR2(%r3)
1411256e70aSSven Schnelle	lgr	%r2,%r3
14253255c9aSHeiko Carstens	brasl	%r14,ftrace_return_to_handler
1431256e70aSSven Schnelle	aghi	%r15,STACK_FRAME_OVERHEAD+__FGRAPH_RET_SIZE
14453255c9aSHeiko Carstens	lgr	%r14,%r2
14553255c9aSHeiko Carstens	lmg	%r2,%r5,32(%r15)
14623a4d7fdSMartin Schwidefsky	BR_EX	%r14
14789497968SHeiko CarstensSYM_FUNC_END(return_to_handler)
14888dbd203SHeiko Carstens
1496ac2a4ddSMartin Schwidefsky#endif
15063bf38ffSTobias Huschle#endif /* CONFIG_FUNCTION_TRACER */
15163bf38ffSTobias Huschle
152dfa2a72cSHeiko CarstensSYM_CODE_START(ftrace_shared_hotpatch_trampoline_br)
153dfa2a72cSHeiko Carstens	lmg	%r0,%r1,2(%r1)
154dfa2a72cSHeiko Carstens	br	%r1
155dfa2a72cSHeiko CarstensSYM_INNER_LABEL(ftrace_shared_hotpatch_trampoline_br_end, SYM_L_GLOBAL)
156dfa2a72cSHeiko CarstensSYM_CODE_END(ftrace_shared_hotpatch_trampoline_br)
157dfa2a72cSHeiko Carstens
158dfa2a72cSHeiko Carstens#ifdef CONFIG_EXPOLINE
159dfa2a72cSHeiko CarstensSYM_CODE_START(ftrace_shared_hotpatch_trampoline_exrl)
160dfa2a72cSHeiko Carstens	lmg	%r0,%r1,2(%r1)
161dfa2a72cSHeiko Carstens	exrl	%r0,0f
162dfa2a72cSHeiko Carstens	j	.
163dfa2a72cSHeiko Carstens0:	br	%r1
164dfa2a72cSHeiko CarstensSYM_INNER_LABEL(ftrace_shared_hotpatch_trampoline_exrl_end, SYM_L_GLOBAL)
165dfa2a72cSHeiko CarstensSYM_CODE_END(ftrace_shared_hotpatch_trampoline_exrl)
166dfa2a72cSHeiko Carstens#endif /* CONFIG_EXPOLINE */
167dfa2a72cSHeiko Carstens
1681a280f48SVasily Gorbik#ifdef CONFIG_RETHOOK
16963bf38ffSTobias Huschle
170aaaac068SHeiko CarstensSYM_CODE_START(arch_rethook_trampoline)
17163bf38ffSTobias Huschle	stg	%r14,(__SF_GPRS+8*8)(%r15)
172e3123dfbSSven Schnelle	lay	%r15,-STACK_FRAME_SIZE_PTREGS(%r15)
17363bf38ffSTobias Huschle	stmg	%r0,%r14,STACK_PTREGS_GPRS(%r15)
17463bf38ffSTobias Huschle
17563bf38ffSTobias Huschle	# store original stack pointer in backchain and pt_regs
176e3123dfbSSven Schnelle	lay	%r7,STACK_FRAME_SIZE_PTREGS(%r15)
17763bf38ffSTobias Huschle	stg	%r7,__SF_BACKCHAIN(%r15)
17863bf38ffSTobias Huschle	stg	%r7,STACK_PTREGS_GPRS+(15*8)(%r15)
17963bf38ffSTobias Huschle
18063bf38ffSTobias Huschle	# store full psw
18163bf38ffSTobias Huschle	epsw	%r2,%r3
18263bf38ffSTobias Huschle	risbg	%r3,%r2,0,31,32
18363bf38ffSTobias Huschle	stg	%r3,STACK_PTREGS_PSW(%r15)
1841a280f48SVasily Gorbik	larl	%r1,arch_rethook_trampoline
18563bf38ffSTobias Huschle	stg	%r1,STACK_PTREGS_PSW+8(%r15)
18663bf38ffSTobias Huschle
18763bf38ffSTobias Huschle	lay	%r2,STACK_PTREGS(%r15)
1881a280f48SVasily Gorbik	brasl	%r14,arch_rethook_trampoline_callback
18963bf38ffSTobias Huschle
19063bf38ffSTobias Huschle	mvc	__SF_EMPTY(16,%r7),STACK_PTREGS_PSW(%r15)
19163bf38ffSTobias Huschle	lmg	%r0,%r15,STACK_PTREGS_GPRS(%r15)
19263bf38ffSTobias Huschle	lpswe	__SF_EMPTY(%r15)
193aaaac068SHeiko CarstensSYM_CODE_END(arch_rethook_trampoline)
19463bf38ffSTobias Huschle
1951a280f48SVasily Gorbik#endif /* CONFIG_RETHOOK */
196