All of lore.kernel.org
 help / color / mirror / Atom feed
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>, Alexei Starovoitov <ast@kernel.org>,
	Jiri Olsa <jolsa@kernel.org>,
	Alan Maguire <alan.maguire@oracle.com>,
	Mark Rutland <mark.rutland@arm.com>,
	linux-arch@vger.kernel.org
Subject: [PATCH v18 17/17] bpf: Add get_entry_ip() for arm64
Date: Sat, 26 Oct 2024 13:38:57 +0900	[thread overview]
Message-ID: <172991753721.443985.6962319676929775642.stgit@devnote2> (raw)
In-Reply-To: <172991731968.443985.4558065903004844780.stgit@devnote2>

From: Masami Hiramatsu (Google) <mhiramat@kernel.org>

Add get_entry_ip() implementation for arm64. This is based on the
information in ftrace_call_adjust() on arm64. Basically function entry
address = ftrace call entry_ip - 4, but when there is a BTI at the first
instruction, we need one more instruction back (entry_ip - 8.)

Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
 kernel/trace/bpf_trace.c |   64 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 1532e9172bf9..d58d1417cbaa 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -1042,6 +1042,70 @@ static unsigned long get_entry_ip(unsigned long fentry_ip)
 		fentry_ip -= ENDBR_INSN_SIZE;
 	return fentry_ip;
 }
+#elif defined(CONFIG_ARM64)
+#include <asm/insn.h>
+
+static unsigned long get_entry_ip(unsigned long fentry_ip)
+{
+	u32 insn;
+
+	/*
+	 * When using patchable-function-entry without pre-function NOPS, ftrace
+	 * entry is the address of the first NOP after the function entry point.
+	 *
+	 * The compiler has either generated:
+	 *
+	 * func+00:	func:	NOP		// To be patched to MOV X9, LR
+	 * func+04:		NOP		// To be patched to BL <caller>
+	 *
+	 * Or:
+	 *
+	 * func-04:		BTI	C
+	 * func+00:	func:	NOP		// To be patched to MOV X9, LR
+	 * func+04:		NOP		// To be patched to BL <caller>
+	 *
+	 * The fentry_ip is the address of `BL <caller>` which is at `func + 4`
+	 * bytes in either case.
+	 */
+	if (!IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS))
+		return fentry_ip - AARCH64_INSN_SIZE;
+
+	/*
+	 * When using patchable-function-entry with pre-function NOPs, BTI is
+	 * a bit different.
+	 *
+	 * func+00:	func:	NOP		// To be patched to MOV X9, LR
+	 * func+04:		NOP		// To be patched to BL <caller>
+	 *
+	 * Or:
+	 *
+	 * func+00:	func:	BTI	C
+	 * func+04:		NOP		// To be patched to MOV X9, LR
+	 * func+08:		NOP		// To be patched to BL <caller>
+	 *
+	 * The fentry_ip is the address of `BL <caller>` which is at either
+	 * `func + 4` or `func + 8` depends on whether there is a BTI.
+	 */
+
+	/* If there is no BTI, the func address should be one instruction before. */
+	if (!IS_ENABLED(CONFIG_ARM64_BTI_KERNEL))
+		return fentry_ip - AARCH64_INSN_SIZE;
+
+	/* We want to be extra safe in case entry ip is on the page edge,
+	 * but otherwise we need to avoid get_kernel_nofault()'s overhead.
+	 */
+	if ((fentry_ip & ~PAGE_MASK) < AARCH64_INSN_SIZE * 2) {
+		if (get_kernel_nofault(insn, (u32 *)(fentry_ip - AARCH64_INSN_SIZE * 2)))
+			return fentry_ip - AARCH64_INSN_SIZE;
+	} else {
+		insn = *(u32 *)(fentry_ip - AARCH64_INSN_SIZE * 2);
+	}
+
+	if (aarch64_insn_is_bti(le32_to_cpu((__le32)insn)))
+		return fentry_ip - AARCH64_INSN_SIZE * 2;
+
+	return fentry_ip - AARCH64_INSN_SIZE;
+}
 #else
 #define get_entry_ip(fentry_ip) fentry_ip
 #endif


  parent reply	other threads:[~2024-10-26  4:39 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-26  4:35 [PATCH v18 00/17] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Masami Hiramatsu (Google)
2024-10-26  4:35 ` [PATCH v18 01/17] fgraph: Pass ftrace_regs to entryfunc Masami Hiramatsu (Google)
2024-10-28 15:25   ` Will Deacon
2024-10-31  1:18     ` Masami Hiramatsu
2024-10-31 19:53   ` Steven Rostedt
2024-11-01  1:51     ` Masami Hiramatsu
2024-11-01 10:50       ` Steven Rostedt
2024-11-09 14:24         ` Masami Hiramatsu
2024-11-09 14:47     ` Masami Hiramatsu
2024-10-26  4:35 ` [PATCH v18 02/17] fgraph: Replace fgraph_ret_regs with ftrace_regs Masami Hiramatsu (Google)
2024-10-28 15:26   ` Will Deacon
2024-10-26  4:36 ` [PATCH v18 03/17] fgraph: Pass ftrace_regs to retfunc Masami Hiramatsu (Google)
2024-10-26  4:36 ` [PATCH v18 04/17] fprobe: Use ftrace_regs in fprobe entry handler Masami Hiramatsu (Google)
2024-10-26  4:36 ` [PATCH v18 05/17] fprobe: Use ftrace_regs in fprobe exit handler Masami Hiramatsu (Google)
2024-10-26  4:36 ` [PATCH v18 06/17] tracing: Add ftrace_partial_regs() for converting ftrace_regs to pt_regs Masami Hiramatsu (Google)
2024-10-28 15:27   ` Will Deacon
2024-10-26  4:36 ` [PATCH v18 07/17] tracing: Add ftrace_fill_perf_regs() for perf event Masami Hiramatsu (Google)
2024-10-26  4:37 ` [PATCH v18 08/17] tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS Masami Hiramatsu (Google)
2024-10-26  4:37 ` [PATCH v18 09/17] bpf: Enable kprobe_multi feature if CONFIG_FPROBE is enabled Masami Hiramatsu (Google)
2024-10-26  4:37 ` [PATCH v18 10/17] ftrace: Add CONFIG_HAVE_FTRACE_GRAPH_FUNC Masami Hiramatsu (Google)
2024-10-26  4:37 ` [PATCH v18 11/17] fprobe: Rewrite fprobe on function-graph tracer Masami Hiramatsu (Google)
2024-11-01 19:28   ` Steven Rostedt
2024-11-09 14:55     ` Masami Hiramatsu
2024-10-26  4:37 ` [PATCH v18 12/17] fprobe: Add fprobe_header encoding feature Masami Hiramatsu (Google)
2024-11-01 14:22   ` Steven Rostedt
2024-11-09 15:10     ` Masami Hiramatsu
2024-11-12 14:44       ` Steven Rostedt
2024-11-12 23:43         ` Masami Hiramatsu
2024-10-26  4:38 ` [PATCH v18 13/17] tracing/fprobe: Remove nr_maxactive from fprobe Masami Hiramatsu (Google)
2024-10-26  4:38 ` [PATCH v18 14/17] selftests: ftrace: Remove obsolate maxactive syntax check Masami Hiramatsu (Google)
2024-10-26  4:38 ` [PATCH v18 15/17] selftests/ftrace: Add a test case for repeating register/unregister fprobe Masami Hiramatsu (Google)
2024-10-26  4:38 ` [PATCH v18 16/17] Documentation: probes: Update fprobe on function-graph tracer Masami Hiramatsu (Google)
2024-11-01 14:14   ` Steven Rostedt
2024-11-12 23:48     ` Masami Hiramatsu
2024-10-26  4:38 ` Masami Hiramatsu (Google) [this message]
2024-10-28  8:27 ` [PATCH 0/1] s390: enable HAVE_FTRACE_GRAPH_FUNC Sven Schnelle
2024-10-31  1:20   ` Masami Hiramatsu
2024-10-28  8:27 ` [PATCH 1/1] s390/tracing: Enable HAVE_FTRACE_GRAPH_FUNC Sven Schnelle
     [not found] ` <c660e1e2554e242da1802d026566cbad7b96f88512f12722bb49631088e4f3f2@mail.kernel.org>
     [not found]   ` <20241031102519.63a600899278437fba931f90@kernel.org>
2024-10-31  2:49     ` [PATCH v18 00/17] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Daniel Xu

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=172991753721.443985.6962319676929775642.stgit@devnote2 \
    --to=mhiramat@kernel.org \
    --cc=alan.maguire@oracle.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=jolsa@kernel.org \
    --cc=linux-arch@vger.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=revest@chromium.org \
    --cc=rostedt@goodmis.org \
    /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.