9 #include <linux/kernel.h>
10 #include <linux/sched.h>
13 #include <asm/cacheflush.h>
15 #ifdef CONFIG_DYNAMIC_FTRACE
17 static const unsigned char mnop[] = {
18 0x03, 0xc0, 0x00, 0x18,
19 0x03, 0xc0, 0x00, 0x18,
22 static void bfin_make_pcrel24(
unsigned char *
insn,
unsigned long src,
26 insn[0] = pcrel >> 16;
31 #define bfin_make_pcrel24(insn, src, dst) bfin_make_pcrel24(insn, src, (unsigned long)(dst))
33 static int ftrace_modify_code(
unsigned long ip,
const unsigned char *
code,
45 return ftrace_modify_code(rec->ip, mnop,
sizeof(mnop));
51 unsigned char call[8];
54 bfin_make_pcrel24(&call[2], rec->ip + 2, addr);
57 return ftrace_modify_code(rec->ip, call,
sizeof(call));
62 unsigned char call[4];
63 unsigned long ip = (
unsigned long)&ftrace_call;
64 bfin_make_pcrel24(call, ip, func);
65 return ftrace_modify_code(ip, call,
sizeof(call));
71 *(
unsigned long *)data = 0;
78 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
80 # ifdef CONFIG_DYNAMIC_FTRACE
82 extern void ftrace_graph_call(
void);
84 int ftrace_enable_ftrace_graph_caller(
void)
86 unsigned long ip = (
unsigned long)&ftrace_graph_call;
87 uint16_t jump_pcrel12 = ((
unsigned long)&ftrace_graph_caller - ip) >> 1;
88 jump_pcrel12 |= 0x2000;
89 return ftrace_modify_code(ip, (
void *)&jump_pcrel12,
sizeof(jump_pcrel12));
92 int ftrace_disable_ftrace_graph_caller(
void)
94 return ftrace_modify_code((
unsigned long)&ftrace_graph_call,
empty_zero_page, 2);
103 void prepare_ftrace_return(
unsigned long *parent,
unsigned long self_addr,
104 unsigned long frame_pointer)
113 frame_pointer) == -
EBUSY)
116 trace.func = self_addr;
119 if (!ftrace_graph_entry(&
trace)) {
125 *parent = return_hooker;