[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4b422c01-d8a1-8543-9f06-25a955f3686d@loongson.cn>
Date: Sat, 20 Aug 2022 09:35:23 +0800
From: Qing Zhang <zhangqing@...ngson.cn>
To: Steven Rostedt <rostedt@...dmis.org>
Cc: Huacai Chen <chenhuacai@...nel.org>,
Ingo Molnar <mingo@...hat.com>,
WANG Xuerui <kernel@...0n.name>, loongarch@...ts.linux.dev,
linux-kernel@...r.kernel.org, linux-arch@...r.kernel.org,
Jiaxun Yang <jiaxun.yang@...goat.com>, hejinyang@...ngson.cn
Subject: Re: [PATCH 1/9] LoongArch/ftrace: Add basic support
On 2022/8/20 上午1:25, Steven Rostedt wrote:
> On Fri, 19 Aug 2022 16:13:55 +0800
> Qing Zhang <zhangqing@...ngson.cn> wrote:
>
>> +#define MCOUNT_STACK_SIZE (2 * SZREG)
>> +#define MCOUNT_S0_OFFSET (0)
>> +#define MCOUNT_RA_OFFSET (SZREG)
>> +
>> + .macro MCOUNT_SAVE_REGS
>> + PTR_ADDI sp, sp, -MCOUNT_STACK_SIZE
>> + PTR_S s0, sp, MCOUNT_S0_OFFSET
>> + PTR_S ra, sp, MCOUNT_RA_OFFSET
>> + move s0, a0
>> + .endm
>> +
>> + .macro MCOUNT_RESTORE_REGS
>> + move a0, s0
>> + PTR_L ra, sp, MCOUNT_RA_OFFSET
>> + PTR_L s0, sp, MCOUNT_S0_OFFSET
>> + PTR_ADDI sp, sp, MCOUNT_STACK_SIZE
>> + .endm
>> +
>> +
>> +SYM_FUNC_START(_mcount)
>> + la t1, ftrace_stub
>> + la t2, ftrace_trace_function /* Prepare t2 for (1) */
>> + PTR_L t2, t2, 0
>> + beq t1, t2, fgraph_trace
>> +
>> + MCOUNT_SAVE_REGS
>> +
>> + move a0, ra /* arg0: self return address */
>> + move a1, s0 /* arg1: parent's return address */
>> + jirl ra, t2, 0 /* (1) call *ftrace_trace_function */
>> +
>> + MCOUNT_RESTORE_REGS
>
> You know, if you can implement CONFIG_FTRACE_WITH_ARGS, where the default
> function callback gets a ftrace_regs pointer (that only holds what is
> needed for the arguments of the function as well as the stack pointer),
> then you could also implement function graph on top of that, and remove the
> need for the below "fgraph_trace" trampoline.
>
> I'd really would like all architectures to go that way. Also, the
> CONFIG_FTRACE_WITH_ARGS is all you need for live kernel patching.
>
Hi, Steve
I will add the implementation of CONFIG_FTRACE_WITH_ARGS in v2.
Thanks,
- Qing
> -- Steve
>
>
>> +
>> +fgraph_trace:
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> + la t1, ftrace_stub
>> + la t3, ftrace_graph_return
>> + PTR_L t3, t3, 0
>> + bne t1, t3, ftrace_graph_caller
>> + la t1, ftrace_graph_entry_stub
>> + la t3, ftrace_graph_entry
>> + PTR_L t3, t3, 0
>> + bne t1, t3, ftrace_graph_caller
>> +#endif
>> +
>> + .globl ftrace_stub
>> +ftrace_stub:
>> + jirl zero, ra, 0
>> +SYM_FUNC_END(_mcount)
>> +EXPORT_SYMBOL(_mcount)
>> +
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +SYM_FUNC_START(ftrace_graph_caller)
>> + MCOUNT_SAVE_REGS
>> +
>> + PTR_ADDI a0, ra, -4 /* arg0: Callsite self return addr */
>> + PTR_ADDI a1, sp, MCOUNT_STACK_SIZE /* arg1: Callsite sp */
>> + move a2, s0 /* arg2: Callsite parent ra */
>> + bl prepare_ftrace_return
>> +
>> + MCOUNT_RESTORE_REGS
>> + jirl zero, ra, 0
>> +SYM_FUNC_END(ftrace_graph_caller)
Powered by blists - more mailing lists