Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xtensa: add static function tracer support

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Chris Zankel <chris@zankel.net>

authored by

Max Filippov and committed by
Chris Zankel
478ba61a 220f5354

+78 -2
+1
arch/xtensa/Kconfig
··· 19 19 select CLONE_BACKWARDS 20 20 select IRQ_DOMAIN 21 21 select HAVE_OPROFILE 22 + select HAVE_FUNCTION_TRACER 22 23 help 23 24 Xtensa processors are 32-bit RISC machines designed by Tensilica 24 25 primarily for embedded systems. These processors are both
+7
arch/xtensa/boot/lib/Makefile
··· 7 7 lib-y += $(zlib:.c=.o) zmem.o 8 8 9 9 ccflags-y := -Ilib/zlib_inflate 10 + ifdef CONFIG_FUNCTION_TRACER 11 + CFLAGS_REMOVE_inflate.o = -pg 12 + CFLAGS_REMOVE_zmem.o = -pg 13 + CFLAGS_REMOVE_inftrees.o = -pg 14 + CFLAGS_REMOVE_inffast.o = -pg 15 + endif 16 + 10 17 11 18 quiet_cmd_copy_zlib = COPY $@ 12 19 cmd_copy_zlib = cat $< > $@
+15 -2
arch/xtensa/include/asm/ftrace.h
··· 13 13 #include <asm/processor.h> 14 14 15 15 #define HAVE_ARCH_CALLER_ADDR 16 + #ifndef __ASSEMBLY__ 16 17 #define CALLER_ADDR0 ({ unsigned long a0, a1; \ 17 18 __asm__ __volatile__ ( \ 18 19 "mov %0, a0\n" \ ··· 25 24 #define CALLER_ADDR1 return_address(1) 26 25 #define CALLER_ADDR2 return_address(2) 27 26 #define CALLER_ADDR3 return_address(3) 28 - #else 27 + #else /* CONFIG_FRAME_POINTER */ 29 28 #define CALLER_ADDR1 (0) 30 29 #define CALLER_ADDR2 (0) 31 30 #define CALLER_ADDR3 (0) 32 - #endif 31 + #endif /* CONFIG_FRAME_POINTER */ 32 + #endif /* __ASSEMBLY__ */ 33 + 34 + #ifdef CONFIG_FUNCTION_TRACER 35 + 36 + #define MCOUNT_ADDR ((unsigned long)(_mcount)) 37 + #define MCOUNT_INSN_SIZE 3 38 + 39 + #ifndef __ASSEMBLY__ 40 + extern void _mcount(void); 41 + #define mcount _mcount 42 + #endif /* __ASSEMBLY__ */ 43 + #endif /* CONFIG_FUNCTION_TRACER */ 33 44 34 45 #endif /* _XTENSA_FTRACE_H */
+1
arch/xtensa/kernel/Makefile
··· 11 11 obj-$(CONFIG_KGDB) += xtensa-stub.o 12 12 obj-$(CONFIG_PCI) += pci.o 13 13 obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o 14 + obj-$(CONFIG_FUNCTION_TRACER) += mcount.o 14 15 15 16 AFLAGS_head.o += -mtext-section-literals 16 17
+50
arch/xtensa/kernel/mcount.S
··· 1 + /* 2 + * arch/xtensa/kernel/mcount.S 3 + * 4 + * Xtensa specific mcount support 5 + * 6 + * This file is subject to the terms and conditions of the GNU General Public 7 + * License. See the file "COPYING" in the main directory of this archive 8 + * for more details. 9 + * 10 + * Copyright (C) 2013 Tensilica Inc. 11 + */ 12 + 13 + #include <linux/linkage.h> 14 + #include <asm/ftrace.h> 15 + 16 + /* 17 + * Entry condition: 18 + * 19 + * a2: a0 of the caller 20 + */ 21 + 22 + ENTRY(_mcount) 23 + 24 + entry a1, 16 25 + 26 + movi a4, ftrace_trace_function 27 + l32i a4, a4, 0 28 + movi a3, ftrace_stub 29 + bne a3, a4, 1f 30 + retw 31 + 32 + 1: xor a7, a2, a1 33 + movi a3, 0x3fffffff 34 + and a7, a7, a3 35 + xor a7, a7, a1 36 + 37 + xor a6, a0, a1 38 + and a6, a6, a3 39 + xor a6, a6, a1 40 + addi a6, a6, -MCOUNT_INSN_SIZE 41 + callx4 a4 42 + 43 + retw 44 + 45 + ENDPROC(_mcount) 46 + 47 + ENTRY(ftrace_stub) 48 + entry a1, 16 49 + retw 50 + ENDPROC(ftrace_stub)
+4
arch/xtensa/kernel/xtensa_ksyms.c
··· 124 124 extern long _spill_registers; 125 125 EXPORT_SYMBOL(common_exception_return); 126 126 EXPORT_SYMBOL(_spill_registers); 127 + 128 + #ifdef CONFIG_FUNCTION_TRACER 129 + EXPORT_SYMBOL(_mcount); 130 + #endif