Skip to content

Commit

Permalink
Blackfin: initial support for ftrace
Browse files Browse the repository at this point in the history
Just the basic ftrace support here -- mcount and the ftrace stub.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
  • Loading branch information
Mike Frysinger committed Jun 13, 2009
1 parent 6fa68e7 commit 1c873be
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 1 deletion.
1 change: 1 addition & 0 deletions arch/blackfin/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ config RWSEM_XCHGADD_ALGORITHM

config BLACKFIN
def_bool y
select HAVE_FUNCTION_TRACER
select HAVE_IDE
select HAVE_KERNEL_GZIP
select HAVE_KERNEL_BZIP2
Expand Down
14 changes: 13 additions & 1 deletion arch/blackfin/include/asm/ftrace.h
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
/* empty */
/*
* Blackfin ftrace code
*
* Copyright 2009 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/

#ifndef __ASM_BFIN_FTRACE_H__
#define __ASM_BFIN_FTRACE_H__

#define MCOUNT_INSN_SIZE 8 /* sizeof mcount call: LINK + CALL */

#endif
1 change: 1 addition & 0 deletions arch/blackfin/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ else
obj-y += time.o
endif

obj-$(CONFIG_FUNCTION_TRACER) += ftrace-entry.o
obj-$(CONFIG_IPIPE) += ipipe.o
obj-$(CONFIG_IPIPE_TRACE_MCOUNT) += mcount.o
obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o
Expand Down
5 changes: 5 additions & 0 deletions arch/blackfin/kernel/bfin_ksyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,8 @@ EXPORT_SYMBOL(__raw_smp_mark_barrier_asm);
EXPORT_SYMBOL(__raw_smp_check_barrier_asm);
#endif
#endif

#ifdef CONFIG_FUNCTION_TRACER
extern void _mcount(void);
EXPORT_SYMBOL(_mcount);
#endif
72 changes: 72 additions & 0 deletions arch/blackfin/kernel/ftrace-entry.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* mcount and friends -- ftrace stuff
*
* Copyright (C) 2009 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/

#include <linux/linkage.h>
#include <asm/ftrace.h>

.text

/* GCC will have called us before setting up the function prologue, so we
* can clobber the normal scratch registers, but we need to make sure to
* save/restore the registers used for argument passing (R0-R2) in case
* the profiled function is using them. With data registers, R3 is the
* only one we can blow away. With pointer registers, we have P0-P2.
*
* Upon entry, the RETS will point to the top of the current profiled
* function. And since GCC setup the frame for us, the previous function
* will be waiting there. mmmm pie.
*/
ENTRY(__mcount)
/* save third function arg early so we can do testing below */
[--sp] = r2;

/* load the function pointer to the tracer */
p0.l = _ftrace_trace_function;
p0.h = _ftrace_trace_function;
r3 = [p0];

/* optional micro optimization: don't call the stub tracer */
r2.l = _ftrace_stub;
r2.h = _ftrace_stub;
cc = r2 == r3;
if ! cc jump .Ldo_trace;

r2 = [sp++];
rts;

.Ldo_trace:

/* save first/second function arg and the return register */
[--sp] = r0;
[--sp] = r1;
[--sp] = rets;

/* setup the tracer function */
p0 = r3;

/* tracer(ulong frompc, ulong selfpc):
* frompc: the pc that did the call to ...
* selfpc: ... this location
* the selfpc itself will need adjusting for the mcount call
*/
r1 = rets;
r0 = [fp + 4];
r1 += -MCOUNT_INSN_SIZE;

/* call the tracer */
call (p0);

/* restore state and get out of dodge */
rets = [sp++];
r1 = [sp++];
r0 = [sp++];
r2 = [sp++];

.globl _ftrace_stub
_ftrace_stub:
rts;
ENDPROC(__mcount)

0 comments on commit 1c873be

Please sign in to comment.