nds32/ftrace: Support static function tracer
This patch support the static function tracer. On nds32 ABI, we need to always push return address to stack for __builtin_return_address can work correctly, otherwise, it will get the wrong value of $lp at leaf function. Signed-off-by: Zong Li <zong@andestech.com> Acked-by: Greentime Hu <greentime@andestech.com> Signed-off-by: Greentime Hu <greentime@andestech.com>
This commit is contained in:
parent
487913ab18
commit
a18082575c
@ -40,6 +40,7 @@ config NDS32
|
|||||||
select NO_IOPORT_MAP
|
select NO_IOPORT_MAP
|
||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
select THREAD_INFO_IN_TASK
|
select THREAD_INFO_IN_TASK
|
||||||
|
select HAVE_FUNCTION_TRACER
|
||||||
help
|
help
|
||||||
Andes(nds32) Linux support.
|
Andes(nds32) Linux support.
|
||||||
|
|
||||||
|
@ -5,6 +5,10 @@ KBUILD_DEFCONFIG := defconfig
|
|||||||
|
|
||||||
comma = ,
|
comma = ,
|
||||||
|
|
||||||
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
|
arch-y += -malways-save-lp -mno-relax
|
||||||
|
endif
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(call cc-option, -mno-sched-prolog-epilog)
|
KBUILD_CFLAGS += $(call cc-option, -mno-sched-prolog-epilog)
|
||||||
KBUILD_CFLAGS += -mcmodel=large
|
KBUILD_CFLAGS += -mcmodel=large
|
||||||
|
|
||||||
|
20
arch/nds32/include/asm/ftrace.h
Normal file
20
arch/nds32/include/asm/ftrace.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
|
#ifndef __ASM_NDS32_FTRACE_H
|
||||||
|
#define __ASM_NDS32_FTRACE_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
|
|
||||||
|
#define HAVE_FUNCTION_GRAPH_FP_TEST
|
||||||
|
|
||||||
|
#define MCOUNT_ADDR ((unsigned long)(_mcount))
|
||||||
|
/* mcount call is composed of three instructions:
|
||||||
|
* sethi + ori + jral
|
||||||
|
*/
|
||||||
|
#define MCOUNT_INSN_SIZE 12
|
||||||
|
|
||||||
|
extern void _mcount(unsigned long parent_ip);
|
||||||
|
|
||||||
|
#endif /* CONFIG_FUNCTION_TRACER */
|
||||||
|
|
||||||
|
#endif /* __ASM_NDS32_FTRACE_H */
|
@ -21,3 +21,9 @@ extra-y := head.o vmlinux.lds
|
|||||||
|
|
||||||
|
|
||||||
obj-y += vdso/
|
obj-y += vdso/
|
||||||
|
|
||||||
|
obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o
|
||||||
|
|
||||||
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
|
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||||
|
endif
|
||||||
|
28
arch/nds32/kernel/ftrace.c
Normal file
28
arch/nds32/kernel/ftrace.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
#include <linux/ftrace.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
extern void (*ftrace_trace_function)(unsigned long, unsigned long,
|
||||||
|
struct ftrace_ops*, struct pt_regs*);
|
||||||
|
|
||||||
|
noinline void __naked ftrace_stub(unsigned long ip, unsigned long parent_ip,
|
||||||
|
struct ftrace_ops *op, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
__asm__ (""); /* avoid to optimize as pure function */
|
||||||
|
}
|
||||||
|
|
||||||
|
noinline void _mcount(unsigned long parent_ip)
|
||||||
|
{
|
||||||
|
/* save all state by the compiler prologue */
|
||||||
|
|
||||||
|
unsigned long ip = (unsigned long)__builtin_return_address(0);
|
||||||
|
|
||||||
|
if (ftrace_trace_function != ftrace_stub)
|
||||||
|
ftrace_trace_function(ip - MCOUNT_INSN_SIZE, parent_ip,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
|
/* restore all state by the compiler epilogue */
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(_mcount);
|
Loading…
Reference in New Issue
Block a user