• Petri Gynther's avatar
    MIPS: ftrace: Fix dynamic tracing of kernel modules · dce0e7d5
    Petri Gynther authored
    Dynamic tracing of kernel modules is broken on 32-bit MIPS. When modules
    are loaded, the kernel crashes when dynamic tracing is enabled with:
     cd /sys/kernel/debug/tracing
     echo > set_ftrace_filter
     echo function > current_tracer
    
    1) arch/mips/kernel/ftrace.c
    When the kernel boots, or when a module is initialized, ftrace_make_nop()
    modifies every _mcount call site to eliminate the ftrace overhead.
    However, when ftrace is later enabled for a call site, ftrace_make_call()
    does not currently restore the _mcount call correctly for module call sites.
    Added ftrace_modify_code_2r() and modified ftrace_make_call() to fix this.
    
    2) arch/mips/kernel/mcount.S
    _mcount assembly routine is supposed to have the caller's _mcount call site
    address in register a0. However, a0 is currently not calculated correctly for
    module call sites. a0 should be (ra - 20) or (ra - 24), depending on whether
    the kernel was built with KBUILD_MCOUNT_RA_ADDRESS or not.
    
    This fix has been tested on Broadcom BMIPS5000 processor. Dynamic tracing
    now works for both built-in functions and module functions.
    Signed-off-by: default avatarPetri Gynther <pgynther@google.com>
    Cc: linux-mips@linux-mips.org
    Cc: rostedt@goodmis.org
    Cc: alcooperx@gmail.com
    Cc: cminyard@mvista.com
    Patchwork: https://patchwork.linux-mips.org/patch/7476/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    dce0e7d5
ftrace.c 10.9 KB