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