1 #ifndef _ASM_S390_FTRACE_H 2 #define _ASM_S390_FTRACE_H 3 4 #define ARCH_SUPPORTS_FTRACE_OPS 1 5 6 #define MCOUNT_INSN_SIZE 24 7 #define MCOUNT_RETURN_FIXUP 18 8 9 #ifndef __ASSEMBLY__ 10 11 #define ftrace_return_address(n) __builtin_return_address(n) 12 13 void _mcount(void); 14 void ftrace_caller(void); 15 16 extern char ftrace_graph_caller_end; 17 extern unsigned long ftrace_plt; 18 19 struct dyn_arch_ftrace { }; 20 21 #define MCOUNT_ADDR ((unsigned long)_mcount) 22 #define FTRACE_ADDR ((unsigned long)ftrace_caller) 23 24 #define KPROBE_ON_FTRACE_NOP 0 25 #define KPROBE_ON_FTRACE_CALL 1 26 27 static inline unsigned long ftrace_call_adjust(unsigned long addr) 28 { 29 return addr; 30 } 31 32 struct ftrace_insn { 33 u16 opc; 34 s32 disp; 35 } __packed; 36 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 } 45 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; 60 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__ */ 69 #endif /* _ASM_S390_FTRACE_H */ 70