Re: [RFC] x86: entry_64 - introduce FTRACE_ frame macro

From: Steven Rostedt
Date: Fri Dec 12 2008 - 15:20:12 EST



On Fri, 2008-12-12 at 21:41 +0300, Cyrill Gorcunov wrote:
> Impact: clean up
>
> Itroduce FTRACE_SAVE/RESTORE_FRAME which allow us to
> save a number of lines on source level.
>
> Also fix a comment in ftrace.h.
>
> ---
> Actually I'm not that sure about bringing new macros there
> since we already have a lot so feel free to just drop it.
>
> Maybe it would be good to comment args passed
> to ftrace_call on ABI level :)

Actually that is pretty much the same as mcount call. But we may change
it in the future. We probably should document (if it is not already) the
ftrace call graph ABI.

>
> Ah, the patch is on top of -tip e3bdf48

If you have tested this with and without dynamic ftrace, for both the
function tracer and the function graph tracer, then you have my...

Acked-by: Steven Rostedt <srostedt@xxxxxxxxxx>

-- Steve

>
> arch/x86/include/asm/ftrace.h | 2 -
> arch/x86/kernel/entry_64.S | 70 +++++++++++++++---------------------------
> 2 files changed, 26 insertions(+), 46 deletions(-)
>
> Index: linux-2.6.git/arch/x86/include/asm/ftrace.h
> ===================================================================
> --- linux-2.6.git.orig/arch/x86/include/asm/ftrace.h
> +++ linux-2.6.git/arch/x86/include/asm/ftrace.h
> @@ -46,7 +46,7 @@ struct ftrace_ret_stack {
> /*
> * Primary handler of a function return.
> * It relays on ftrace_return_to_handler.
> - * Defined in entry32.S
> + * Defined in entry_32/64.S
> */
> extern void return_to_handler(void);
>
> Index: linux-2.6.git/arch/x86/kernel/entry_64.S
> ===================================================================
> --- linux-2.6.git.orig/arch/x86/kernel/entry_64.S
> +++ linux-2.6.git/arch/x86/kernel/entry_64.S
> @@ -66,10 +66,7 @@ ENTRY(mcount)
> retq
> END(mcount)
>
> -ENTRY(ftrace_caller)
> - cmpl $0, function_trace_stop
> - jne ftrace_stub
> -
> + .macro FTRACE_SAVE_FRAME
> /* taken from glibc */
> subq $0x38, %rsp
> movq %rax, (%rsp)
> @@ -79,15 +76,9 @@ ENTRY(ftrace_caller)
> movq %rdi, 32(%rsp)
> movq %r8, 40(%rsp)
> movq %r9, 48(%rsp)
> + .endm
>
> - movq 0x38(%rsp), %rdi
> - movq 8(%rbp), %rsi
> - subq $MCOUNT_INSN_SIZE, %rdi
> -
> -.globl ftrace_call
> -ftrace_call:
> - call ftrace_stub
> -
> + .macro FTRACE_RESTORE_FRAME
> movq 48(%rsp), %r9
> movq 40(%rsp), %r8
> movq 32(%rsp), %rdi
> @@ -96,6 +87,23 @@ ftrace_call:
> movq 8(%rsp), %rcx
> movq (%rsp), %rax
> addq $0x38, %rsp
> + .endm
> +
> +ENTRY(ftrace_caller)
> + cmpl $0, function_trace_stop
> + jne ftrace_stub
> +
> + FTRACE_SAVE_FRAME
> +
> + movq 0x38(%rsp), %rdi
> + movq 8(%rbp), %rsi
> + subq $MCOUNT_INSN_SIZE, %rdi
> +
> +.globl ftrace_call
> +ftrace_call:
> + call ftrace_stub
> +
> + FTRACE_RESTORE_FRAME
>
> #ifdef CONFIG_FUNCTION_GRAPH_TRACER
> .globl ftrace_graph_call
> @@ -129,15 +137,7 @@ ftrace_stub:
> retq
>
> trace:
> - /* taken from glibc */
> - subq $0x38, %rsp
> - movq %rax, (%rsp)
> - movq %rcx, 8(%rsp)
> - movq %rdx, 16(%rsp)
> - movq %rsi, 24(%rsp)
> - movq %rdi, 32(%rsp)
> - movq %r8, 40(%rsp)
> - movq %r9, 48(%rsp)
> + FTRACE_SAVE_FRAME
>
> movq 0x38(%rsp), %rdi
> movq 8(%rbp), %rsi
> @@ -145,14 +145,7 @@ trace:
>
> call *ftrace_trace_function
>
> - movq 48(%rsp), %r9
> - movq 40(%rsp), %r8
> - movq 32(%rsp), %rdi
> - movq 24(%rsp), %rsi
> - movq 16(%rsp), %rdx
> - movq 8(%rsp), %rcx
> - movq (%rsp), %rax
> - addq $0x38, %rsp
> + FTRACE_RESTORE_FRAME
>
> jmp ftrace_stub
> END(mcount)
> @@ -164,14 +157,7 @@ ENTRY(ftrace_graph_caller)
> cmpl $0, function_trace_stop
> jne ftrace_stub
>
> - subq $0x38, %rsp
> - movq %rax, (%rsp)
> - movq %rcx, 8(%rsp)
> - movq %rdx, 16(%rsp)
> - movq %rsi, 24(%rsp)
> - movq %rdi, 32(%rsp)
> - movq %r8, 40(%rsp)
> - movq %r9, 48(%rsp)
> + FTRACE_SAVE_FRAME
>
> leaq 8(%rbp), %rdi
> movq 0x38(%rsp), %rsi
> @@ -179,14 +165,8 @@ ENTRY(ftrace_graph_caller)
>
> call prepare_ftrace_return
>
> - movq 48(%rsp), %r9
> - movq 40(%rsp), %r8
> - movq 32(%rsp), %rdi
> - movq 24(%rsp), %rsi
> - movq 16(%rsp), %rdx
> - movq 8(%rsp), %rcx
> - movq (%rsp), %rax
> - addq $0x38, %rsp
> + FTRACE_RESTORE_FRAME
> +
> retq
> END(ftrace_graph_caller)
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/