blob: 5ea9030725c046b0684658f3465c333e0f65c97b [file] [log] [blame]
Paul Mundt4b4cf752008-09-21 17:17:53 +09001#ifndef __ASM_SH_FTRACE_H
2#define __ASM_SH_FTRACE_H
3
Matt Flemingfad57fe2008-11-12 20:11:47 +09004#ifdef CONFIG_FUNCTION_TRACER
5
6#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
Paul Mundtc68e3202009-08-25 18:39:33 +09007#define FTRACE_SYSCALL_MAX NR_syscalls
Matt Flemingfad57fe2008-11-12 20:11:47 +09008
Paul Mundt4b4cf752008-09-21 17:17:53 +09009#ifndef __ASSEMBLY__
10extern void mcount(void);
Matt Flemingfad57fe2008-11-12 20:11:47 +090011
12#define MCOUNT_ADDR ((long)(mcount))
13
14#ifdef CONFIG_DYNAMIC_FTRACE
Matt Flemingca0d1722009-06-28 12:53:07 +010015#define CALL_ADDR ((long)(ftrace_call))
Matt Flemingfad57fe2008-11-12 20:11:47 +090016#define STUB_ADDR ((long)(ftrace_stub))
Matt Fleming327933f2009-07-11 00:29:03 +000017#define GRAPH_ADDR ((long)(ftrace_graph_call))
18#define CALLER_ADDR ((long)(ftrace_caller))
Matt Flemingfad57fe2008-11-12 20:11:47 +090019
Matt Flemingca0d1722009-06-28 12:53:07 +010020#define MCOUNT_INSN_OFFSET ((STUB_ADDR - CALL_ADDR) - 4)
Matt Fleming327933f2009-07-11 00:29:03 +000021#define GRAPH_INSN_OFFSET ((CALLER_ADDR - GRAPH_ADDR) - 4)
Paul Mundt22f131a2008-11-27 11:04:43 +090022
23struct dyn_arch_ftrace {
24 /* No extra data needed on sh */
25};
26
27#endif /* CONFIG_DYNAMIC_FTRACE */
Paul Mundt4b4cf752008-09-21 17:17:53 +090028
Matt Flemingfad57fe2008-11-12 20:11:47 +090029static inline unsigned long ftrace_call_adjust(unsigned long addr)
30{
31 /* 'addr' is the memory table address. */
32 return addr;
33}
Matt Flemingfad57fe2008-11-12 20:11:47 +090034
Matt Flemingd26cddb2009-10-11 17:56:17 +010035
36#ifdef CONFIG_DWARF_UNWINDER
37#include <asm/dwarf.h>
38
39#define HAVE_ARCH_CALLER_ADDR
40
41static inline unsigned long dwarf_return_address(int depth)
42{
43 struct dwarf_frame *frame;
44 unsigned long ra;
45 int i;
46
47 for (i = 0, frame = NULL, ra = 0; i <= depth; i++) {
48 struct dwarf_frame *tmp;
49
50 tmp = dwarf_unwind_stack(ra, frame);
51
52 if (frame)
53 dwarf_free_frame(frame);
54
55 frame = tmp;
56
57 if (!frame || !frame->return_addr)
58 break;
59
60 ra = frame->return_addr;
61 }
62
63 /* Failed to unwind the stack to the specified depth. */
64 WARN_ON(i != depth + 1);
65
66 if (frame)
67 dwarf_free_frame(frame);
68
69 return ra;
70}
71
72#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
73#define CALLER_ADDR1 dwarf_return_address(1)
74#define CALLER_ADDR2 dwarf_return_address(2)
75#define CALLER_ADDR3 dwarf_return_address(3)
76#define CALLER_ADDR4 dwarf_return_address(4)
77#define CALLER_ADDR5 dwarf_return_address(5)
78#define CALLER_ADDR6 dwarf_return_address(6)
79
80#endif /* CONFIG_DWARF_UNWINDER */
81
Paul Mundt22f131a2008-11-27 11:04:43 +090082#endif /* __ASSEMBLY__ */
Matt Flemingfad57fe2008-11-12 20:11:47 +090083#endif /* CONFIG_FUNCTION_TRACER */
84
Paul Mundt4b4cf752008-09-21 17:17:53 +090085#endif /* __ASM_SH_FTRACE_H */