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 76dd4fbcd17..d66446b572c 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 | ||
