• Qing Zhang's avatar
    LoongArch/ftrace: Add dynamic function tracer support · 4733f09d
    Qing Zhang authored
    The compiler has inserted 2 NOPs before the regular function prologue.
    T series registers are available and safe because of LoongArch's psABI.
    
    At runtime, we can replace nop with bl to enable ftrace call and replace
    bl with nop to disable ftrace call. The bl instruction requires us to
    save the original RA value, so it saves RA at t0 here.
    
    Details are:
    
    | Compiled   |       Disabled         |        Enabled         |
    +------------+------------------------+------------------------+
    | nop        | move     t0, ra        | move    t0, ra         |
    | nop        | nop                    | bl      ftrace_caller  |
    | func_body  | func_body              | func_body              |
    
    The RA value will be recovered by ftrace_regs_entry, and restored into
    RA before returning to the regular function prologue. When a function is
    not being traced, the "move t0, ra" is not harmful.
    
    1) ftrace_make_call, ftrace_make_nop (in kernel/ftrace.c)
       The two functions turn each recorded call site of filtered functions
       into a call to ftrace_caller or nops.
    
    2) ftracce_update_ftrace_func (in kernel/ftrace.c)
       turns the nops at ftrace_call into a call to a generic entry for
       function tracers.
    
    3) ftrace_caller (in kernel/mcount_dyn.S)
       The entry where each _mcount call sites calls to once they are
       filtered to be traced.
    Co-developed-by: default avatarJinyang He <hejinyang@loongson.cn>
    Signed-off-by: default avatarJinyang He <hejinyang@loongson.cn>
    Signed-off-by: default avatarQing Zhang <zhangqing@loongson.cn>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    4733f09d
Makefile 4.14 KB