[PATCH 07/17] powerpc/ftrace: Consolidate ftrace support into fewer files
Christophe Leroy
christophe.leroy at csgroup.eu
Fri Jun 23 15:25:48 AEST 2023
Le 19/06/2023 à 11:47, Naveen N Rao a écrit :
> ftrace_low.S has just the _mcount stub and return_to_handler(). Merge
> this back into ftrace_mprofile.S and ftrace_64_pg.S to keep all ftrace
> code together, and to allow those to evolve independently.
>
> ftrace_mprofile.S is also not an entirely accurate name since this also
> holds ppc32 code. This will be all the more incorrect once support for
> -fpatchable-function-entry is added. Rename files here to more
> accurately describe the code:
> - ftrace_mprofile.S is renamed to ftrace_entry.S
> - ftrace_pg.c is renamed to ftrace_64_pg.c
> - ftrace_64_pg.S is rename to ftrace_64_pg_entry.S
The stats from git do not match., it says {ftrace_low.S =>
ftrace_64_pg_entry.S
>
> Signed-off-by: Naveen N Rao <naveen at kernel.org>
Reviewed-by: Christophe Leroy <christophe.leroy at csgroup.eu>
> ---
> arch/powerpc/kernel/trace/Makefile | 17 +++--
> arch/powerpc/kernel/trace/ftrace_64_pg.S | 67 -------------------
> .../trace/{ftrace_pg.c => ftrace_64_pg.c} | 0
> .../{ftrace_low.S => ftrace_64_pg_entry.S} | 58 +++++++++++++++-
> .../{ftrace_mprofile.S => ftrace_entry.S} | 65 ++++++++++++++++++
> 5 files changed, 130 insertions(+), 77 deletions(-)
> delete mode 100644 arch/powerpc/kernel/trace/ftrace_64_pg.S
> rename arch/powerpc/kernel/trace/{ftrace_pg.c => ftrace_64_pg.c} (100%)
> rename arch/powerpc/kernel/trace/{ftrace_low.S => ftrace_64_pg_entry.S} (55%)
> rename arch/powerpc/kernel/trace/{ftrace_mprofile.S => ftrace_entry.S} (83%)
>
> diff --git a/arch/powerpc/kernel/trace/Makefile b/arch/powerpc/kernel/trace/Makefile
> index 342a2d1ae86cd0..125f4ca588b98a 100644
> --- a/arch/powerpc/kernel/trace/Makefile
> +++ b/arch/powerpc/kernel/trace/Makefile
> @@ -6,16 +6,15 @@
> ifdef CONFIG_FUNCTION_TRACER
> # do not trace tracer code
> CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
> -CFLAGS_REMOVE_ftrace_pg.o = $(CC_FLAGS_FTRACE)
> +CFLAGS_REMOVE_ftrace_64_pg.o = $(CC_FLAGS_FTRACE)
> endif
>
> -obj32-$(CONFIG_FUNCTION_TRACER) += ftrace_mprofile.o ftrace.o
> +obj32-$(CONFIG_FUNCTION_TRACER) += ftrace.o ftrace_entry.o
> ifdef CONFIG_MPROFILE_KERNEL
> -obj64-$(CONFIG_FUNCTION_TRACER) += ftrace_mprofile.o ftrace.o
> +obj64-$(CONFIG_FUNCTION_TRACER) += ftrace.o ftrace_entry.o
> else
> -obj64-$(CONFIG_FUNCTION_TRACER) += ftrace_64_pg.o ftrace_pg.o
> +obj64-$(CONFIG_FUNCTION_TRACER) += ftrace_64_pg.o ftrace_64_pg_entry.o
> endif
> -obj-$(CONFIG_FUNCTION_TRACER) += ftrace_low.o
> obj-$(CONFIG_TRACING) += trace_clock.o
>
> obj-$(CONFIG_PPC64) += $(obj64-y)
> @@ -26,7 +25,7 @@ GCOV_PROFILE_ftrace.o := n
> KCOV_INSTRUMENT_ftrace.o := n
> KCSAN_SANITIZE_ftrace.o := n
> UBSAN_SANITIZE_ftrace.o := n
> -GCOV_PROFILE_ftrace_pg.o := n
> -KCOV_INSTRUMENT_ftrace_pg.o := n
> -KCSAN_SANITIZE_ftrace_pg.o := n
> -UBSAN_SANITIZE_ftrace_pg.o := n
> +GCOV_PROFILE_ftrace_64_pg.o := n
> +KCOV_INSTRUMENT_ftrace_64_pg.o := n
> +KCSAN_SANITIZE_ftrace_64_pg.o := n
> +UBSAN_SANITIZE_ftrace_64_pg.o := n
> diff --git a/arch/powerpc/kernel/trace/ftrace_64_pg.S b/arch/powerpc/kernel/trace/ftrace_64_pg.S
> deleted file mode 100644
> index 6708e24db0aba8..00000000000000
> --- a/arch/powerpc/kernel/trace/ftrace_64_pg.S
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * Split from ftrace_64.S
> - */
> -
> -#include <linux/magic.h>
> -#include <asm/ppc_asm.h>
> -#include <asm/asm-offsets.h>
> -#include <asm/ftrace.h>
> -#include <asm/ppc-opcode.h>
> -#include <asm/export.h>
> -
> -_GLOBAL_TOC(ftrace_caller)
> - lbz r3, PACA_FTRACE_ENABLED(r13)
> - cmpdi r3, 0
> - beqlr
> -
> - /* Taken from output of objdump from lib64/glibc */
> - mflr r3
> - ld r11, 0(r1)
> - stdu r1, -112(r1)
> - std r3, 128(r1)
> - ld r4, 16(r11)
> - subi r3, r3, MCOUNT_INSN_SIZE
> -.globl ftrace_call
> -ftrace_call:
> - bl ftrace_stub
> - nop
> -#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> -.globl ftrace_graph_call
> -ftrace_graph_call:
> - b ftrace_graph_stub
> -_GLOBAL(ftrace_graph_stub)
> -#endif
> - ld r0, 128(r1)
> - mtlr r0
> - addi r1, r1, 112
> -
> -_GLOBAL(ftrace_stub)
> - blr
> -
> -#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> -_GLOBAL(ftrace_graph_caller)
> - addi r5, r1, 112
> - /* load r4 with local address */
> - ld r4, 128(r1)
> - subi r4, r4, MCOUNT_INSN_SIZE
> -
> - /* Grab the LR out of the caller stack frame */
> - ld r11, 112(r1)
> - ld r3, 16(r11)
> -
> - bl prepare_ftrace_return
> - nop
> -
> - /*
> - * prepare_ftrace_return gives us the address we divert to.
> - * Change the LR in the callers stack frame to this.
> - */
> - ld r11, 112(r1)
> - std r3, 16(r11)
> -
> - ld r0, 128(r1)
> - mtlr r0
> - addi r1, r1, 112
> - blr
> -#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> diff --git a/arch/powerpc/kernel/trace/ftrace_pg.c b/arch/powerpc/kernel/trace/ftrace_64_pg.c
> similarity index 100%
> rename from arch/powerpc/kernel/trace/ftrace_pg.c
> rename to arch/powerpc/kernel/trace/ftrace_64_pg.c
> diff --git a/arch/powerpc/kernel/trace/ftrace_low.S b/arch/powerpc/kernel/trace/ftrace_64_pg_entry.S
> similarity index 55%
> rename from arch/powerpc/kernel/trace/ftrace_low.S
> rename to arch/powerpc/kernel/trace/ftrace_64_pg_entry.S
> index 2fc7dd0a5ae968..81dbaf70b1513a 100644
> --- a/arch/powerpc/kernel/trace/ftrace_low.S
> +++ b/arch/powerpc/kernel/trace/ftrace_64_pg_entry.S
> @@ -1,6 +1,6 @@
> /* SPDX-License-Identifier: GPL-2.0-or-later */
> /*
> - * Split from entry_64.S
> + * Split from ftrace_64.S
> */
>
> #include <linux/magic.h>
> @@ -10,6 +10,62 @@
> #include <asm/ppc-opcode.h>
> #include <asm/export.h>
>
> +_GLOBAL_TOC(ftrace_caller)
> + lbz r3, PACA_FTRACE_ENABLED(r13)
> + cmpdi r3, 0
> + beqlr
> +
> + /* Taken from output of objdump from lib64/glibc */
> + mflr r3
> + ld r11, 0(r1)
> + stdu r1, -112(r1)
> + std r3, 128(r1)
> + ld r4, 16(r11)
> + subi r3, r3, MCOUNT_INSN_SIZE
> +.globl ftrace_call
> +ftrace_call:
> + bl ftrace_stub
> + nop
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +.globl ftrace_graph_call
> +ftrace_graph_call:
> + b ftrace_graph_stub
> +_GLOBAL(ftrace_graph_stub)
> +#endif
> + ld r0, 128(r1)
> + mtlr r0
> + addi r1, r1, 112
> +
> +_GLOBAL(ftrace_stub)
> + blr
> +
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +_GLOBAL(ftrace_graph_caller)
> + addi r5, r1, 112
> + /* load r4 with local address */
> + ld r4, 128(r1)
> + subi r4, r4, MCOUNT_INSN_SIZE
> +
> + /* Grab the LR out of the caller stack frame */
> + ld r11, 112(r1)
> + ld r3, 16(r11)
> +
> + bl prepare_ftrace_return
> + nop
> +
> + /*
> + * prepare_ftrace_return gives us the address we divert to.
> + * Change the LR in the callers stack frame to this.
> + */
> + ld r11, 112(r1)
> + std r3, 16(r11)
> +
> + ld r0, 128(r1)
> + mtlr r0
> + addi r1, r1, 112
> + blr
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> +
> .pushsection ".tramp.ftrace.text","aw", at progbits;
> .globl ftrace_tramp_text
> ftrace_tramp_text:
> diff --git a/arch/powerpc/kernel/trace/ftrace_mprofile.S b/arch/powerpc/kernel/trace/ftrace_entry.S
> similarity index 83%
> rename from arch/powerpc/kernel/trace/ftrace_mprofile.S
> rename to arch/powerpc/kernel/trace/ftrace_entry.S
> index ffb1db38684998..e8339706e735b1 100644
> --- a/arch/powerpc/kernel/trace/ftrace_mprofile.S
> +++ b/arch/powerpc/kernel/trace/ftrace_entry.S
> @@ -249,3 +249,68 @@ livepatch_handler:
> /* Return to original caller of live patched function */
> blr
> #endif /* CONFIG_LIVEPATCH */
> +
> +_GLOBAL(mcount)
> +_GLOBAL(_mcount)
> +EXPORT_SYMBOL(_mcount)
> + mflr r12
> + mtctr r12
> + mtlr r0
> + bctr
> +
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +_GLOBAL(return_to_handler)
> + /* need to save return values */
> +#ifdef CONFIG_PPC64
> + std r4, -32(r1)
> + std r3, -24(r1)
> + /* save TOC */
> + std r2, -16(r1)
> + std r31, -8(r1)
> + mr r31, r1
> + stdu r1, -112(r1)
> +
> + /*
> + * We might be called from a module.
> + * Switch to our TOC to run inside the core kernel.
> + */
> + LOAD_PACA_TOC()
> +#else
> + stwu r1, -16(r1)
> + stw r3, 8(r1)
> + stw r4, 12(r1)
> +#endif
> +
> + bl ftrace_return_to_handler
> + nop
> +
> + /* return value has real return address */
> + mtlr r3
> +
> +#ifdef CONFIG_PPC64
> + ld r1, 0(r1)
> + ld r4, -32(r1)
> + ld r3, -24(r1)
> + ld r2, -16(r1)
> + ld r31, -8(r1)
> +#else
> + lwz r3, 8(r1)
> + lwz r4, 12(r1)
> + addi r1, r1, 16
> +#endif
> +
> + /* Jump back to real return address */
> + blr
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> +
> +.pushsection ".tramp.ftrace.text","aw", at progbits;
> +.globl ftrace_tramp_text
> +ftrace_tramp_text:
> + .space 32
> +.popsection
> +
> +.pushsection ".tramp.ftrace.init","aw", at progbits;
> +.globl ftrace_tramp_init
> +ftrace_tramp_init:
> + .space 32
> +.popsection
More information about the Linuxppc-dev
mailing list