linux/arch/s390/include/asm/ftrace.h
<<
>>
Prefs
   1#ifndef _ASM_S390_FTRACE_H
   2#define _ASM_S390_FTRACE_H
   3
   4#define ARCH_SUPPORTS_FTRACE_OPS 1
   5
   6#ifdef CC_USING_HOTPATCH
   7#define MCOUNT_INSN_SIZE        6
   8#else
   9#define MCOUNT_INSN_SIZE        24
  10#define MCOUNT_RETURN_FIXUP     18
  11#endif
  12
  13#ifndef __ASSEMBLY__
  14
  15#define ftrace_return_address(n) __builtin_return_address(n)
  16
  17void _mcount(void);
  18void ftrace_caller(void);
  19
  20extern char ftrace_graph_caller_end;
  21extern unsigned long ftrace_plt;
  22
  23struct dyn_arch_ftrace { };
  24
  25#define MCOUNT_ADDR ((unsigned long)_mcount)
  26#define FTRACE_ADDR ((unsigned long)ftrace_caller)
  27
  28#define KPROBE_ON_FTRACE_NOP    0
  29#define KPROBE_ON_FTRACE_CALL   1
  30
  31static inline unsigned long ftrace_call_adjust(unsigned long addr)
  32{
  33        return addr;
  34}
  35
  36struct ftrace_insn {
  37        u16 opc;
  38        s32 disp;
  39} __packed;
  40
  41static inline void ftrace_generate_nop_insn(struct ftrace_insn *insn)
  42{
  43#ifdef CONFIG_FUNCTION_TRACER
  44#ifdef CC_USING_HOTPATCH
  45        /* brcl 0,0 */
  46        insn->opc = 0xc004;
  47        insn->disp = 0;
  48#else
  49        /* jg .+24 */
  50        insn->opc = 0xc0f4;
  51        insn->disp = MCOUNT_INSN_SIZE / 2;
  52#endif
  53#endif
  54}
  55
  56static inline int is_ftrace_nop(struct ftrace_insn *insn)
  57{
  58#ifdef CONFIG_FUNCTION_TRACER
  59#ifdef CC_USING_HOTPATCH
  60        if (insn->disp == 0)
  61                return 1;
  62#else
  63        if (insn->disp == MCOUNT_INSN_SIZE / 2)
  64                return 1;
  65#endif
  66#endif
  67        return 0;
  68}
  69
  70static inline void ftrace_generate_call_insn(struct ftrace_insn *insn,
  71                                             unsigned long ip)
  72{
  73#ifdef CONFIG_FUNCTION_TRACER
  74        unsigned long target;
  75
  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__ */
  84#endif /* _ASM_S390_FTRACE_H */
  85