Re: [PATCH v6 1/9] ppc64 (le): prepare for -mprofile-kernel
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2016-01-28 03:39:44
Also in:
lkml
On Wed, 2016-01-27 at 23:28 +1030, Alan Modra wrote:
On Wed, Jan 27, 2016 at 09:19:27PM +1100, Michael Ellerman wrote:quoted
Hi Torsten, On Mon, 2016-01-25 at 16:26 +0100, Torsten Duwe wrote:quoted
The gcc switch -mprofile-kernel, available for ppc64 on gcc > 4.8.5, allows to call _mcount very early in the function, which low-level ASM code and code patching functions need to consider. Especially the link register and the parameter registers are still alive and not yet saved into a new stack frame. Signed-off-by: Torsten Duwe <redacted> --- arch/powerpc/kernel/entry_64.S | 45 +++++++++++++++++++++++++++++++++++++++-- arch/powerpc/kernel/ftrace.c | 12 +++++++++-- arch/powerpc/kernel/module_64.c | 14 +++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-)diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index a94f155..e7cd043 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S@@ -1206,7 +1206,12 @@ _GLOBAL(enter_prom) #ifdef CONFIG_DYNAMIC_FTRACE _GLOBAL(mcount) _GLOBAL(_mcount) - blr + std r0,LRSAVE(r1) /* gcc6 does this _after_ this call _only_ */ + mflr r0 + mtctr r0 + ld r0,LRSAVE(r1) + mtlr r0 + bctrCan we use r11 instead? eg: _GLOBAL(_mcount) mflr r11 mtctr r11 mtlr r0 bctrDepends on what you need to support. As Torsten says, the code to call _mcount when -mprofile-kernel is emitted before the prologue of a function (similar to -m32), but after the ELFv2 global entry point code. If you trash r11 here you're killing the static chain pointer, used by C nested functions or other languages that use a static chain, eg. Pascal. r11 has *not* been saved for ELFv2.
OK, thanks for clarfiying. Pascal is not a big concern :D. But although I don't think we use nested functions anywhere, someone somewhere could be, or at least might one day.
r12 might be a better choice for a temp reg.
Even better. cheers