1
2
3
4 #include <linux/linkage.h>
5 #include <asm/ftrace.h>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 .macro mcount_enter
26 subi sp, 24
27 stw a0, (sp, 0)
28 stw a1, (sp, 4)
29 stw a2, (sp, 8)
30 stw a3, (sp, 12)
31 stw lr, (sp, 16)
32 stw r8, (sp, 20)
33 .endm
34
35 .macro mcount_exit
36 ldw a0, (sp, 0)
37 ldw a1, (sp, 4)
38 ldw a2, (sp, 8)
39 ldw a3, (sp, 12)
40 ldw t1, (sp, 16)
41 ldw r8, (sp, 20)
42 ldw lr, (sp, 24)
43 addi sp, 28
44 jmp t1
45 .endm
46
47 .macro save_return_regs
48 subi sp, 16
49 stw a0, (sp, 0)
50 stw a1, (sp, 4)
51 stw a2, (sp, 8)
52 stw a3, (sp, 12)
53 .endm
54
55 .macro restore_return_regs
56 mov lr, a0
57 ldw a0, (sp, 0)
58 ldw a1, (sp, 4)
59 ldw a2, (sp, 8)
60 ldw a3, (sp, 12)
61 addi sp, 16
62 .endm
63
64 .macro nop32_stub
65 nop32
66 nop32
67 nop32
68 .endm
69
70 ENTRY(ftrace_stub)
71 jmp lr
72 END(ftrace_stub)
73
74 #ifndef CONFIG_DYNAMIC_FTRACE
75 ENTRY(_mcount)
76 mcount_enter
77
78
79 lrw r26, ftrace_trace_function
80 ldw r26, (r26, 0)
81 lrw a1, ftrace_stub
82 cmpne r26, a1
83 bf skip_ftrace
84
85 mov a0, lr
86 subi a0, 4
87 ldw a1, (sp, 24)
88
89 jsr r26
90
91 #ifndef CONFIG_FUNCTION_GRAPH_TRACER
92 skip_ftrace:
93 mcount_exit
94 #else
95 skip_ftrace:
96 lrw a0, ftrace_graph_return
97 ldw a0, (a0, 0)
98 lrw a1, ftrace_stub
99 cmpne a0, a1
100 bt ftrace_graph_caller
101
102 lrw a0, ftrace_graph_entry
103 ldw a0, (a0, 0)
104 lrw a1, ftrace_graph_entry_stub
105 cmpne a0, a1
106 bt ftrace_graph_caller
107
108 mcount_exit
109 #endif
110 END(_mcount)
111 #else
112 ENTRY(_mcount)
113 mov t1, lr
114 ldw lr, (sp, 0)
115 addi sp, 4
116 jmp t1
117 ENDPROC(_mcount)
118
119 ENTRY(ftrace_caller)
120 mcount_enter
121
122 ldw a0, (sp, 16)
123 subi a0, 4
124 ldw a1, (sp, 24)
125
126 nop
127 GLOBAL(ftrace_call)
128 nop32_stub
129
130 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
131 nop
132 GLOBAL(ftrace_graph_call)
133 nop32_stub
134 #endif
135
136 mcount_exit
137 ENDPROC(ftrace_caller)
138 #endif
139
140 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
141 ENTRY(ftrace_graph_caller)
142 mov a0, sp
143 addi a0, 24
144 ldw a1, (sp, 16)
145 subi a1, 4
146 mov a2, r8
147 lrw r26, prepare_ftrace_return
148 jsr r26
149 mcount_exit
150 END(ftrace_graph_caller)
151
152 ENTRY(return_to_handler)
153 save_return_regs
154 mov a0, r8
155 jsri ftrace_return_to_handler
156 restore_return_regs
157 jmp lr
158 END(return_to_handler)
159 #endif