* [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
@ 2025-05-28 13:48 Aditya Bodkhe
2025-05-28 13:48 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Aditya Bodkhe @ 2025-05-28 13:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Aditya Bodkhe
From: Aditya Bodkhe <aditya.b1@linux.ibm.com>
commit a1be9ccc57f0 ("function_graph: Support recording and printing the
return value of function") introduced support for function graph return
value tracing.
Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
ftrace_regs") further refactored and optimized the implementation,
making `struct fgraph_ret_regs` unnecessary.
This patch enables the above modifications for powerpc64, ensuring that
function graph return value tracing is available on this architecture.
After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
but there are a few other build and runtime dependencies for FPROBE to
work properly. The next patch addresses them.
Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/ftrace.h | 15 +++++++++
arch/powerpc/kernel/trace/ftrace_entry.S | 41 ++++++++++++++----------
3 files changed, 40 insertions(+), 17 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index c3e0cc83f120..9163521bc4b9 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -250,6 +250,7 @@ config PPC
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
select HAVE_FUNCTION_ERROR_INJECTION
+ select HAVE_FUNCTION_GRAPH_FREGS
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER if !COMPILE_TEST && (PPC64 || (PPC32 && CC_IS_GCC))
select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
index 82da7c7a1d12..6ffc9c9cf4e3 100644
--- a/arch/powerpc/include/asm/ftrace.h
+++ b/arch/powerpc/include/asm/ftrace.h
@@ -50,6 +50,21 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
} while (0)
+#undef ftrace_regs_get_return_value
+static __always_inline unsigned long
+ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[3];
+}
+#define ftrace_regs_get_return_value ftrace_regs_get_return_value
+
+#undef ftrace_regs_get_frame_pointer
+static __always_inline unsigned long
+ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[1];
+}
+
static __always_inline void
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
unsigned long ip)
diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
index 3565c67fc638..eafbfb7584ed 100644
--- a/arch/powerpc/kernel/trace/ftrace_entry.S
+++ b/arch/powerpc/kernel/trace/ftrace_entry.S
@@ -409,23 +409,30 @@ EXPORT_SYMBOL(_mcount)
_GLOBAL(return_to_handler)
/* need to save return values */
#ifdef CONFIG_PPC64
- std r4, -32(r1)
- std r3, -24(r1)
+ stdu r1, -SWITCH_FRAME_SIZE(r1)
+ std r4, GPR4(r1)
+ std r3, GPR3(r1)
+ /* Save previous stack pointer (r1) */
+ addi r3, r1, SWITCH_FRAME_SIZE
+ std r3, GPR1(r1)
/* save TOC */
- std r2, -16(r1)
- std r31, -8(r1)
+ std r2, 24(r1)
+ std r31, 32(r1)
mr r31, r1
- stdu r1, -112(r1)
-
+ /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
+ addi r3, r1, STACK_INT_FRAME_REGS
/*
* 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)
+ stwu r1, -SWITCH_FRAME_SIZE(r1)
+ stw r4, GPR4(r1)
+ stw r3, GPR3(r1)
+ addi r3, r1, SWITCH_FRAME_SIZE
+ stw r3, GPR1(r1)
+ addi r3, r1, STACK_INT_FRAME_REGS
#endif
bl ftrace_return_to_handler
@@ -435,15 +442,15 @@ _GLOBAL(return_to_handler)
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)
+ ld r4, GPR4(r1)
+ ld r3, GPR3(r1)
+ ld r2, 24(r1)
+ ld r31, 32(r1)
+ ld r1, 0(r1)
#else
- lwz r3, 8(r1)
- lwz r4, 12(r1)
- addi r1, r1, 16
+ lwz r3, GPR3(r1)
+ lwz r4, GPR4(r1)
+ addi r1, r1, SWITCH_FRAME_SIZE
#endif
/* Jump back to real return address */
--
2.43.5
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer
2025-05-28 13:48 [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
@ 2025-05-28 13:48 ` Aditya Bodkhe
2025-06-09 7:47 ` Masami Hiramatsu
2025-06-02 12:36 ` [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Hari Bathini
2025-06-03 8:52 ` Christophe Leroy
2 siblings, 1 reply; 8+ messages in thread
From: Aditya Bodkhe @ 2025-05-28 13:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Hari Bathini,
Aditya Bodkhe
From: Hari Bathini <hbathini@linux.ibm.com>
Since commit 4346ba160409 ("fprobe: Rewrite fprobe on function-graph
tracer"), FPROBE depends on HAVE_FUNCTION_GRAPH_FREGS. With previous
patch adding HAVE_FUNCTION_GRAPH_FREGS for powerpc, FPROBE can be
enabled on powerpc. But with the commit b5fa903b7f7c ("fprobe: Add
fprobe_header encoding feature"), asm/fprobe.h header is needed to
define arch dependent encode/decode macros. The fprobe header MSB
pattern on powerpc is not 0xf. So, define FPROBE_HEADER_MSB_PATTERN
expected on powerpc.
Also, commit 762abbc0d09f ("fprobe: Use ftrace_regs in fprobe exit
handler") introduced HAVE_FTRACE_REGS_HAVING_PT_REGS for archs that
have pt_regs in ftrace_regs. Advertise that on powerpc to reuse
common definitions like ftrace_partial_regs().
Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/fprobe.h | 12 ++++++++++++
2 files changed, 13 insertions(+)
create mode 100644 arch/powerpc/include/asm/fprobe.h
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 9163521bc4b9..2203e4fb64c1 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -246,6 +246,7 @@ config PPC
select HAVE_EFFICIENT_UNALIGNED_ACCESS
select HAVE_GUP_FAST
select HAVE_FTRACE_GRAPH_FUNC
+ select HAVE_FTRACE_REGS_HAVING_PT_REGS
select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
diff --git a/arch/powerpc/include/asm/fprobe.h b/arch/powerpc/include/asm/fprobe.h
new file mode 100644
index 000000000000..d64bc28fb3d3
--- /dev/null
+++ b/arch/powerpc/include/asm/fprobe.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_PPC_FPROBE_H
+#define _ASM_PPC_FPROBE_H
+
+#include <asm-generic/fprobe.h>
+
+#ifdef CONFIG_64BIT
+#undef FPROBE_HEADER_MSB_PATTERN
+#define FPROBE_HEADER_MSB_PATTERN (PAGE_OFFSET & ~FPROBE_HEADER_MSB_MASK)
+#endif
+
+#endif /* _ASM_PPC_FPROBE_H */
--
2.43.5
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer
2025-05-28 13:48 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
@ 2025-06-09 7:47 ` Masami Hiramatsu
0 siblings, 0 replies; 8+ messages in thread
From: Masami Hiramatsu @ 2025-06-09 7:47 UTC (permalink / raw)
To: Aditya Bodkhe
Cc: linuxppc-dev, linux-kernel, linux-trace-kernel, maddy, mpe,
npiggin, christophe.leroy, rostedt, mhiramat, mark.rutland,
Hari Bathini, Aditya Bodkhe
On Wed, 28 May 2025 19:18:20 +0530
Aditya Bodkhe <adityab1@linux.ibm.com> wrote:
> From: Hari Bathini <hbathini@linux.ibm.com>
>
> Since commit 4346ba160409 ("fprobe: Rewrite fprobe on function-graph
> tracer"), FPROBE depends on HAVE_FUNCTION_GRAPH_FREGS. With previous
> patch adding HAVE_FUNCTION_GRAPH_FREGS for powerpc, FPROBE can be
> enabled on powerpc. But with the commit b5fa903b7f7c ("fprobe: Add
> fprobe_header encoding feature"), asm/fprobe.h header is needed to
> define arch dependent encode/decode macros. The fprobe header MSB
> pattern on powerpc is not 0xf. So, define FPROBE_HEADER_MSB_PATTERN
> expected on powerpc.
>
> Also, commit 762abbc0d09f ("fprobe: Use ftrace_regs in fprobe exit
> handler") introduced HAVE_FTRACE_REGS_HAVING_PT_REGS for archs that
> have pt_regs in ftrace_regs. Advertise that on powerpc to reuse
> common definitions like ftrace_partial_regs().
>
> Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
> Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
This patch in this series looks good to me.
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
I think this series go through powerpc tree. But you have
some comments on 1/2, so please solve it at first.
Thank you,
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/include/asm/fprobe.h | 12 ++++++++++++
> 2 files changed, 13 insertions(+)
> create mode 100644 arch/powerpc/include/asm/fprobe.h
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 9163521bc4b9..2203e4fb64c1 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -246,6 +246,7 @@ config PPC
> select HAVE_EFFICIENT_UNALIGNED_ACCESS
> select HAVE_GUP_FAST
> select HAVE_FTRACE_GRAPH_FUNC
> + select HAVE_FTRACE_REGS_HAVING_PT_REGS
> select HAVE_FTRACE_MCOUNT_RECORD
> select HAVE_FUNCTION_ARG_ACCESS_API
> select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
> diff --git a/arch/powerpc/include/asm/fprobe.h b/arch/powerpc/include/asm/fprobe.h
> new file mode 100644
> index 000000000000..d64bc28fb3d3
> --- /dev/null
> +++ b/arch/powerpc/include/asm/fprobe.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _ASM_PPC_FPROBE_H
> +#define _ASM_PPC_FPROBE_H
> +
> +#include <asm-generic/fprobe.h>
> +
> +#ifdef CONFIG_64BIT
> +#undef FPROBE_HEADER_MSB_PATTERN
> +#define FPROBE_HEADER_MSB_PATTERN (PAGE_OFFSET & ~FPROBE_HEADER_MSB_MASK)
> +#endif
> +
> +#endif /* _ASM_PPC_FPROBE_H */
> --
> 2.43.5
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
2025-05-28 13:48 [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
2025-05-28 13:48 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
@ 2025-06-02 12:36 ` Hari Bathini
2025-06-03 8:52 ` Christophe Leroy
2 siblings, 0 replies; 8+ messages in thread
From: Hari Bathini @ 2025-06-02 12:36 UTC (permalink / raw)
To: Aditya Bodkhe, linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Aditya Bodkhe
On 28/05/25 7:18 pm, Aditya Bodkhe wrote:
> From: Aditya Bodkhe <aditya.b1@linux.ibm.com>
>
> commit a1be9ccc57f0 ("function_graph: Support recording and printing the
> return value of function") introduced support for function graph return
> value tracing.
>
> Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
> ftrace_regs") further refactored and optimized the implementation,
> making `struct fgraph_ret_regs` unnecessary.
>
> This patch enables the above modifications for powerpc64, ensuring that
> function graph return value tracing is available on this architecture.
>
> After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
> but there are a few other build and runtime dependencies for FPROBE to
> work properly. The next patch addresses them.
>
> Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
Except for a couple of minor nits below..
Reviewed-by: Hari Bathini <hbathini@linux.ibm.com>
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/include/asm/ftrace.h | 15 +++++++++
> arch/powerpc/kernel/trace/ftrace_entry.S | 41 ++++++++++++++----------
> 3 files changed, 40 insertions(+), 17 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index c3e0cc83f120..9163521bc4b9 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -250,6 +250,7 @@ config PPC
> select HAVE_FUNCTION_ARG_ACCESS_API
> select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
> select HAVE_FUNCTION_ERROR_INJECTION
> + select HAVE_FUNCTION_GRAPH_FREGS
> select HAVE_FUNCTION_GRAPH_TRACER
> select HAVE_FUNCTION_TRACER if !COMPILE_TEST && (PPC64 || (PPC32 && CC_IS_GCC))
> select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
> diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
> index 82da7c7a1d12..6ffc9c9cf4e3 100644
> --- a/arch/powerpc/include/asm/ftrace.h
> +++ b/arch/powerpc/include/asm/ftrace.h
> @@ -50,6 +50,21 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
> asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
> } while (0)
>
> +#undef ftrace_regs_get_return_value
> +static __always_inline unsigned long
> +ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
> +{
> + return arch_ftrace_regs(fregs)->regs.gpr[3];
> +}
> +#define ftrace_regs_get_return_value ftrace_regs_get_return_value
> +
> +#undef ftrace_regs_get_frame_pointer
> +static __always_inline unsigned long
> +ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
> +{
> + return arch_ftrace_regs(fregs)->regs.gpr[1];
> +}
> +
> static __always_inline void
> ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
> unsigned long ip)
> diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
> index 3565c67fc638..eafbfb7584ed 100644
> --- a/arch/powerpc/kernel/trace/ftrace_entry.S
> +++ b/arch/powerpc/kernel/trace/ftrace_entry.S
> @@ -409,23 +409,30 @@ EXPORT_SYMBOL(_mcount)
> _GLOBAL(return_to_handler)
> /* need to save return values */
> #ifdef CONFIG_PPC64
> - std r4, -32(r1)
> - std r3, -24(r1)
> + stdu r1, -SWITCH_FRAME_SIZE(r1)
> + std r4, GPR4(r1)
> + std r3, GPR3(r1)
> + /* Save previous stack pointer (r1) */
Please use tab instead of " " before the comment.
> + addi r3, r1, SWITCH_FRAME_SIZE
> + std r3, GPR1(r1)
> /* save TOC */
> - std r2, -16(r1)
> - std r31, -8(r1)
> + std r2, 24(r1)
> + std r31, 32(r1)
> mr r31, r1
> - stdu r1, -112(r1)
> -
> + /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
> + addi r3, r1, STACK_INT_FRAME_REGS
Have a newline here
> /*
> * 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)
> + stwu r1, -SWITCH_FRAME_SIZE(r1)
> + stw r4, GPR4(r1)
> + stw r3, GPR3(r1)
> + addi r3, r1, SWITCH_FRAME_SIZE
> + stw r3, GPR1(r1)
> + addi r3, r1, STACK_INT_FRAME_REGS
> #endif
>
> bl ftrace_return_to_handler
> @@ -435,15 +442,15 @@ _GLOBAL(return_to_handler)
> 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)
> + ld r4, GPR4(r1)
> + ld r3, GPR3(r1)
> + ld r2, 24(r1)
> + ld r31, 32(r1)
> + ld r1, 0(r1)
> #else
> - lwz r3, 8(r1)
> - lwz r4, 12(r1)
> - addi r1, r1, 16
> + lwz r3, GPR3(r1)
> + lwz r4, GPR4(r1)
> + addi r1, r1, SWITCH_FRAME_SIZE
> #endif
>
> /* Jump back to real return address */
- Hari
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
2025-05-28 13:48 [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
2025-05-28 13:48 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
2025-06-02 12:36 ` [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Hari Bathini
@ 2025-06-03 8:52 ` Christophe Leroy
2025-06-13 7:50 ` Aditya Bodkhe
2 siblings, 1 reply; 8+ messages in thread
From: Christophe Leroy @ 2025-06-03 8:52 UTC (permalink / raw)
To: Aditya Bodkhe, linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin, rostedt,
mhiramat, mark.rutland, Aditya Bodkhe
Le 28/05/2025 à 15:48, Aditya Bodkhe a écrit :
> [Vous ne recevez pas souvent de courriers de adityab1@linux.ibm.com. Découvrez pourquoi ceci est important à https://aka.ms/LearnAboutSenderIdentification ]
>
> From: Aditya Bodkhe <aditya.b1@linux.ibm.com>
>
> commit a1be9ccc57f0 ("function_graph: Support recording and printing the
> return value of function") introduced support for function graph return
> value tracing.
>
> Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
> ftrace_regs") further refactored and optimized the implementation,
> making `struct fgraph_ret_regs` unnecessary.
>
> This patch enables the above modifications for powerpc64, ensuring that
> function graph return value tracing is available on this architecture.
Why only powerpc64 ?
I see nothing specific to powerpc64 in your patch, will it work on
powerpc32 too ?
>
> After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
> but there are a few other build and runtime dependencies for FPROBE to
> work properly. The next patch addresses them.
>
> Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/include/asm/ftrace.h | 15 +++++++++
> arch/powerpc/kernel/trace/ftrace_entry.S | 41 ++++++++++++++----------
> 3 files changed, 40 insertions(+), 17 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index c3e0cc83f120..9163521bc4b9 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -250,6 +250,7 @@ config PPC
> select HAVE_FUNCTION_ARG_ACCESS_API
> select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
> select HAVE_FUNCTION_ERROR_INJECTION
> + select HAVE_FUNCTION_GRAPH_FREGS
> select HAVE_FUNCTION_GRAPH_TRACER
> select HAVE_FUNCTION_TRACER if !COMPILE_TEST && (PPC64 || (PPC32 && CC_IS_GCC))
> select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
> diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
> index 82da7c7a1d12..6ffc9c9cf4e3 100644
> --- a/arch/powerpc/include/asm/ftrace.h
> +++ b/arch/powerpc/include/asm/ftrace.h
> @@ -50,6 +50,21 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
> asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
> } while (0)
>
> +#undef ftrace_regs_get_return_value
> +static __always_inline unsigned long
> +ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
> +{
> + return arch_ftrace_regs(fregs)->regs.gpr[3];
> +}
> +#define ftrace_regs_get_return_value ftrace_regs_get_return_value
> +
> +#undef ftrace_regs_get_frame_pointer
> +static __always_inline unsigned long
> +ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
> +{
> + return arch_ftrace_regs(fregs)->regs.gpr[1];
> +}
> +
Why unset and redefine ftrace_regs_get_return_value() and
ftrace_regs_get_frame_pointer() ? Please explain why the default ones
can't be used on powerpc.
> static __always_inline void
> ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
> unsigned long ip)
> diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
> index 3565c67fc638..eafbfb7584ed 100644
> --- a/arch/powerpc/kernel/trace/ftrace_entry.S
> +++ b/arch/powerpc/kernel/trace/ftrace_entry.S
> @@ -409,23 +409,30 @@ EXPORT_SYMBOL(_mcount)
> _GLOBAL(return_to_handler)
> /* need to save return values */
> #ifdef CONFIG_PPC64
> - std r4, -32(r1)
> - std r3, -24(r1)
> + stdu r1, -SWITCH_FRAME_SIZE(r1)
> + std r4, GPR4(r1)
> + std r3, GPR3(r1)
> + /* Save previous stack pointer (r1) */
> + addi r3, r1, SWITCH_FRAME_SIZE
> + std r3, GPR1(r1)
> /* save TOC */
> - std r2, -16(r1)
> - std r31, -8(r1)
> + std r2, 24(r1)
> + std r31, 32(r1)
> mr r31, r1
> - stdu r1, -112(r1)
> -
> + /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
> + addi r3, r1, STACK_INT_FRAME_REGS
Some of the changes seems to only be renaming and should be done in a
cleanup/preparatory patch in order to only focus on real necessary
changes in this patch.
> /*
> * 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)
> + stwu r1, -SWITCH_FRAME_SIZE(r1)
Why do we need such a big frame size just to save two registers ?
> + stw r4, GPR4(r1)
> + stw r3, GPR3(r1)
> + addi r3, r1, SWITCH_FRAME_SIZE
> + stw r3, GPR1(r1)
> + addi r3, r1, STACK_INT_FRAME_REGS
Why is this needed ?
> #endif
>
> bl ftrace_return_to_handler
> @@ -435,15 +442,15 @@ _GLOBAL(return_to_handler)
> 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)
> + ld r4, GPR4(r1)
> + ld r3, GPR3(r1)
> + ld r2, 24(r1)
> + ld r31, 32(r1)
> + ld r1, 0(r1)
> #else
> - lwz r3, 8(r1)
> - lwz r4, 12(r1)
> - addi r1, r1, 16
> + lwz r3, GPR3(r1)
> + lwz r4, GPR4(r1)
> + addi r1, r1, SWITCH_FRAME_SIZE
> #endif
>
> /* Jump back to real return address */
> --
> 2.43.5
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
2025-06-03 8:52 ` Christophe Leroy
@ 2025-06-13 7:50 ` Aditya Bodkhe
0 siblings, 0 replies; 8+ messages in thread
From: Aditya Bodkhe @ 2025-06-13 7:50 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin, rostedt,
mhiramat, mark.rutland, Aditya Bodkhe
On 03/06/25 2:22 pm, Christophe Leroy wrote:
>
>
> Le 28/05/2025 à 15:48, Aditya Bodkhe a écrit :
>> [Vous ne recevez pas souvent de courriers de adityab1@linux.ibm.com.
>> Découvrez pourquoi ceci est important à
>> https://aka.ms/LearnAboutSenderIdentification ]
>>
>> From: Aditya Bodkhe <aditya.b1@linux.ibm.com>
>>
>> commit a1be9ccc57f0 ("function_graph: Support recording and printing the
>> return value of function") introduced support for function graph return
>> value tracing.
>>
>> Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
>> ftrace_regs") further refactored and optimized the implementation,
>> making `struct fgraph_ret_regs` unnecessary.
>>
>> This patch enables the above modifications for powerpc64, ensuring that
>> function graph return value tracing is available on this architecture.
>
> Why only powerpc64 ?
>
> I see nothing specific to powerpc64 in your patch, will it work on
> powerpc32 too ?
>
That's a oversight on my part . This patch necessary changes for
powerpc32 bit and tested this feature to be working as expected on the same.
>>
>> After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
>> but there are a few other build and runtime dependencies for FPROBE to
>> work properly. The next patch addresses them.
>>
>> Signed-off-by: Aditya Bodkhe <aditya.b1@linux.ibm.com>
>> ---
>> arch/powerpc/Kconfig | 1 +
>> arch/powerpc/include/asm/ftrace.h | 15 +++++++++
>> arch/powerpc/kernel/trace/ftrace_entry.S | 41 ++++++++++++++----------
>> 3 files changed, 40 insertions(+), 17 deletions(-)
>>
>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>> index c3e0cc83f120..9163521bc4b9 100644
>> --- a/arch/powerpc/Kconfig
>> +++ b/arch/powerpc/Kconfig
>> @@ -250,6 +250,7 @@ config PPC
>> select HAVE_FUNCTION_ARG_ACCESS_API
>> select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
>> select HAVE_FUNCTION_ERROR_INJECTION
>> + select HAVE_FUNCTION_GRAPH_FREGS
>> select HAVE_FUNCTION_GRAPH_TRACER
>> select HAVE_FUNCTION_TRACER if !COMPILE_TEST &&
>> (PPC64 || (PPC32 && CC_IS_GCC))
>> select HAVE_GCC_PLUGINS if GCC_VERSION >=
>> 50200 # plugin support on gcc <= 5.1 is buggy on PPC
>> diff --git a/arch/powerpc/include/asm/ftrace.h
>> b/arch/powerpc/include/asm/ftrace.h
>> index 82da7c7a1d12..6ffc9c9cf4e3 100644
>> --- a/arch/powerpc/include/asm/ftrace.h
>> +++ b/arch/powerpc/include/asm/ftrace.h
>> @@ -50,6 +50,21 @@ static __always_inline struct pt_regs
>> *arch_ftrace_get_regs(struct ftrace_regs *
>> asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
>> } while (0)
>>
>> +#undef ftrace_regs_get_return_value
>> +static __always_inline unsigned long
>> +ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
>> +{
>> + return arch_ftrace_regs(fregs)->regs.gpr[3];
>> +}
>> +#define ftrace_regs_get_return_value ftrace_regs_get_return_value
>> +
>> +#undef ftrace_regs_get_frame_pointer
>> +static __always_inline unsigned long
>> +ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
>> +{
>> + return arch_ftrace_regs(fregs)->regs.gpr[1];
>> +}
>> +
> Why unset and redefine ftrace_regs_get_return_value() and
> ftrace_regs_get_frame_pointer() ? Please explain why the default ones
> can't be used on powerpc.
>
Because for powerpc currently for ftrace_regs_get_return_value() this
function regs_return_value() is getting called and it's implementation
returns -regs.gpr[3] if is_syscall_success() returns false . This was
causing fails in ftrace selftests .
Also for ftrace_regs_get_frame_pointer() current implementation was
always returning 0 hence we had to change that too .
>> static __always_inline void
>> ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
>> unsigned long ip)
>> diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S
>> b/arch/powerpc/kernel/trace/ftrace_entry.S
>> index 3565c67fc638..eafbfb7584ed 100644
>> --- a/arch/powerpc/kernel/trace/ftrace_entry.S
>> +++ b/arch/powerpc/kernel/trace/ftrace_entry.S
>> @@ -409,23 +409,30 @@ EXPORT_SYMBOL(_mcount)
>> _GLOBAL(return_to_handler)
>> /* need to save return values */
>> #ifdef CONFIG_PPC64
>> - std r4, -32(r1)
>> - std r3, -24(r1)
>> + stdu r1, -SWITCH_FRAME_SIZE(r1)
>> + std r4, GPR4(r1)
>> + std r3, GPR3(r1)
>> + /* Save previous stack pointer (r1) */
>> + addi r3, r1, SWITCH_FRAME_SIZE
>> + std r3, GPR1(r1)
>> /* save TOC */
>> - std r2, -16(r1)
>> - std r31, -8(r1)
>> + std r2, 24(r1)
>> + std r31, 32(r1)
>> mr r31, r1
>> - stdu r1, -112(r1)
>> -
>> + /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
>> + addi r3, r1, STACK_INT_FRAME_REGS
>
> Some of the changes seems to only be renaming and should be done in a
> cleanup/preparatory patch in order to only focus on real necessary
> changes in this patch.
>
Now the way we are setting up the frame we cannot have negative offsets
, hence we used offsets which are defined already.
>> /*
>> * 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)
>> + stwu r1, -SWITCH_FRAME_SIZE(r1)
> Why do we need such a big frame size just to save two registers ?
>
This Frame size is needed because we need pt_regs as part of frame , are
you saying instead of SWITCH_FRAME_SIZE for 32 bit architecture we
should just setup a frame with size of pt_regs because ftrace_regs size
is same as pt_regs on ppc
>> + stw r4, GPR4(r1)
>> + stw r3, GPR3(r1)
>> + addi r3, r1, SWITCH_FRAME_SIZE
>> + stw r3, GPR1(r1)
> > + addi r3, r1, STACK_INT_FRAME_REGS
>
> Why is this needed ?
>
The function ftrace_return_to_handler takes pointer to pt_regs as
arguement so we are setting that up in stack and passing that pointer.
>> #endif
>>
>> bl ftrace_return_to_handler
>> @@ -435,15 +442,15 @@ _GLOBAL(return_to_handler)
>> 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)
>> + ld r4, GPR4(r1)
>> + ld r3, GPR3(r1)
>> + ld r2, 24(r1)
>> + ld r31, 32(r1)
>> + ld r1, 0(r1)
>> #else
>> - lwz r3, 8(r1)
>> - lwz r4, 12(r1)
>> - addi r1, r1, 16
>> + lwz r3, GPR3(r1)
>> + lwz r4, GPR4(r1)
>> + addi r1, r1, SWITCH_FRAME_SIZE
>> #endif
>>
>> /* Jump back to real return address */
>> --
>> 2.43.5
>>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
@ 2025-07-07 7:18 Aditya Bodkhe
2025-07-07 7:18 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
0 siblings, 1 reply; 8+ messages in thread
From: Aditya Bodkhe @ 2025-07-07 7:18 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Aditya Bodkhe
commit a1be9ccc57f0 ("function_graph: Support recording and printing the
return value of function") introduced support for function graph return
value tracing.
Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
ftrace_regs") further refactored and optimized the implementation,
making `struct fgraph_ret_regs` unnecessary.
This patch enables the above modifications for powerpc64, ensuring that
function graph return value tracing is available on this architecture.
After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
but there are a few other build and runtime dependencies for FPROBE to
work properly. The next patch addresses them.
Signed-off-by: Aditya Bodkhe <adityab1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/ftrace.h | 15 +++++++++
arch/powerpc/kernel/trace/ftrace_entry.S | 41 ++++++++++++++----------
3 files changed, 40 insertions(+), 17 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index c3e0cc83f120..9163521bc4b9 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -250,6 +250,7 @@ config PPC
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
select HAVE_FUNCTION_ERROR_INJECTION
+ select HAVE_FUNCTION_GRAPH_FREGS
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER if !COMPILE_TEST && (PPC64 || (PPC32 && CC_IS_GCC))
select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
index 82da7c7a1d12..6ffc9c9cf4e3 100644
--- a/arch/powerpc/include/asm/ftrace.h
+++ b/arch/powerpc/include/asm/ftrace.h
@@ -50,6 +50,21 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
} while (0)
+#undef ftrace_regs_get_return_value
+static __always_inline unsigned long
+ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[3];
+}
+#define ftrace_regs_get_return_value ftrace_regs_get_return_value
+
+#undef ftrace_regs_get_frame_pointer
+static __always_inline unsigned long
+ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[1];
+}
+
static __always_inline void
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
unsigned long ip)
diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
index 3565c67fc638..eafbfb7584ed 100644
--- a/arch/powerpc/kernel/trace/ftrace_entry.S
+++ b/arch/powerpc/kernel/trace/ftrace_entry.S
@@ -409,23 +409,30 @@ EXPORT_SYMBOL(_mcount)
_GLOBAL(return_to_handler)
/* need to save return values */
#ifdef CONFIG_PPC64
- std r4, -32(r1)
- std r3, -24(r1)
+ stdu r1, -SWITCH_FRAME_SIZE(r1)
+ std r4, GPR4(r1)
+ std r3, GPR3(r1)
+ /* Save previous stack pointer (r1) */
+ addi r3, r1, SWITCH_FRAME_SIZE
+ std r3, GPR1(r1)
/* save TOC */
- std r2, -16(r1)
- std r31, -8(r1)
+ std r2, 24(r1)
+ std r31, 32(r1)
mr r31, r1
- stdu r1, -112(r1)
-
+ /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
+ addi r3, r1, STACK_INT_FRAME_REGS
/*
* 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)
+ stwu r1, -SWITCH_FRAME_SIZE(r1)
+ stw r4, GPR4(r1)
+ stw r3, GPR3(r1)
+ addi r3, r1, SWITCH_FRAME_SIZE
+ stw r3, GPR1(r1)
+ addi r3, r1, STACK_INT_FRAME_REGS
#endif
bl ftrace_return_to_handler
@@ -435,15 +442,15 @@ _GLOBAL(return_to_handler)
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)
+ ld r4, GPR4(r1)
+ ld r3, GPR3(r1)
+ ld r2, 24(r1)
+ ld r31, 32(r1)
+ ld r1, 0(r1)
#else
- lwz r3, 8(r1)
- lwz r4, 12(r1)
- addi r1, r1, 16
+ lwz r3, GPR3(r1)
+ lwz r4, GPR4(r1)
+ addi r1, r1, SWITCH_FRAME_SIZE
#endif
/* Jump back to real return address */
--
2.50.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer
2025-07-07 7:18 Aditya Bodkhe
@ 2025-07-07 7:18 ` Aditya Bodkhe
0 siblings, 0 replies; 8+ messages in thread
From: Aditya Bodkhe @ 2025-07-07 7:18 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Hari Bathini,
Aditya Bodkhe
From: Hari Bathini <hbathini@linux.ibm.com>
Since commit 4346ba160409 ("fprobe: Rewrite fprobe on function-graph
tracer"), FPROBE depends on HAVE_FUNCTION_GRAPH_FREGS. With previous
patch adding HAVE_FUNCTION_GRAPH_FREGS for powerpc, FPROBE can be
enabled on powerpc. But with the commit b5fa903b7f7c ("fprobe: Add
fprobe_header encoding feature"), asm/fprobe.h header is needed to
define arch dependent encode/decode macros. The fprobe header MSB
pattern on powerpc is not 0xf. So, define FPROBE_HEADER_MSB_PATTERN
expected on powerpc.
Also, commit 762abbc0d09f ("fprobe: Use ftrace_regs in fprobe exit
handler") introduced HAVE_FTRACE_REGS_HAVING_PT_REGS for archs that
have pt_regs in ftrace_regs. Advertise that on powerpc to reuse
common definitions like ftrace_partial_regs().
Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Aditya Bodkhe <adityab1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/fprobe.h | 12 ++++++++++++
2 files changed, 13 insertions(+)
create mode 100644 arch/powerpc/include/asm/fprobe.h
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 9163521bc4b9..2203e4fb64c1 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -246,6 +246,7 @@ config PPC
select HAVE_EFFICIENT_UNALIGNED_ACCESS
select HAVE_GUP_FAST
select HAVE_FTRACE_GRAPH_FUNC
+ select HAVE_FTRACE_REGS_HAVING_PT_REGS
select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
diff --git a/arch/powerpc/include/asm/fprobe.h b/arch/powerpc/include/asm/fprobe.h
new file mode 100644
index 000000000000..d64bc28fb3d3
--- /dev/null
+++ b/arch/powerpc/include/asm/fprobe.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_PPC_FPROBE_H
+#define _ASM_PPC_FPROBE_H
+
+#include <asm-generic/fprobe.h>
+
+#ifdef CONFIG_64BIT
+#undef FPROBE_HEADER_MSB_PATTERN
+#define FPROBE_HEADER_MSB_PATTERN (PAGE_OFFSET & ~FPROBE_HEADER_MSB_MASK)
+#endif
+
+#endif /* _ASM_PPC_FPROBE_H */
--
2.50.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL
@ 2025-07-07 8:01 Aditya Bodkhe
2025-07-07 8:01 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
0 siblings, 1 reply; 8+ messages in thread
From: Aditya Bodkhe @ 2025-07-07 8:01 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Aditya Bodkhe
commit a1be9ccc57f0 ("function_graph: Support recording and printing the
return value of function") introduced support for function graph return
value tracing.
Additionally, commit a3ed4157b7d8 ("fgraph: Replace fgraph_ret_regs with
ftrace_regs") further refactored and optimized the implementation,
making `struct fgraph_ret_regs` unnecessary.
This patch enables the above modifications for powerpc all, ensuring that
function graph return value tracing is available on this architecture.
In this patch we have redefined two functions:
- 'ftrace_regs_get_return_value()' - the existing implementation on
ppc returns -ve of return value based on some conditions not
relevant to our patch.
- 'trace_regs_get_frame_pointer()' - always returns 0 in current code .
We also allocate stack space to equivalent of 'SWITCH_FRAME_SIZE',
allowing us to directly use predefined offsets like 'GPR3' and 'GPR4'
this keeps code clean and consistent with already defined offsets .
After this patch, v6.14+ kernel can also be built with FPROBE on powerpc
but there are a few other build and runtime dependencies for FPROBE to
work properly. The next patch addresses them.
Signed-off-by: Aditya Bodkhe <adityab1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/ftrace.h | 15 +++++++++
arch/powerpc/kernel/trace/ftrace_entry.S | 42 ++++++++++++++----------
3 files changed, 41 insertions(+), 17 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index c3e0cc83f120..9163521bc4b9 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -250,6 +250,7 @@ config PPC
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
select HAVE_FUNCTION_ERROR_INJECTION
+ select HAVE_FUNCTION_GRAPH_FREGS
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER if !COMPILE_TEST && (PPC64 || (PPC32 && CC_IS_GCC))
select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
index 82da7c7a1d12..6ffc9c9cf4e3 100644
--- a/arch/powerpc/include/asm/ftrace.h
+++ b/arch/powerpc/include/asm/ftrace.h
@@ -50,6 +50,21 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
} while (0)
+#undef ftrace_regs_get_return_value
+static __always_inline unsigned long
+ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[3];
+}
+#define ftrace_regs_get_return_value ftrace_regs_get_return_value
+
+#undef ftrace_regs_get_frame_pointer
+static __always_inline unsigned long
+ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
+{
+ return arch_ftrace_regs(fregs)->regs.gpr[1];
+}
+
static __always_inline void
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
unsigned long ip)
diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
index 3565c67fc638..d00272099add 100644
--- a/arch/powerpc/kernel/trace/ftrace_entry.S
+++ b/arch/powerpc/kernel/trace/ftrace_entry.S
@@ -409,23 +409,31 @@ EXPORT_SYMBOL(_mcount)
_GLOBAL(return_to_handler)
/* need to save return values */
#ifdef CONFIG_PPC64
- std r4, -32(r1)
- std r3, -24(r1)
+ stdu r1, -SWITCH_FRAME_SIZE(r1)
+ std r4, GPR4(r1)
+ std r3, GPR3(r1)
+ /* Save previous stack pointer (r1) */
+ addi r3, r1, SWITCH_FRAME_SIZE
+ std r3, GPR1(r1)
/* save TOC */
- std r2, -16(r1)
- std r31, -8(r1)
+ std r2, 24(r1)
+ std r31, 32(r1)
mr r31, r1
- stdu r1, -112(r1)
-
+ /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
+ addi r3, r1, STACK_INT_FRAME_REGS
/*
* 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)
+ stwu r1, -SWITCH_FRAME_SIZE(r1)
+ stw r4, GPR4(r1)
+ stw r3, GPR3(r1)
+ addi r3, r1, SWITCH_FRAME_SIZE
+ stw r3, GPR1(r1)
+ /* pass ftrace_regs/pt_regs to ftrace_return_to_handler */
+ addi r3, r1, STACK_INT_FRAME_REGS
#endif
bl ftrace_return_to_handler
@@ -435,15 +443,15 @@ _GLOBAL(return_to_handler)
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)
+ ld r4, GPR4(r1)
+ ld r3, GPR3(r1)
+ ld r2, 24(r1)
+ ld r31, 32(r1)
+ ld r1, 0(r1)
#else
- lwz r3, 8(r1)
- lwz r4, 12(r1)
- addi r1, r1, 16
+ lwz r3, GPR3(r1)
+ lwz r4, GPR4(r1)
+ addi r1, r1, SWITCH_FRAME_SIZE
#endif
/* Jump back to real return address */
--
2.50.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer
2025-07-07 8:01 [PATCH] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
@ 2025-07-07 8:01 ` Aditya Bodkhe
0 siblings, 0 replies; 8+ messages in thread
From: Aditya Bodkhe @ 2025-07-07 8:01 UTC (permalink / raw)
To: linuxppc-dev
Cc: linux-kernel, linux-trace-kernel, maddy, mpe, npiggin,
christophe.leroy, rostedt, mhiramat, mark.rutland, Hari Bathini,
Aditya Bodkhe
From: Hari Bathini <hbathini@linux.ibm.com>
Since commit 4346ba160409 ("fprobe: Rewrite fprobe on function-graph
tracer"), FPROBE depends on HAVE_FUNCTION_GRAPH_FREGS. With previous
patch adding HAVE_FUNCTION_GRAPH_FREGS for powerpc, FPROBE can be
enabled on powerpc. But with the commit b5fa903b7f7c ("fprobe: Add
fprobe_header encoding feature"), asm/fprobe.h header is needed to
define arch dependent encode/decode macros. The fprobe header MSB
pattern on powerpc is not 0xf. So, define FPROBE_HEADER_MSB_PATTERN
expected on powerpc.
Also, commit 762abbc0d09f ("fprobe: Use ftrace_regs in fprobe exit
handler") introduced HAVE_FTRACE_REGS_HAVING_PT_REGS for archs that
have pt_regs in ftrace_regs. Advertise that on powerpc to reuse
common definitions like ftrace_partial_regs().
Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Aditya Bodkhe <adityab1@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/fprobe.h | 12 ++++++++++++
2 files changed, 13 insertions(+)
create mode 100644 arch/powerpc/include/asm/fprobe.h
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 9163521bc4b9..2203e4fb64c1 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -246,6 +246,7 @@ config PPC
select HAVE_EFFICIENT_UNALIGNED_ACCESS
select HAVE_GUP_FAST
select HAVE_FTRACE_GRAPH_FUNC
+ select HAVE_FTRACE_REGS_HAVING_PT_REGS
select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_FUNCTION_ARG_ACCESS_API
select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1
diff --git a/arch/powerpc/include/asm/fprobe.h b/arch/powerpc/include/asm/fprobe.h
new file mode 100644
index 000000000000..d64bc28fb3d3
--- /dev/null
+++ b/arch/powerpc/include/asm/fprobe.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_PPC_FPROBE_H
+#define _ASM_PPC_FPROBE_H
+
+#include <asm-generic/fprobe.h>
+
+#ifdef CONFIG_64BIT
+#undef FPROBE_HEADER_MSB_PATTERN
+#define FPROBE_HEADER_MSB_PATTERN (PAGE_OFFSET & ~FPROBE_HEADER_MSB_MASK)
+#endif
+
+#endif /* _ASM_PPC_FPROBE_H */
--
2.50.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-07-07 8:02 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-28 13:48 [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
2025-05-28 13:48 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
2025-06-09 7:47 ` Masami Hiramatsu
2025-06-02 12:36 ` [PATCH 1/2] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Hari Bathini
2025-06-03 8:52 ` Christophe Leroy
2025-06-13 7:50 ` Aditya Bodkhe
-- strict thread matches above, loose matches on Subject: below --
2025-07-07 7:18 Aditya Bodkhe
2025-07-07 7:18 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
2025-07-07 8:01 [PATCH] powerpc/ftrace: support CONFIG_FUNCTION_GRAPH_RETVAL Aditya Bodkhe
2025-07-07 8:01 ` [PATCH 2/2] powerpc/fprobe: fix updated fprobe for function-graph tracer Aditya Bodkhe
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.