Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1808257 authored by Zong Li's avatar Zong Li Committed by Greentime Hu
Browse files

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: default avatarZong Li <zong@andestech.com>
Acked-by: default avatarGreentime Hu <greentime@andestech.com>
Signed-off-by: default avatarGreentime Hu <greentime@andestech.com>
parent 487913ab
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ config NDS32
	select NO_IOPORT_MAP
	select RTC_LIB
	select THREAD_INFO_IN_TASK
	select HAVE_FUNCTION_TRACER
	help
	  Andes(nds32) Linux support.

+4 −0
Original line number Diff line number Diff line
@@ -5,6 +5,10 @@ KBUILD_DEFCONFIG := defconfig

comma = ,

ifdef CONFIG_FUNCTION_TRACER
arch-y += -malways-save-lp -mno-relax
endif

KBUILD_CFLAGS	+= $(call cc-option, -mno-sched-prolog-epilog)
KBUILD_CFLAGS	+= -mcmodel=large

+20 −0
Original line number Diff line number Diff line
/* 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 */
+6 −0
Original line number Diff line number Diff line
@@ -21,3 +21,9 @@ extra-y := head.o vmlinux.lds


obj-y				+= vdso/

obj-$(CONFIG_FUNCTION_TRACER)   += ftrace.o

ifdef CONFIG_FUNCTION_TRACER
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
endif
+28 −0
Original line number Diff line number Diff line
// 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);