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