* [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S
@ 2014-05-08 19:21 Steven Rostedt
2014-05-08 22:21 ` Thomas Gleixner
2014-05-12 7:38 ` Jiri Kosina
0 siblings, 2 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-05-08 19:21 UTC (permalink / raw)
To: LKML, x86
Cc: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Josh Poimboeuf,
Jiri Kosina
As the mcount code gets more complex, it really does not belong
in the entry.S file. By moving it into its own file "mcount.S"
keeps things a bit cleaner.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
Note:
With changes to the ftrace infrastructure to help with the current
influx of live patching facilities that we are seeing, I'm going to
have to make new changes to mcount trampolines. Currently they live in
entry*.S. They were only placed there for convenience, but not because
that was the proper place to place it. As other architectures have a
separate mcount.S file, I think it would be prudent to have x86 do the
same. Especially as the trampoline code may start to expand for the
live patching work. Currently, only x86_64 is converted, but there's no
reason that i386 can't have it as well.
Thoughts?
-- Steve
---
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/entry_64.S | 204 -----------------------------------------
arch/x86/kernel/mcount_64.S | 217 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 218 insertions(+), 204 deletions(-)
create mode 100644 arch/x86/kernel/mcount_64.S
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index f4d9600..db7f41d 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -26,6 +26,7 @@ obj-$(CONFIG_IRQ_WORK) += irq_work.o
obj-y += probe_roms.o
obj-$(CONFIG_X86_32) += i386_ksyms_32.o
obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o
+obj-$(CONFIG_X86_64) += mcount_64.o
obj-y += syscall_$(BITS).o vsyscall_gtod.o
obj-$(CONFIG_X86_64) += vsyscall_64.o
obj-$(CONFIG_X86_64) += vsyscall_emu_64.o
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 1e96c36..3db806d 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -53,7 +53,6 @@
#include <asm/page_types.h>
#include <asm/irqflags.h>
#include <asm/paravirt.h>
-#include <asm/ftrace.h>
#include <asm/percpu.h>
#include <asm/asm.h>
#include <asm/context_tracking.h>
@@ -69,209 +68,6 @@
.code64
.section .entry.text, "ax"
-#ifdef CONFIG_FUNCTION_TRACER
-
-#ifdef CC_USING_FENTRY
-# define function_hook __fentry__
-#else
-# define function_hook mcount
-#endif
-
-#ifdef CONFIG_DYNAMIC_FTRACE
-
-ENTRY(function_hook)
- retq
-END(function_hook)
-
-/* skip is set if stack has been adjusted */
-.macro ftrace_caller_setup skip=0
- MCOUNT_SAVE_FRAME \skip
-
- /* Load the ftrace_ops into the 3rd parameter */
- movq function_trace_op(%rip), %rdx
-
- /* Load ip into the first parameter */
- movq RIP(%rsp), %rdi
- subq $MCOUNT_INSN_SIZE, %rdi
- /* Load the parent_ip into the second parameter */
-#ifdef CC_USING_FENTRY
- movq SS+16(%rsp), %rsi
-#else
- movq 8(%rbp), %rsi
-#endif
-.endm
-
-ENTRY(ftrace_caller)
- /* Check if tracing was disabled (quick check) */
- cmpl $0, function_trace_stop
- jne ftrace_stub
-
- ftrace_caller_setup
- /* regs go into 4th parameter (but make it NULL) */
- movq $0, %rcx
-
-GLOBAL(ftrace_call)
- call ftrace_stub
-
- MCOUNT_RESTORE_FRAME
-ftrace_return:
-
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-GLOBAL(ftrace_graph_call)
- jmp ftrace_stub
-#endif
-
-GLOBAL(ftrace_stub)
- retq
-END(ftrace_caller)
-
-ENTRY(ftrace_regs_caller)
- /* Save the current flags before compare (in SS location)*/
- pushfq
-
- /* Check if tracing was disabled (quick check) */
- cmpl $0, function_trace_stop
- jne ftrace_restore_flags
-
- /* skip=8 to skip flags saved in SS */
- ftrace_caller_setup 8
-
- /* Save the rest of pt_regs */
- movq %r15, R15(%rsp)
- movq %r14, R14(%rsp)
- movq %r13, R13(%rsp)
- movq %r12, R12(%rsp)
- movq %r11, R11(%rsp)
- movq %r10, R10(%rsp)
- movq %rbp, RBP(%rsp)
- movq %rbx, RBX(%rsp)
- /* Copy saved flags */
- movq SS(%rsp), %rcx
- movq %rcx, EFLAGS(%rsp)
- /* Kernel segments */
- movq $__KERNEL_DS, %rcx
- movq %rcx, SS(%rsp)
- movq $__KERNEL_CS, %rcx
- movq %rcx, CS(%rsp)
- /* Stack - skipping return address */
- leaq SS+16(%rsp), %rcx
- movq %rcx, RSP(%rsp)
-
- /* regs go into 4th parameter */
- leaq (%rsp), %rcx
-
-GLOBAL(ftrace_regs_call)
- call ftrace_stub
-
- /* Copy flags back to SS, to restore them */
- movq EFLAGS(%rsp), %rax
- movq %rax, SS(%rsp)
-
- /* Handlers can change the RIP */
- movq RIP(%rsp), %rax
- movq %rax, SS+8(%rsp)
-
- /* restore the rest of pt_regs */
- movq R15(%rsp), %r15
- movq R14(%rsp), %r14
- movq R13(%rsp), %r13
- movq R12(%rsp), %r12
- movq R10(%rsp), %r10
- movq RBP(%rsp), %rbp
- movq RBX(%rsp), %rbx
-
- /* skip=8 to skip flags saved in SS */
- MCOUNT_RESTORE_FRAME 8
-
- /* Restore flags */
- popfq
-
- jmp ftrace_return
-ftrace_restore_flags:
- popfq
- jmp ftrace_stub
-
-END(ftrace_regs_caller)
-
-
-#else /* ! CONFIG_DYNAMIC_FTRACE */
-
-ENTRY(function_hook)
- cmpl $0, function_trace_stop
- jne ftrace_stub
-
- cmpq $ftrace_stub, ftrace_trace_function
- jnz trace
-
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
- cmpq $ftrace_stub, ftrace_graph_return
- jnz ftrace_graph_caller
-
- cmpq $ftrace_graph_entry_stub, ftrace_graph_entry
- jnz ftrace_graph_caller
-#endif
-
-GLOBAL(ftrace_stub)
- retq
-
-trace:
- MCOUNT_SAVE_FRAME
-
- movq RIP(%rsp), %rdi
-#ifdef CC_USING_FENTRY
- movq SS+16(%rsp), %rsi
-#else
- movq 8(%rbp), %rsi
-#endif
- subq $MCOUNT_INSN_SIZE, %rdi
-
- call *ftrace_trace_function
-
- MCOUNT_RESTORE_FRAME
-
- jmp ftrace_stub
-END(function_hook)
-#endif /* CONFIG_DYNAMIC_FTRACE */
-#endif /* CONFIG_FUNCTION_TRACER */
-
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-ENTRY(ftrace_graph_caller)
- MCOUNT_SAVE_FRAME
-
-#ifdef CC_USING_FENTRY
- leaq SS+16(%rsp), %rdi
- movq $0, %rdx /* No framepointers needed */
-#else
- leaq 8(%rbp), %rdi
- movq (%rbp), %rdx
-#endif
- movq RIP(%rsp), %rsi
- subq $MCOUNT_INSN_SIZE, %rsi
-
- call prepare_ftrace_return
-
- MCOUNT_RESTORE_FRAME
-
- retq
-END(ftrace_graph_caller)
-
-GLOBAL(return_to_handler)
- subq $24, %rsp
-
- /* Save the return values */
- movq %rax, (%rsp)
- movq %rdx, 8(%rsp)
- movq %rbp, %rdi
-
- call ftrace_return_to_handler
-
- movq %rax, %rdi
- movq 8(%rsp), %rdx
- movq (%rsp), %rax
- addq $24, %rsp
- jmp *%rdi
-#endif
-
#ifndef CONFIG_PREEMPT
#define retint_kernel retint_restore_args
diff --git a/arch/x86/kernel/mcount_64.S b/arch/x86/kernel/mcount_64.S
new file mode 100644
index 0000000..c050a01
--- /dev/null
+++ b/arch/x86/kernel/mcount_64.S
@@ -0,0 +1,217 @@
+/*
+ * linux/arch/x86_64/mcount_64.S
+ *
+ * Copyright (C) 2014 Steven Rostedt, Red Hat Inc
+ */
+
+#include <linux/linkage.h>
+#include <asm/ptrace.h>
+#include <asm/ftrace.h>
+
+
+ .code64
+ .section .entry.text, "ax"
+
+
+#ifdef CONFIG_FUNCTION_TRACER
+
+#ifdef CC_USING_FENTRY
+# define function_hook __fentry__
+#else
+# define function_hook mcount
+#endif
+
+#ifdef CONFIG_DYNAMIC_FTRACE
+
+ENTRY(function_hook)
+ retq
+END(function_hook)
+
+/* skip is set if stack has been adjusted */
+.macro ftrace_caller_setup skip=0
+ MCOUNT_SAVE_FRAME \skip
+
+ /* Load the ftrace_ops into the 3rd parameter */
+ movq function_trace_op(%rip), %rdx
+
+ /* Load ip into the first parameter */
+ movq RIP(%rsp), %rdi
+ subq $MCOUNT_INSN_SIZE, %rdi
+ /* Load the parent_ip into the second parameter */
+#ifdef CC_USING_FENTRY
+ movq SS+16(%rsp), %rsi
+#else
+ movq 8(%rbp), %rsi
+#endif
+.endm
+
+ENTRY(ftrace_caller)
+ /* Check if tracing was disabled (quick check) */
+ cmpl $0, function_trace_stop
+ jne ftrace_stub
+
+ ftrace_caller_setup
+ /* regs go into 4th parameter (but make it NULL) */
+ movq $0, %rcx
+
+GLOBAL(ftrace_call)
+ call ftrace_stub
+
+ MCOUNT_RESTORE_FRAME
+ftrace_return:
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+GLOBAL(ftrace_graph_call)
+ jmp ftrace_stub
+#endif
+
+GLOBAL(ftrace_stub)
+ retq
+END(ftrace_caller)
+
+ENTRY(ftrace_regs_caller)
+ /* Save the current flags before compare (in SS location)*/
+ pushfq
+
+ /* Check if tracing was disabled (quick check) */
+ cmpl $0, function_trace_stop
+ jne ftrace_restore_flags
+
+ /* skip=8 to skip flags saved in SS */
+ ftrace_caller_setup 8
+
+ /* Save the rest of pt_regs */
+ movq %r15, R15(%rsp)
+ movq %r14, R14(%rsp)
+ movq %r13, R13(%rsp)
+ movq %r12, R12(%rsp)
+ movq %r11, R11(%rsp)
+ movq %r10, R10(%rsp)
+ movq %rbp, RBP(%rsp)
+ movq %rbx, RBX(%rsp)
+ /* Copy saved flags */
+ movq SS(%rsp), %rcx
+ movq %rcx, EFLAGS(%rsp)
+ /* Kernel segments */
+ movq $__KERNEL_DS, %rcx
+ movq %rcx, SS(%rsp)
+ movq $__KERNEL_CS, %rcx
+ movq %rcx, CS(%rsp)
+ /* Stack - skipping return address */
+ leaq SS+16(%rsp), %rcx
+ movq %rcx, RSP(%rsp)
+
+ /* regs go into 4th parameter */
+ leaq (%rsp), %rcx
+
+GLOBAL(ftrace_regs_call)
+ call ftrace_stub
+
+ /* Copy flags back to SS, to restore them */
+ movq EFLAGS(%rsp), %rax
+ movq %rax, SS(%rsp)
+
+ /* Handlers can change the RIP */
+ movq RIP(%rsp), %rax
+ movq %rax, SS+8(%rsp)
+
+ /* restore the rest of pt_regs */
+ movq R15(%rsp), %r15
+ movq R14(%rsp), %r14
+ movq R13(%rsp), %r13
+ movq R12(%rsp), %r12
+ movq R10(%rsp), %r10
+ movq RBP(%rsp), %rbp
+ movq RBX(%rsp), %rbx
+
+ /* skip=8 to skip flags saved in SS */
+ MCOUNT_RESTORE_FRAME 8
+
+ /* Restore flags */
+ popfq
+
+ jmp ftrace_return
+ftrace_restore_flags:
+ popfq
+ jmp ftrace_stub
+
+END(ftrace_regs_caller)
+
+
+#else /* ! CONFIG_DYNAMIC_FTRACE */
+
+ENTRY(function_hook)
+ cmpl $0, function_trace_stop
+ jne ftrace_stub
+
+ cmpq $ftrace_stub, ftrace_trace_function
+ jnz trace
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ cmpq $ftrace_stub, ftrace_graph_return
+ jnz ftrace_graph_caller
+
+ cmpq $ftrace_graph_entry_stub, ftrace_graph_entry
+ jnz ftrace_graph_caller
+#endif
+
+GLOBAL(ftrace_stub)
+ retq
+
+trace:
+ MCOUNT_SAVE_FRAME
+
+ movq RIP(%rsp), %rdi
+#ifdef CC_USING_FENTRY
+ movq SS+16(%rsp), %rsi
+#else
+ movq 8(%rbp), %rsi
+#endif
+ subq $MCOUNT_INSN_SIZE, %rdi
+
+ call *ftrace_trace_function
+
+ MCOUNT_RESTORE_FRAME
+
+ jmp ftrace_stub
+END(function_hook)
+#endif /* CONFIG_DYNAMIC_FTRACE */
+#endif /* CONFIG_FUNCTION_TRACER */
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ENTRY(ftrace_graph_caller)
+ MCOUNT_SAVE_FRAME
+
+#ifdef CC_USING_FENTRY
+ leaq SS+16(%rsp), %rdi
+ movq $0, %rdx /* No framepointers needed */
+#else
+ leaq 8(%rbp), %rdi
+ movq (%rbp), %rdx
+#endif
+ movq RIP(%rsp), %rsi
+ subq $MCOUNT_INSN_SIZE, %rsi
+
+ call prepare_ftrace_return
+
+ MCOUNT_RESTORE_FRAME
+
+ retq
+END(ftrace_graph_caller)
+
+GLOBAL(return_to_handler)
+ subq $24, %rsp
+
+ /* Save the return values */
+ movq %rax, (%rsp)
+ movq %rdx, 8(%rsp)
+ movq %rbp, %rdi
+
+ call ftrace_return_to_handler
+
+ movq %rax, %rdi
+ movq 8(%rsp), %rdx
+ movq (%rsp), %rax
+ addq $24, %rsp
+ jmp *%rdi
+#endif
--
1.8.1.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S
2014-05-08 19:21 [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S Steven Rostedt
@ 2014-05-08 22:21 ` Thomas Gleixner
2014-05-08 22:37 ` Steven Rostedt
2014-05-12 7:38 ` Jiri Kosina
1 sibling, 1 reply; 5+ messages in thread
From: Thomas Gleixner @ 2014-05-08 22:21 UTC (permalink / raw)
To: Steven Rostedt
Cc: LKML, x86, H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Jiri Kosina
On Thu, 8 May 2014, Steven Rostedt wrote:
>
> As the mcount code gets more complex, it really does not belong
> in the entry.S file. By moving it into its own file "mcount.S"
> keeps things a bit cleaner.
>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> ---
>
> Note:
> With changes to the ftrace infrastructure to help with the current
> influx of live patching facilities that we are seeing, I'm going to
> have to make new changes to mcount trampolines. Currently they live in
> entry*.S. They were only placed there for convenience, but not because
> that was the proper place to place it. As other architectures have a
> separate mcount.S file, I think it would be prudent to have x86 do the
> same. Especially as the trampoline code may start to expand for the
> live patching work. Currently, only x86_64 is converted, but there's no
> reason that i386 can't have it as well.
>
> Thoughts?
I'm fine with the code move per se. That's a good thing.
The live patcher argumentation for it is more than questionable.
Thanks,
tglx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S
2014-05-08 22:21 ` Thomas Gleixner
@ 2014-05-08 22:37 ` Steven Rostedt
2014-05-08 22:40 ` Thomas Gleixner
0 siblings, 1 reply; 5+ messages in thread
From: Steven Rostedt @ 2014-05-08 22:37 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Jiri Kosina
On Fri, 9 May 2014 00:21:37 +0200 (CEST)
Thomas Gleixner <tglx@linutronix.de> wrote:
> On Thu, 8 May 2014, Steven Rostedt wrote:
>
> I'm fine with the code move per se. That's a good thing.
Great, then I'll add this to my 3.16 queue.
Can I get your Acked-by for it?
>
> The live patcher argumentation for it is more than questionable.
Well, that was the final motivator. But I've been wanting to optimize
the function tracing a bit since it's been getting more and more users.
Namely, kprobes and perf. As such, I've been thinking about creating
custom trampolines (like what kprobes does today) where if there's two
or more users of ftrace, but they are using different functions, they
don't need to go through a loop, but instead have their own trampoline
that calls their function directly and is called by the functions they
trace.
Right now I'm working on getting the function graph tracer trampoline
(which is static) called directly if function graph is enabled.
Currently, we save regs for function tracing, restore them, and then
call function graph tracing. This is a big waste when function graph is
running by itself.
-- Steve
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S
2014-05-08 22:37 ` Steven Rostedt
@ 2014-05-08 22:40 ` Thomas Gleixner
0 siblings, 0 replies; 5+ messages in thread
From: Thomas Gleixner @ 2014-05-08 22:40 UTC (permalink / raw)
To: Steven Rostedt
Cc: LKML, x86, H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Jiri Kosina
On Thu, 8 May 2014, Steven Rostedt wrote:
> On Fri, 9 May 2014 00:21:37 +0200 (CEST)
> Thomas Gleixner <tglx@linutronix.de> wrote:
>
> > On Thu, 8 May 2014, Steven Rostedt wrote:
> >
>
> > I'm fine with the code move per se. That's a good thing.
>
> Great, then I'll add this to my 3.16 queue.
>
> Can I get your Acked-by for it?
Sure
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S
2014-05-08 19:21 [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S Steven Rostedt
2014-05-08 22:21 ` Thomas Gleixner
@ 2014-05-12 7:38 ` Jiri Kosina
1 sibling, 0 replies; 5+ messages in thread
From: Jiri Kosina @ 2014-05-12 7:38 UTC (permalink / raw)
To: Steven Rostedt
Cc: LKML, x86, H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Josh Poimboeuf
On Thu, 8 May 2014, Steven Rostedt wrote:
> As the mcount code gets more complex, it really does not belong
> in the entry.S file. By moving it into its own file "mcount.S"
> keeps things a bit cleaner.
>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
I am obviously very happy about where this is heading :) hence FWIW
Acked-by: Jiri Kosina <jkosina@suse.cz>
Thanks,
--
Jiri Kosina
SUSE Labs
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-05-12 7:39 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-08 19:21 [RFC PATCH] ftrace/x86: Move the mcount/fentry code out of entry_64.S Steven Rostedt
2014-05-08 22:21 ` Thomas Gleixner
2014-05-08 22:37 ` Steven Rostedt
2014-05-08 22:40 ` Thomas Gleixner
2014-05-12 7:38 ` Jiri Kosina
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®