Skip to content

Commit

Permalink
nds32/ftrace: Support static function tracer
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Zong Li authored and Greentime Hu committed Sep 4, 2018
1 parent 487913a commit a180825
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/nds32/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
4 changes: 4 additions & 0 deletions arch/nds32/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 20 additions & 0 deletions arch/nds32/include/asm/ftrace.h
Original file line number Diff line number Diff line change
@@ -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 */
6 changes: 6 additions & 0 deletions arch/nds32/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 28 additions & 0 deletions arch/nds32/kernel/ftrace.c
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit a180825

Please sign in to comment.