diff options
| -rw-r--r-- | arch/sparc/Kconfig | 1 | ||||
| -rw-r--r-- | arch/sparc/lib/mcount.S | 22 |
2 files changed, 16 insertions, 7 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 6db513674050..035304c30ab4 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -37,6 +37,7 @@ config SPARC64 | |||
| 37 | def_bool 64BIT | 37 | def_bool 64BIT |
| 38 | select ARCH_SUPPORTS_MSI | 38 | select ARCH_SUPPORTS_MSI |
| 39 | select HAVE_FUNCTION_TRACER | 39 | select HAVE_FUNCTION_TRACER |
| 40 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | ||
| 40 | select HAVE_KRETPROBES | 41 | select HAVE_KRETPROBES |
| 41 | select HAVE_KPROBES | 42 | select HAVE_KPROBES |
| 42 | select HAVE_LMB | 43 | select HAVE_LMB |
diff --git a/arch/sparc/lib/mcount.S b/arch/sparc/lib/mcount.S index 24b8b12deed2..7047997be0eb 100644 --- a/arch/sparc/lib/mcount.S +++ b/arch/sparc/lib/mcount.S | |||
| @@ -96,13 +96,12 @@ mcount: | |||
| 96 | #endif | 96 | #endif |
| 97 | #ifdef CONFIG_FUNCTION_TRACER | 97 | #ifdef CONFIG_FUNCTION_TRACER |
| 98 | #ifdef CONFIG_DYNAMIC_FTRACE | 98 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 99 | mov %o7, %o0 | 99 | /* Do nothing, the retl/nop below is all we need. */ |
| 100 | .globl mcount_call | ||
| 101 | mcount_call: | ||
| 102 | call ftrace_stub | ||
| 103 | mov %o0, %o7 | ||
| 104 | #else | 100 | #else |
| 105 | sethi %hi(ftrace_trace_function), %g1 | 101 | sethi %hi(function_trace_stop), %g1 |
| 102 | lduw [%g1 + %lo(function_trace_stop)], %g2 | ||
| 103 | brnz,pn %g2, 1f | ||
| 104 | sethi %hi(ftrace_trace_function), %g1 | ||
| 106 | sethi %hi(ftrace_stub), %g2 | 105 | sethi %hi(ftrace_stub), %g2 |
| 107 | ldx [%g1 + %lo(ftrace_trace_function)], %g1 | 106 | ldx [%g1 + %lo(ftrace_trace_function)], %g1 |
| 108 | or %g2, %lo(ftrace_stub), %g2 | 107 | or %g2, %lo(ftrace_stub), %g2 |
| @@ -131,14 +130,23 @@ ftrace_stub: | |||
| 131 | .globl ftrace_caller | 130 | .globl ftrace_caller |
| 132 | .type ftrace_caller,#function | 131 | .type ftrace_caller,#function |
| 133 | ftrace_caller: | 132 | ftrace_caller: |
| 133 | sethi %hi(function_trace_stop), %g1 | ||
| 134 | mov %i7, %o1 | 134 | mov %i7, %o1 |
| 135 | mov %o7, %o0 | 135 | lduw [%g1 + %lo(function_trace_stop)], %g2 |
| 136 | brnz,pn %g2, ftrace_stub | ||
| 137 | mov %o7, %o0 | ||
| 136 | .globl ftrace_call | 138 | .globl ftrace_call |
| 137 | ftrace_call: | 139 | ftrace_call: |
| 140 | /* If the final kernel link ever turns on relaxation, we'll need | ||
| 141 | * to do something about this tail call. Otherwise the linker | ||
| 142 | * will rewrite the call into a branch and nop out the move | ||
| 143 | * instruction. | ||
| 144 | */ | ||
| 138 | call ftrace_stub | 145 | call ftrace_stub |
| 139 | mov %o0, %o7 | 146 | mov %o0, %o7 |
| 140 | retl | 147 | retl |
| 141 | nop | 148 | nop |
| 149 | .size ftrace_call,.-ftrace_call | ||
| 142 | .size ftrace_caller,.-ftrace_caller | 150 | .size ftrace_caller,.-ftrace_caller |
| 143 | #endif | 151 | #endif |
| 144 | #endif | 152 | #endif |
