7eed2e09ab
The common code ftrace_return_address(n), which is just a wrapper for __builtin_return_address(n), will only work for n > 0 if CONFIG_FRAME_POINTER is set to 'y'. Otherwise it will return 0. Since on s390 we will never have that config option set to 'y' ftrace_return_address() won't work at all for n > 0. Luckily we always compile the kernel with -mkernel-backchain which in turn means that __builtin_return_address(n) will always work. So let ftrace_return_address(n) map to __builtin_return_address(n). Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
70 lines
1.4 KiB
C
70 lines
1.4 KiB
C
#ifndef _ASM_S390_FTRACE_H
|
|
#define _ASM_S390_FTRACE_H
|
|
|
|
#define ARCH_SUPPORTS_FTRACE_OPS 1
|
|
|
|
#define MCOUNT_INSN_SIZE 24
|
|
#define MCOUNT_RETURN_FIXUP 18
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#define ftrace_return_address(n) __builtin_return_address(n)
|
|
|
|
void _mcount(void);
|
|
void ftrace_caller(void);
|
|
|
|
extern char ftrace_graph_caller_end;
|
|
extern unsigned long ftrace_plt;
|
|
|
|
struct dyn_arch_ftrace { };
|
|
|
|
#define MCOUNT_ADDR ((unsigned long)_mcount)
|
|
#define FTRACE_ADDR ((unsigned long)ftrace_caller)
|
|
|
|
#define KPROBE_ON_FTRACE_NOP 0
|
|
#define KPROBE_ON_FTRACE_CALL 1
|
|
|
|
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
|
{
|
|
return addr;
|
|
}
|
|
|
|
struct ftrace_insn {
|
|
u16 opc;
|
|
s32 disp;
|
|
} __packed;
|
|
|
|
static inline void ftrace_generate_nop_insn(struct ftrace_insn *insn)
|
|
{
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
/* jg .+24 */
|
|
insn->opc = 0xc0f4;
|
|
insn->disp = MCOUNT_INSN_SIZE / 2;
|
|
#endif
|
|
}
|
|
|
|
static inline int is_ftrace_nop(struct ftrace_insn *insn)
|
|
{
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
if (insn->disp == MCOUNT_INSN_SIZE / 2)
|
|
return 1;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
static inline void ftrace_generate_call_insn(struct ftrace_insn *insn,
|
|
unsigned long ip)
|
|
{
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
unsigned long target;
|
|
|
|
/* brasl r0,ftrace_caller */
|
|
target = is_module_addr((void *) ip) ? ftrace_plt : FTRACE_ADDR;
|
|
insn->opc = 0xc005;
|
|
insn->disp = (target - ip) / 2;
|
|
#endif
|
|
}
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* _ASM_S390_FTRACE_H */
|