This patch series to support basic and dynamic ftrace. 1) -pg Use `-pg` makes stub like a child function `void _mcount(void *ra)`. Thus, it can be seen store RA and open stack before `call _mcount`. Find `open stack` at first, and then find `store RA`. 2) -fpatchable-function-entry=2 The compiler has inserted 2 NOPs before the regular function prologue. T series registers are available and safe because of LoongArch psABI. At runtime, replace nop with bl to enable ftrace call and replace bl with nop to disable ftrace call. The bl requires us to save the original RA value, so here it saves RA at t0. 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. performs a series of startup tests on ftrace and The test cases in selftests has passed on LoongArch. Qing Zhang (9): LoongArch/ftrace: Add basic support LoongArch/ftrace: Add recordmcount support LoongArch/ftrace: Add dynamic function tracer support Loongarch/ftrace: Add dynamic function graph tracer support Loongarch/ftrace: Add DYNAMIC_FTRACE_WITH_REGS support LoongArch: modules/ftrace: Initialize PLT at load time Loongarch/ftrace: Add HAVE_FUNCTION_GRAPH_RET_ADDR_PTR support LoongArch: ftrace: Add CALLER_ADDRx macros LoongArch: Enable CONFIG_KALLSYMS_ALL and CONFIG_DEBUG_FS arch/loongarch/Kconfig | 6 + arch/loongarch/Makefile | 5 + arch/loongarch/configs/loongson3_defconfig | 60 ++--- arch/loongarch/include/asm/ftrace.h | 46 ++++ arch/loongarch/include/asm/inst.h | 35 +++ arch/loongarch/include/asm/module.h | 14 +- arch/loongarch/include/asm/module.lds.h | 1 + arch/loongarch/include/asm/processor.h | 2 - arch/loongarch/include/asm/unwind.h | 1 + arch/loongarch/kernel/Makefile | 17 +- arch/loongarch/kernel/entry_dyn.S | 154 +++++++++++++ arch/loongarch/kernel/ftrace.c | 74 ++++++ arch/loongarch/kernel/ftrace_dyn.c | 252 +++++++++++++++++++++ arch/loongarch/kernel/inst.c | 129 +++++++++++ arch/loongarch/kernel/mcount.S | 94 ++++++++ arch/loongarch/kernel/module-sections.c | 11 + arch/loongarch/kernel/module.c | 48 ++++ arch/loongarch/kernel/return_address.c | 45 ++++ arch/loongarch/kernel/unwind_guess.c | 4 +- arch/loongarch/kernel/unwind_prologue.c | 10 +- scripts/recordmcount.c | 23 ++ 21 files changed, 973 insertions(+), 58 deletions(-) create mode 100644 arch/loongarch/include/asm/ftrace.h create mode 100644 arch/loongarch/kernel/entry_dyn.S create mode 100644 arch/loongarch/kernel/ftrace.c create mode 100644 arch/loongarch/kernel/ftrace_dyn.c create mode 100644 arch/loongarch/kernel/mcount.S create mode 100644 arch/loongarch/kernel/return_address.c -- 2.36.1