sparc64: Give a stack frame to the ftrace call sites.

It's the only way we'll be able to implement the function
graph tracer properly.

A positive is that we no longer have to worry about the
linker over-optimizing the tail call, since we don't
use a tail call any more.

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2010-04-06 19:59:46 -07:00
parent daecbf58a5
commit a71d1d6bb1
1 changed files with 16 additions and 15 deletions

View File

@ -33,9 +33,13 @@ mcount:
or %g2, %lo(ftrace_stub), %g2
cmp %g1, %g2
be,pn %icc, 1f
mov %i7, %o1
jmpl %g1, %g0
mov %o7, %o0
mov %i7, %g2
save %sp, -128, %sp
mov %g2, %o1
jmpl %g1, %o7
mov %i7, %o0
ret
restore
/* not reached */
1:
#endif
@ -57,21 +61,18 @@ ftrace_stub:
.type ftrace_caller,#function
ftrace_caller:
sethi %hi(function_trace_stop), %g1
mov %i7, %o1
lduw [%g1 + %lo(function_trace_stop)], %g2
brnz,pn %g2, ftrace_stub
mov %o7, %o0
mov %i7, %g2
lduw [%g1 + %lo(function_trace_stop)], %g3
brnz,pn %g3, ftrace_stub
nop
save %sp, -128, %sp
mov %g2, %o1
.globl ftrace_call
ftrace_call:
/* If the final kernel link ever turns on relaxation, we'll need
* to do something about this tail call. Otherwise the linker
* will rewrite the call into a branch and nop out the move
* instruction.
*/
call ftrace_stub
mov %o0, %o7
retl
nop
mov %i7, %o0
ret
restore
.size ftrace_call,.-ftrace_call
.size ftrace_caller,.-ftrace_caller
#endif