+++ /dev/null
-From 0e253f7e558a3e250902ba2034091e0185448836 Mon Sep 17 00:00:00 2001
-From: Jiri Olsa <jolsa@kernel.org>
-Date: Mon, 26 Sep 2022 17:33:39 +0200
-Subject: bpf: Return value in kprobe get_func_ip only for entry address
-
-From: Jiri Olsa <jolsa@kernel.org>
-
-commit 0e253f7e558a3e250902ba2034091e0185448836 upstream.
-
-Changing return value of kprobe's version of bpf_get_func_ip
-to return zero if the attach address is not on the function's
-entry point.
-
-For kprobes attached in the middle of the function we can't easily
-get to the function address especially now with the CONFIG_X86_KERNEL_IBT
-support.
-
-If user cares about current IP for kprobes attached within the
-function body, they can get it with PT_REGS_IP(ctx).
-
-Suggested-by: Andrii Nakryiko <andrii@kernel.org>
-Acked-by: Andrii Nakryiko <andrii@kernel.org>
-Acked-by: Martynas Pumputis <m@lambda.lt>
-Signed-off-by: Jiri Olsa <jolsa@kernel.org>
-Link: https://lore.kernel.org/r/20220926153340.1621984-6-jolsa@kernel.org
-Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-Cc: Jonas Rabenstein <rabenstein@cs.fau.de>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- include/uapi/linux/bpf.h | 1 +
- kernel/trace/bpf_trace.c | 5 ++++-
- tools/include/uapi/linux/bpf.h | 1 +
- tools/testing/selftests/bpf/progs/get_func_ip_test.c | 4 ++--
- 4 files changed, 8 insertions(+), 3 deletions(-)
-
---- a/include/uapi/linux/bpf.h
-+++ b/include/uapi/linux/bpf.h
-@@ -4922,6 +4922,7 @@ union bpf_attr {
- * Get address of the traced function (for tracing and kprobe programs).
- * Return
- * Address of the traced function.
-+ * 0 for kprobes placed within the function (not at the entry).
- *
- * u64 bpf_get_attach_cookie(void *ctx)
- * Description
---- a/kernel/trace/bpf_trace.c
-+++ b/kernel/trace/bpf_trace.c
-@@ -1046,7 +1046,10 @@ BPF_CALL_1(bpf_get_func_ip_kprobe, struc
- {
- struct kprobe *kp = kprobe_running();
-
-- return kp ? (uintptr_t)kp->addr : 0;
-+ if (!kp || !(kp->flags & KPROBE_FLAG_ON_FUNC_ENTRY))
-+ return 0;
-+
-+ return get_entry_ip((uintptr_t)kp->addr);
- }
-
- static const struct bpf_func_proto bpf_get_func_ip_proto_kprobe = {
---- a/tools/include/uapi/linux/bpf.h
-+++ b/tools/include/uapi/linux/bpf.h
-@@ -4922,6 +4922,7 @@ union bpf_attr {
- * Get address of the traced function (for tracing and kprobe programs).
- * Return
- * Address of the traced function.
-+ * 0 for kprobes placed within the function (not at the entry).
- *
- * u64 bpf_get_attach_cookie(void *ctx)
- * Description
---- a/tools/testing/selftests/bpf/progs/get_func_ip_test.c
-+++ b/tools/testing/selftests/bpf/progs/get_func_ip_test.c
-@@ -69,7 +69,7 @@ int test6(struct pt_regs *ctx)
- {
- __u64 addr = bpf_get_func_ip(ctx);
-
-- test6_result = (const void *) addr == &bpf_fentry_test6 + 5;
-+ test6_result = (const void *) addr == 0;
- return 0;
- }
-
-@@ -79,6 +79,6 @@ int test7(struct pt_regs *ctx)
- {
- __u64 addr = bpf_get_func_ip(ctx);
-
-- test7_result = (const void *) addr == &bpf_fentry_test7 + 5;
-+ test7_result = (const void *) addr == 0;
- return 0;
- }