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
        .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