From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Florent Revest <revest@chromium.org>
Cc: linux-trace-kernel@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
bpf <bpf@vger.kernel.org>, Sven Schnelle <svens@linux.ibm.com>,
Alexei Starovoitov <ast@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Alan Maguire <alan.maguire@oracle.com>,
Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>, Guo Ren <guoren@kernel.org>
Subject: [RFC PATCH 28/32] tracing: Add ftrace_fill_perf_regs() for perf event
Date: Mon, 6 Nov 2023 01:12:10 +0900 [thread overview]
Message-ID: <169920072976.482486.9502671314956022881.stgit@devnote2> (raw)
In-Reply-To: <169920038849.482486.15796387219966662967.stgit@devnote2>
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Add ftrace_fill_perf_regs() which should be compatible with the
perf_fetch_caller_regs(). In other words, the pt_regs returned from the
ftrace_fill_perf_regs() must satisfy 'user_mode(regs) == false' and can be
used for stack tracing.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
Changes from previous series: NOTHING, just forward ported.
---
arch/arm64/include/asm/ftrace.h | 7 +++++++
arch/powerpc/include/asm/ftrace.h | 7 +++++++
arch/s390/include/asm/ftrace.h | 5 +++++
arch/x86/include/asm/ftrace.h | 7 +++++++
include/linux/ftrace.h | 31 +++++++++++++++++++++++++++++++
5 files changed, 57 insertions(+)
diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h
index 5ad24f315d52..5fbe8fe3e8a5 100644
--- a/arch/arm64/include/asm/ftrace.h
+++ b/arch/arm64/include/asm/ftrace.h
@@ -148,6 +148,13 @@ ftrace_partial_regs(const struct ftrace_regs *fregs, struct pt_regs *regs)
return regs;
}
+#define arch_ftrace_fill_perf_regs(fregs, _regs) do { \
+ (_regs)->pc = (fregs)->pc; \
+ (_regs)->regs[29] = (fregs)->fp; \
+ (_regs)->sp = (fregs)->sp; \
+ (_regs)->pstate = PSR_MODE_EL1h; \
+ } while (0)
+
int ftrace_regs_query_register_offset(const char *name);
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
index 9e5a39b6a311..53fa39ef476b 100644
--- a/arch/powerpc/include/asm/ftrace.h
+++ b/arch/powerpc/include/asm/ftrace.h
@@ -52,6 +52,13 @@ static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *
return fregs->regs.msr ? &fregs->regs : NULL;
}
+#define arch_ftrace_fill_perf_regs(fregs, _regs) do { \
+ (_regs)->result = 0; \
+ (_regs)->nip = (fregs)->regs.nip; \
+ (_regs)->gpr[1] = (fregs)->regs.gpr[1]; \
+ asm volatile("mfmsr %0" : "=r" ((_regs)->msr)); \
+ } while (0)
+
static __always_inline void
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
unsigned long ip)
diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
index 5a82b08f03cd..f36ee3510af8 100644
--- a/arch/s390/include/asm/ftrace.h
+++ b/arch/s390/include/asm/ftrace.h
@@ -97,6 +97,11 @@ ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
#define ftrace_regs_query_register_offset(name) \
regs_query_register_offset(name)
+#define arch_ftrace_fill_perf_regs(fregs, _regs) do { \
+ (_regs)->psw.addr = (fregs)->regs.psw.addr; \
+ (_regs)->gprs[15] = (fregs)->regs.gprs[15]; \
+ } while (0)
+
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
/*
* When an ftrace registered caller is tracing a function that is
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h
index 74b1d245c38b..66e7d2df7916 100644
--- a/arch/x86/include/asm/ftrace.h
+++ b/arch/x86/include/asm/ftrace.h
@@ -48,6 +48,13 @@ arch_ftrace_get_regs(struct ftrace_regs *fregs)
return &fregs->regs;
}
+#define arch_ftrace_fill_perf_regs(fregs, _regs) do { \
+ (_regs)->ip = (fregs)->regs.ip; \
+ (_regs)->sp = (fregs)->regs.sp; \
+ (_regs)->cs = __KERNEL_CS; \
+ (_regs)->flags = 0; \
+ } while (0)
+
#define ftrace_regs_set_instruction_pointer(fregs, _ip) \
do { (fregs)->regs.ip = (_ip); } while (0)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 3d0ff6e2c4bf..7db38341bc9e 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -164,6 +164,37 @@ ftrace_partial_regs(struct ftrace_regs *fregs, struct pt_regs *regs)
#endif /* !CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS || CONFIG_HAVE_PT_REGS_TO_FTRACE_REGS_CAST */
+#ifdef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
+
+/*
+ * Please define arch dependent pt_regs which compatible to the
+ * perf_arch_fetch_caller_regs() but based on ftrace_regs.
+ * This requires
+ * - user_mode(_regs) returns false (always kernel mode).
+ * - able to use the _regs for stack trace.
+ */
+#ifndef arch_ftrace_fill_perf_regs
+/* As same as perf_arch_fetch_caller_regs(), do nothing by default */
+#define arch_ftrace_fill_perf_regs(fregs, _regs) do {} while (0)
+#endif
+
+static __always_inline struct pt_regs *
+ftrace_fill_perf_regs(struct ftrace_regs *fregs, struct pt_regs *regs)
+{
+ arch_ftrace_fill_perf_regs(fregs, regs);
+ return regs;
+}
+
+#else /* !CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS */
+
+static __always_inline struct pt_regs *
+ftrace_fill_perf_regs(struct ftrace_regs *fregs, struct pt_regs *regs)
+{
+ return &fregs->regs;
+}
+
+#endif
+
/*
* When true, the ftrace_regs_{get,set}_*() functions may be used on fregs.
* Note: this can be true even when ftrace_get_regs() cannot provide a pt_regs.
next prev parent reply other threads:[~2023-11-05 16:12 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-05 16:06 [RFC PATCH 00/32] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Masami Hiramatsu (Google)
2023-11-05 16:06 ` [RFC PATCH 01/32] seq_buf: Export seq_buf_puts() Masami Hiramatsu (Google)
2023-11-05 16:06 ` [RFC PATCH 02/32] function_graph: Convert ret_stack to a series of longs Masami Hiramatsu (Google)
2023-11-05 16:07 ` [RFC PATCH 03/32] fgraph: Use BUILD_BUG_ON() to make sure we have structures divisible by long Masami Hiramatsu (Google)
2023-11-05 16:07 ` [RFC PATCH 04/32] function_graph: Add an array structure that will allow multiple callbacks Masami Hiramatsu (Google)
2023-11-05 16:07 ` [RFC PATCH 05/32] function_graph: Allow multiple users to attach to function graph Masami Hiramatsu (Google)
2023-11-05 16:07 ` [RFC PATCH 06/32] function_graph: Remove logic around ftrace_graph_entry and return Masami Hiramatsu (Google)
2023-11-05 16:07 ` [RFC PATCH 07/32] ftrace/function_graph: Pass fgraph_ops to function graph callbacks Masami Hiramatsu (Google)
2023-11-05 16:08 ` [RFC PATCH 08/32] ftrace: Allow function_graph tracer to be enabled in instances Masami Hiramatsu (Google)
2023-11-05 16:08 ` [RFC PATCH 09/32] ftrace: Allow ftrace startup flags exist without dynamic ftrace Masami Hiramatsu (Google)
2023-11-05 16:08 ` [RFC PATCH 10/32] function_graph: Have the instances use their own ftrace_ops for filtering Masami Hiramatsu (Google)
2023-11-07 1:47 ` Masami Hiramatsu
2023-11-05 16:08 ` [RFC PATCH 11/32] function_graph: Add "task variables" per task for fgraph_ops Masami Hiramatsu (Google)
2023-11-05 16:08 ` [RFC PATCH 12/32] function_graph: Move set_graph_function tests to shadow stack global var Masami Hiramatsu (Google)
2023-11-05 16:09 ` [RFC PATCH 13/32] function_graph: Move graph depth stored data " Masami Hiramatsu (Google)
2023-11-05 16:09 ` [RFC PATCH 14/32] function_graph: Move graph notrace bit " Masami Hiramatsu (Google)
2023-11-05 16:09 ` [RFC PATCH 15/32] function_graph: Implement fgraph_reserve_data() and fgraph_retrieve_data() Masami Hiramatsu (Google)
2023-11-05 16:09 ` [RFC PATCH 16/32] function_graph: Add selftest for passing local variables Masami Hiramatsu (Google)
2023-11-05 16:09 ` [RFC PATCH 17/32] function_graph: Fix to update curr_ret_stack with ARRAY entry size Masami Hiramatsu (Google)
2023-11-05 16:10 ` [RFC PATCH 18/32] function_graph: Fix to initalize ftrace_ops for fgraph with ftrace_graph_func Masami Hiramatsu (Google)
2023-11-06 10:04 ` Masami Hiramatsu
2023-11-07 1:49 ` Masami Hiramatsu
2023-11-07 3:07 ` Steven Rostedt
2023-11-05 16:10 ` [RFC PATCH 19/32] function_graph: Fix to check the return value of ftrace_pop_return_trace() Masami Hiramatsu (Google)
2023-11-05 16:10 ` [RFC PATCH 20/32] function_graph: Pass the size of reserved data when retrieving it Masami Hiramatsu (Google)
2023-11-05 16:10 ` [RFC PATCH 21/32] function_graph: Expand the max reserved data size Masami Hiramatsu (Google)
2023-11-05 16:10 ` [RFC PATCH 22/32] function_graph: Add a new entry handler with parent_ip and ftrace_regs Masami Hiramatsu (Google)
2023-11-05 16:11 ` [RFC PATCH 23/32] function_graph: Add a new exit " Masami Hiramatsu (Google)
2023-11-05 16:11 ` [RFC PATCH 24/32] x86/ftrace: Enable HAVE_FUNCTION_GRAPH_FREGS Masami Hiramatsu (Google)
2023-11-05 17:25 ` Peter Zijlstra
2023-11-05 19:11 ` Steven Rostedt
2023-11-05 21:28 ` Steven Rostedt
2023-11-05 23:17 ` Peter Zijlstra
2023-11-05 23:33 ` Steven Rostedt
2023-11-05 23:34 ` Steven Rostedt
2023-11-06 0:38 ` Masami Hiramatsu
2023-11-06 10:19 ` Peter Zijlstra
2023-11-06 12:47 ` Masami Hiramatsu
2023-11-06 12:52 ` Peter Zijlstra
2023-11-06 1:05 ` Masami Hiramatsu
2023-11-06 16:37 ` Steven Rostedt
2023-11-07 0:42 ` Masami Hiramatsu
2023-11-07 3:06 ` Steven Rostedt
2023-11-07 5:43 ` Masami Hiramatsu
2023-11-07 13:48 ` Steven Rostedt
2023-11-07 14:09 ` Steven Rostedt
2023-11-05 16:11 ` [RFC PATCH 25/32] fprobe: Use ftrace_regs in fprobe entry handler Masami Hiramatsu (Google)
2023-11-05 16:11 ` [RFC PATCH 26/32] fprobe: Use ftrace_regs in fprobe exit handler Masami Hiramatsu (Google)
2023-11-05 16:11 ` [RFC PATCH 27/32] tracing: Add ftrace_partial_regs() for converting ftrace_regs to pt_regs Masami Hiramatsu (Google)
2023-11-05 16:12 ` Masami Hiramatsu (Google) [this message]
2023-11-05 16:12 ` [RFC PATCH 29/32] fprobe: Rewrite fprobe on function-graph tracer Masami Hiramatsu (Google)
2023-11-05 16:12 ` [RFC PATCH 30/32] tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS Masami Hiramatsu (Google)
2023-11-05 16:12 ` [RFC PATCH 31/32] bpf: Enable kprobe_multi feature if CONFIG_FPROBE is enabled Masami Hiramatsu (Google)
2023-11-05 16:12 ` [RFC PATCH 32/32] Documentation: probes: Update fprobe on function-graph tracer Masami Hiramatsu (Google)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=169920072976.482486.9502671314956022881.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=guoren@kernel.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=peterz@infradead.org \
--cc=revest@chromium.org \
--cc=rostedt@goodmis.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.