]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
5d360a75 HC |
2 | #ifndef _ASM_S390_FTRACE_H |
3 | #define _ASM_S390_FTRACE_H | |
4 | ||
c933146a HC |
5 | #define ARCH_SUPPORTS_FTRACE_OPS 1 |
6 | ||
e6d60b36 HC |
7 | #ifdef CC_USING_HOTPATCH |
8 | #define MCOUNT_INSN_SIZE 6 | |
9 | #else | |
c933146a HC |
10 | #define MCOUNT_INSN_SIZE 24 |
11 | #define MCOUNT_RETURN_FIXUP 18 | |
e6d60b36 | 12 | #endif |
c933146a | 13 | |
5d360a75 | 14 | #ifndef __ASSEMBLY__ |
dfd9f7ab | 15 | |
dcddba96 | 16 | #define ftrace_return_address(n) __builtin_return_address(n) |
7eed2e09 | 17 | |
c933146a HC |
18 | void _mcount(void); |
19 | void ftrace_caller(void); | |
20 | ||
2481a87b | 21 | extern char ftrace_graph_caller_end; |
c933146a | 22 | extern unsigned long ftrace_plt; |
dfd9f7ab HC |
23 | |
24 | struct dyn_arch_ftrace { }; | |
25 | ||
c933146a HC |
26 | #define MCOUNT_ADDR ((unsigned long)_mcount) |
27 | #define FTRACE_ADDR ((unsigned long)ftrace_caller) | |
dfd9f7ab | 28 | |
c933146a HC |
29 | #define KPROBE_ON_FTRACE_NOP 0 |
30 | #define KPROBE_ON_FTRACE_CALL 1 | |
5d360a75 | 31 | |
dfd9f7ab HC |
32 | static inline unsigned long ftrace_call_adjust(unsigned long addr) |
33 | { | |
f2963886 | 34 | return addr; |
dfd9f7ab HC |
35 | } |
36 | ||
c933146a HC |
37 | struct ftrace_insn { |
38 | u16 opc; | |
39 | s32 disp; | |
40 | } __packed; | |
aca91209 | 41 | |
c933146a HC |
42 | static inline void ftrace_generate_nop_insn(struct ftrace_insn *insn) |
43 | { | |
44 | #ifdef CONFIG_FUNCTION_TRACER | |
e6d60b36 HC |
45 | #ifdef CC_USING_HOTPATCH |
46 | /* brcl 0,0 */ | |
47 | insn->opc = 0xc004; | |
48 | insn->disp = 0; | |
49 | #else | |
c933146a HC |
50 | /* jg .+24 */ |
51 | insn->opc = 0xc0f4; | |
52 | insn->disp = MCOUNT_INSN_SIZE / 2; | |
53 | #endif | |
e6d60b36 | 54 | #endif |
c933146a | 55 | } |
aca91209 | 56 | |
c933146a HC |
57 | static inline int is_ftrace_nop(struct ftrace_insn *insn) |
58 | { | |
59 | #ifdef CONFIG_FUNCTION_TRACER | |
e6d60b36 HC |
60 | #ifdef CC_USING_HOTPATCH |
61 | if (insn->disp == 0) | |
62 | return 1; | |
63 | #else | |
c933146a HC |
64 | if (insn->disp == MCOUNT_INSN_SIZE / 2) |
65 | return 1; | |
e6d60b36 | 66 | #endif |
c933146a HC |
67 | #endif |
68 | return 0; | |
69 | } | |
70 | ||
71 | static inline void ftrace_generate_call_insn(struct ftrace_insn *insn, | |
72 | unsigned long ip) | |
73 | { | |
74 | #ifdef CONFIG_FUNCTION_TRACER | |
75 | unsigned long target; | |
10dec7db | 76 | |
c933146a HC |
77 | /* brasl r0,ftrace_caller */ |
78 | target = is_module_addr((void *) ip) ? ftrace_plt : FTRACE_ADDR; | |
79 | insn->opc = 0xc005; | |
80 | insn->disp = (target - ip) / 2; | |
81 | #endif | |
82 | } | |
83 | ||
84 | #endif /* __ASSEMBLY__ */ | |
5d360a75 | 85 | #endif /* _ASM_S390_FTRACE_H */ |