powerpc/ftrace: No need to read LR from stack in _mcount()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Thu, 28 Oct 2021 12:24:02 +0000 (14:24 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Nov 2021 11:49:29 +0000 (22:49 +1100)
All functions calling _mcount do it exactly the same way, with the
following sequence of instructions:

c07de788:       7c 08 02 a6     mflr    r0
c07de78c:       90 01 00 04     stw     r0,4(r1)
c07de790:       4b 84 13 65     bl      c001faf4 <_mcount>

Allthough LR is pushed on stack, it is still in r0 while entering
_mcount().

Function arguments are in r3-r10, so r11 and r12 are still available
at that point.

Do like PPC64 and use r12 to move LR into CTR, so that r0 is preserved
and doesn't need to be restored from the stack.

While at it, bring back the EXPORT_SYMBOL at the end of _mcount.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/24a3ba7db388537c44a038026f926d885372e6d3.1635423081.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/trace/ftrace_32.S

index e023ae59c4294c1d6c38181f5af10fe0c8983d5a..c7d57124cc59cd2071af0ac9431af11903cebc58 100644 (file)
@@ -14,16 +14,16 @@ _GLOBAL(mcount)
 _GLOBAL(_mcount)
        /*
         * It is required that _mcount on PPC32 must preserve the
-        * link register. But we have r0 to play with. We use r0
+        * link register. But we have r12 to play with. We use r12
         * to push the return address back to the caller of mcount
         * into the ctr register, restore the link register and
         * then jump back using the ctr register.
         */
-       mflr    r0
-       mtctr   r0
-       lwz     r0, 4(r1)
+       mflr    r12
+       mtctr   r12
        mtlr    r0
        bctr
+EXPORT_SYMBOL(_mcount)
 
 _GLOBAL(ftrace_caller)
        MCOUNT_SAVE_FRAME
@@ -43,7 +43,6 @@ _GLOBAL(ftrace_graph_stub)
        /* old link register ends up in ctr reg */
        bctr
 
-EXPORT_SYMBOL(_mcount)
 
 _GLOBAL(ftrace_stub)
        blr