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