diff options
Diffstat (limited to 'arch/blackfin/kernel/ftrace-entry.S')
-rw-r--r-- | arch/blackfin/kernel/ftrace-entry.S | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/arch/blackfin/kernel/ftrace-entry.S b/arch/blackfin/kernel/ftrace-entry.S index 76dd4fbcd17a..d66446b572c0 100644 --- a/arch/blackfin/kernel/ftrace-entry.S +++ b/arch/blackfin/kernel/ftrace-entry.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * mcount and friends -- ftrace stuff | 2 | * mcount and friends -- ftrace stuff |
3 | * | 3 | * |
4 | * Copyright (C) 2009 Analog Devices Inc. | 4 | * Copyright (C) 2009-2010 Analog Devices Inc. |
5 | * Licensed under the GPL-2 or later. | 5 | * Licensed under the GPL-2 or later. |
6 | */ | 6 | */ |
7 | 7 | ||
@@ -21,6 +21,15 @@ | |||
21 | * function will be waiting there. mmmm pie. | 21 | * function will be waiting there. mmmm pie. |
22 | */ | 22 | */ |
23 | ENTRY(__mcount) | 23 | ENTRY(__mcount) |
24 | #ifdef CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST | ||
25 | /* optional micro optimization: return if stopped */ | ||
26 | p1.l = _function_trace_stop; | ||
27 | p1.h = _function_trace_stop; | ||
28 | r3 = [p1]; | ||
29 | cc = r3 == 0; | ||
30 | if ! cc jump _ftrace_stub (bp); | ||
31 | #endif | ||
32 | |||
24 | /* save third function arg early so we can do testing below */ | 33 | /* save third function arg early so we can do testing below */ |
25 | [--sp] = r2; | 34 | [--sp] = r2; |
26 | 35 | ||
@@ -106,9 +115,12 @@ ENTRY(_ftrace_graph_caller) | |||
106 | [--sp] = r1; | 115 | [--sp] = r1; |
107 | [--sp] = rets; | 116 | [--sp] = rets; |
108 | 117 | ||
109 | /* prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) */ | 118 | /* prepare_ftrace_return(parent, self_addr, frame_pointer) */ |
110 | r0 = sp; | 119 | r0 = sp; /* unsigned long *parent */ |
111 | r1 = rets; | 120 | r1 = rets; /* unsigned long self_addr */ |
121 | #ifdef CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST | ||
122 | r2 = fp; /* unsigned long frame_pointer */ | ||
123 | #endif | ||
112 | r0 += 16; /* skip the 4 local regs on stack */ | 124 | r0 += 16; /* skip the 4 local regs on stack */ |
113 | r1 += -MCOUNT_INSN_SIZE; | 125 | r1 += -MCOUNT_INSN_SIZE; |
114 | call _prepare_ftrace_return; | 126 | call _prepare_ftrace_return; |
@@ -127,6 +139,9 @@ ENTRY(_return_to_handler) | |||
127 | [--sp] = r1; | 139 | [--sp] = r1; |
128 | 140 | ||
129 | /* get original return address */ | 141 | /* get original return address */ |
142 | #ifdef CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST | ||
143 | r0 = fp; /* Blackfin is sane, so omit this */ | ||
144 | #endif | ||
130 | call _ftrace_return_to_handler; | 145 | call _ftrace_return_to_handler; |
131 | rets = r0; | 146 | rets = r0; |
132 | 147 | ||