Commit 478ba61a authored by Max Filippov's avatar Max Filippov Committed by Chris Zankel

xtensa: add static function tracer support

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
Signed-off-by: default avatarChris Zankel <chris@zankel.net>
parent 220f5354
...@@ -19,6 +19,7 @@ config XTENSA ...@@ -19,6 +19,7 @@ config XTENSA
select CLONE_BACKWARDS select CLONE_BACKWARDS
select IRQ_DOMAIN select IRQ_DOMAIN
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_FUNCTION_TRACER
help help
Xtensa processors are 32-bit RISC machines designed by Tensilica Xtensa processors are 32-bit RISC machines designed by Tensilica
primarily for embedded systems. These processors are both primarily for embedded systems. These processors are both
......
...@@ -7,6 +7,13 @@ zlib := inffast.c inflate.c inftrees.c ...@@ -7,6 +7,13 @@ zlib := inffast.c inflate.c inftrees.c
lib-y += $(zlib:.c=.o) zmem.o lib-y += $(zlib:.c=.o) zmem.o
ccflags-y := -Ilib/zlib_inflate ccflags-y := -Ilib/zlib_inflate
ifdef CONFIG_FUNCTION_TRACER
CFLAGS_REMOVE_inflate.o = -pg
CFLAGS_REMOVE_zmem.o = -pg
CFLAGS_REMOVE_inftrees.o = -pg
CFLAGS_REMOVE_inffast.o = -pg
endif
quiet_cmd_copy_zlib = COPY $@ quiet_cmd_copy_zlib = COPY $@
cmd_copy_zlib = cat $< > $@ cmd_copy_zlib = cat $< > $@
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <asm/processor.h> #include <asm/processor.h>
#define HAVE_ARCH_CALLER_ADDR #define HAVE_ARCH_CALLER_ADDR
#ifndef __ASSEMBLY__
#define CALLER_ADDR0 ({ unsigned long a0, a1; \ #define CALLER_ADDR0 ({ unsigned long a0, a1; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"mov %0, a0\n" \ "mov %0, a0\n" \
...@@ -24,10 +25,22 @@ extern unsigned long return_address(unsigned level); ...@@ -24,10 +25,22 @@ extern unsigned long return_address(unsigned level);
#define CALLER_ADDR1 return_address(1) #define CALLER_ADDR1 return_address(1)
#define CALLER_ADDR2 return_address(2) #define CALLER_ADDR2 return_address(2)
#define CALLER_ADDR3 return_address(3) #define CALLER_ADDR3 return_address(3)
#else #else /* CONFIG_FRAME_POINTER */
#define CALLER_ADDR1 (0) #define CALLER_ADDR1 (0)
#define CALLER_ADDR2 (0) #define CALLER_ADDR2 (0)
#define CALLER_ADDR3 (0) #define CALLER_ADDR3 (0)
#endif #endif /* CONFIG_FRAME_POINTER */
#endif /* __ASSEMBLY__ */
#ifdef CONFIG_FUNCTION_TRACER
#define MCOUNT_ADDR ((unsigned long)(_mcount))
#define MCOUNT_INSN_SIZE 3
#ifndef __ASSEMBLY__
extern void _mcount(void);
#define mcount _mcount
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_FUNCTION_TRACER */
#endif /* _XTENSA_FTRACE_H */ #endif /* _XTENSA_FTRACE_H */
...@@ -11,6 +11,7 @@ obj-y := align.o coprocessor.o entry.o irq.o pci-dma.o platform.o process.o \ ...@@ -11,6 +11,7 @@ obj-y := align.o coprocessor.o entry.o irq.o pci-dma.o platform.o process.o \
obj-$(CONFIG_KGDB) += xtensa-stub.o obj-$(CONFIG_KGDB) += xtensa-stub.o
obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_PCI) += pci.o
obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o
AFLAGS_head.o += -mtext-section-literals AFLAGS_head.o += -mtext-section-literals
......
/*
* arch/xtensa/kernel/mcount.S
*
* Xtensa specific mcount support
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2013 Tensilica Inc.
*/
#include <linux/linkage.h>
#include <asm/ftrace.h>
/*
* Entry condition:
*
* a2: a0 of the caller
*/
ENTRY(_mcount)
entry a1, 16
movi a4, ftrace_trace_function
l32i a4, a4, 0
movi a3, ftrace_stub
bne a3, a4, 1f
retw
1: xor a7, a2, a1
movi a3, 0x3fffffff
and a7, a7, a3
xor a7, a7, a1
xor a6, a0, a1
and a6, a6, a3
xor a6, a6, a1
addi a6, a6, -MCOUNT_INSN_SIZE
callx4 a4
retw
ENDPROC(_mcount)
ENTRY(ftrace_stub)
entry a1, 16
retw
ENDPROC(ftrace_stub)
...@@ -124,3 +124,7 @@ extern long common_exception_return; ...@@ -124,3 +124,7 @@ extern long common_exception_return;
extern long _spill_registers; extern long _spill_registers;
EXPORT_SYMBOL(common_exception_return); EXPORT_SYMBOL(common_exception_return);
EXPORT_SYMBOL(_spill_registers); EXPORT_SYMBOL(_spill_registers);
#ifdef CONFIG_FUNCTION_TRACER
EXPORT_SYMBOL(_mcount);
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment