lkml.org 
[lkml]   [2009]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 13/17] tracing: add dynamic function graph tracer for MIPS
    Date
    From: Wu Zhangjin <wuzhangjin@gmail.com>

    This patch make function graph tracer work with dynamic function tracer.

    To share the source code of dynamic function tracer(MCOUNT_SAVE_REGS),
    and avoid restoring the whole saved registers, we need to restore the ra
    register from the stack.

    (NOTE: This not work with 32bit! need to ensure why!)

    Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
    ---
    arch/mips/kernel/ftrace.c | 21 +++++++++++++++++++++
    arch/mips/kernel/mcount.S | 14 ++++++++++++--
    2 files changed, 33 insertions(+), 2 deletions(-)

    diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c
    index 50ba128..af3ceed 100644
    --- a/arch/mips/kernel/ftrace.c
    +++ b/arch/mips/kernel/ftrace.c
    @@ -92,6 +92,27 @@ int __init ftrace_dyn_arch_init(void *data)

    #ifdef CONFIG_FUNCTION_GRAPH_TRACER

    +#ifdef CONFIG_DYNAMIC_FTRACE
    +
    +extern void ftrace_graph_call(void);
    +#define JMP 0x08000000 /* jump to target directly */
    +#define CALL_FTRACE_GRAPH_CALLER \
    + jump_insn_encode(JMP, (unsigned long)(&ftrace_graph_caller))
    +#define FTRACE_GRAPH_CALL_IP ((unsigned long)(&ftrace_graph_call))
    +
    +int ftrace_enable_ftrace_graph_caller(void)
    +{
    + return ftrace_modify_code(FTRACE_GRAPH_CALL_IP,
    + CALL_FTRACE_GRAPH_CALLER);
    +}
    +
    +int ftrace_disable_ftrace_graph_caller(void)
    +{
    + return ftrace_modify_code(FTRACE_GRAPH_CALL_IP, ftrace_nop);
    +}
    +
    +#endif /* !CONFIG_DYNAMIC_FTRACE */
    +
    #define S_RA_SP (0xafbf << 16) /* s{d,w} ra, offset(sp) */
    #define S_R_SP (0xafb0 << 16) /* s{d,w} R, offset(sp) */
    #define OFFSET_MASK 0xffff /* stack offset range: 0 ~ PT_SIZE */
    diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S
    index b50e38d..98d4690 100644
    --- a/arch/mips/kernel/mcount.S
    +++ b/arch/mips/kernel/mcount.S
    @@ -77,6 +77,13 @@ ftrace_call:
    nop /* a placeholder for the call to a real tracing function */
    move a1, AT /* arg2: the caller's next ip, parent */

    +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
    + .globl ftrace_graph_call
    +ftrace_graph_call:
    + nop
    + nop
    +#endif
    +
    MCOUNT_RESTORE_REGS
    .globl ftrace_stub
    ftrace_stub:
    @@ -124,10 +131,13 @@ ftrace_stub:
    #ifdef CONFIG_FUNCTION_GRAPH_TRACER

    NESTED(ftrace_graph_caller, PT_SIZE, ra)
    +#ifdef CONFIG_DYNAMIC_FTRACE
    + PTR_L a1, PT_R31(sp) /* load the original ra from the stack */
    +#else
    MCOUNT_SAVE_REGS
    -
    - PTR_LA a0, PT_R1(sp) /* arg1: &AT -> a0 */
    move a1, ra /* arg2: next ip, selfaddr */
    +#endif
    + PTR_LA a0, PT_R1(sp) /* arg1: &AT -> a0 */
    jal prepare_ftrace_return
    move a2, fp /* arg3: frame pointer */

    --
    1.6.2.1


    \
     
     \ /
      Last update: 2009-11-09 16:55    [W:0.022 / U:32.940 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site