aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/entry_64.S32
-rw-r--r--arch/x86/kernel/x8664_ksyms_64.c6
2 files changed, 32 insertions, 6 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index b7a81dcb7366..ed767b747fe5 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -68,10 +68,18 @@
68 .section .entry.text, "ax" 68 .section .entry.text, "ax"
69 69
70#ifdef CONFIG_FUNCTION_TRACER 70#ifdef CONFIG_FUNCTION_TRACER
71
72#ifdef CC_USING_FENTRY
73# define function_hook __fentry__
74#else
75# define function_hook mcount
76#endif
77
71#ifdef CONFIG_DYNAMIC_FTRACE 78#ifdef CONFIG_DYNAMIC_FTRACE
72ENTRY(mcount) 79
80ENTRY(function_hook)
73 retq 81 retq
74END(mcount) 82END(function_hook)
75 83
76/* skip is set if stack has been adjusted */ 84/* skip is set if stack has been adjusted */
77.macro ftrace_caller_setup skip=0 85.macro ftrace_caller_setup skip=0
@@ -84,7 +92,11 @@ END(mcount)
84 movq RIP(%rsp), %rdi 92 movq RIP(%rsp), %rdi
85 subq $MCOUNT_INSN_SIZE, %rdi 93 subq $MCOUNT_INSN_SIZE, %rdi
86 /* Load the parent_ip into the second parameter */ 94 /* Load the parent_ip into the second parameter */
95#ifdef CC_USING_FENTRY
96 movq SS+16(%rsp), %rsi
97#else
87 movq 8(%rbp), %rsi 98 movq 8(%rbp), %rsi
99#endif
88.endm 100.endm
89 101
90ENTRY(ftrace_caller) 102ENTRY(ftrace_caller)
@@ -177,7 +189,8 @@ END(ftrace_regs_caller)
177 189
178 190
179#else /* ! CONFIG_DYNAMIC_FTRACE */ 191#else /* ! CONFIG_DYNAMIC_FTRACE */
180ENTRY(mcount) 192
193ENTRY(function_hook)
181 cmpl $0, function_trace_stop 194 cmpl $0, function_trace_stop
182 jne ftrace_stub 195 jne ftrace_stub
183 196
@@ -199,7 +212,11 @@ trace:
199 MCOUNT_SAVE_FRAME 212 MCOUNT_SAVE_FRAME
200 213
201 movq RIP(%rsp), %rdi 214 movq RIP(%rsp), %rdi
215#ifdef CC_USING_FENTRY
216 movq SS+16(%rsp), %rsi
217#else
202 movq 8(%rbp), %rsi 218 movq 8(%rbp), %rsi
219#endif
203 subq $MCOUNT_INSN_SIZE, %rdi 220 subq $MCOUNT_INSN_SIZE, %rdi
204 221
205 call *ftrace_trace_function 222 call *ftrace_trace_function
@@ -207,7 +224,7 @@ trace:
207 MCOUNT_RESTORE_FRAME 224 MCOUNT_RESTORE_FRAME
208 225
209 jmp ftrace_stub 226 jmp ftrace_stub
210END(mcount) 227END(function_hook)
211#endif /* CONFIG_DYNAMIC_FTRACE */ 228#endif /* CONFIG_DYNAMIC_FTRACE */
212#endif /* CONFIG_FUNCTION_TRACER */ 229#endif /* CONFIG_FUNCTION_TRACER */
213 230
@@ -215,9 +232,14 @@ END(mcount)
215ENTRY(ftrace_graph_caller) 232ENTRY(ftrace_graph_caller)
216 MCOUNT_SAVE_FRAME 233 MCOUNT_SAVE_FRAME
217 234
235#ifdef CC_USING_FENTRY
236 leaq SS+16(%rsp), %rdi
237 movq $0, %rdx /* No framepointers needed */
238#else
218 leaq 8(%rbp), %rdi 239 leaq 8(%rbp), %rdi
219 movq RIP(%rsp), %rsi
220 movq (%rbp), %rdx 240 movq (%rbp), %rdx
241#endif
242 movq RIP(%rsp), %rsi
221 subq $MCOUNT_INSN_SIZE, %rsi 243 subq $MCOUNT_INSN_SIZE, %rsi
222 244
223 call prepare_ftrace_return 245 call prepare_ftrace_return
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c
index 6020f6f5927c..1330dd102950 100644
--- a/arch/x86/kernel/x8664_ksyms_64.c
+++ b/arch/x86/kernel/x8664_ksyms_64.c
@@ -13,9 +13,13 @@
13#include <asm/ftrace.h> 13#include <asm/ftrace.h>
14 14
15#ifdef CONFIG_FUNCTION_TRACER 15#ifdef CONFIG_FUNCTION_TRACER
16/* mcount is defined in assembly */ 16/* mcount and __fentry__ are defined in assembly */
17#ifdef CC_USING_FENTRY
18EXPORT_SYMBOL(__fentry__);
19#else
17EXPORT_SYMBOL(mcount); 20EXPORT_SYMBOL(mcount);
18#endif 21#endif
22#endif
19 23
20EXPORT_SYMBOL(__get_user_1); 24EXPORT_SYMBOL(__get_user_1);
21EXPORT_SYMBOL(__get_user_2); 25EXPORT_SYMBOL(__get_user_2);