From nobody Tue Dec 16 21:25:05 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A74B42288E3; Mon, 8 Sep 2025 12:13:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333612; cv=none; b=eFmjVslKUoBw4ZCX66qpOVs44Y+17zk1yM0o86FlAFPPZwcDmNqon1ZObCuGUlMJ72o0sISJljcEKy3jGuyLTXfBDwhGwm1agQwE+Jlq2h4id9OJ+sjqaSki5hiZSpucYRTmOW+LrKWV2NHErbNL3RdkRfOPW66pOVZb8k9mtHE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333612; c=relaxed/simple; bh=TwNZjXgz2JRkVlwNdJF9RElMCC/ODJjFB3Q+jBg+QAw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iawfDIjTynsUEexvPCRIlYMHlwmXGCyiSxT8vXEWZxi7Fq44SIjyxd4+Hj+m+4FTpLCQPETnNJFq0Jy/SF3r6Wc9OjVCN0Jo0BjmOQ3oN+1GfGK3Mn0VyWXzA5FUpq6nFx4Al9mfdubWXIT4evpFI2+k+0OvykkFH7L0UpuYiE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OILdliMd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OILdliMd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5993C4CEF1; Mon, 8 Sep 2025 12:13:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757333612; bh=TwNZjXgz2JRkVlwNdJF9RElMCC/ODJjFB3Q+jBg+QAw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OILdliMdOuTpG6gquwrBCoJV+APpwLrnf99xbLG0jNCXy9797GBqfVaRR77ah1MV5 bSST2h3O+uegk68Jb9izrDDz1QTChSKkfnqNkJQjdVQkKoU5r3FBAqEPtdbfBpxIUm zjW2wQV6kUVy5wmC5mlH06MYEIXJN8KRw5Sosmbys8hKCC1A0SXTxOs2deQc3K/e1i CBP+ECNcaKTviMr5EV0fCxQ42tc+qV4hOIfoSakRJSn2nLP8n85Y2CKjcIJ28RoMDb IEO9dbxnl6jnswwePM/43mEj2Y1kxqVBqPp71h+eyRJLGZF1G2sXYmwhdJIqtNrEBo /pX/BqZgSIbjQ== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCHv2 perf/core 1/4] bpf: Allow uprobe program to change context registers Date: Mon, 8 Sep 2025 14:13:07 +0200 Message-ID: <20250908121310.46824-2-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250908121310.46824-1-jolsa@kernel.org> References: <20250908121310.46824-1-jolsa@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently uprobe (BPF_PROG_TYPE_KPROBE) program can't write to the context registers data. While this makes sense for kprobe attachments, for uprobe attachment it might make sense to be able to change user space registers to alter application execution. Since uprobe and kprobe programs share the same type (BPF_PROG_TYPE_KPROBE), we can't deny write access to context during the program load. We need to check on it during program attachment to see if it's going to be kprobe or uprobe. Storing the program's write attempt to context and checking on it during the attachment. Signed-off-by: Jiri Olsa --- include/linux/bpf.h | 1 + kernel/events/core.c | 4 ++++ kernel/trace/bpf_trace.c | 3 +-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index cc700925b802..404a30cde84e 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1619,6 +1619,7 @@ struct bpf_prog_aux { bool priv_stack_requested; bool changes_pkt_data; bool might_sleep; + bool kprobe_write_ctx; u64 prog_array_member_cnt; /* counts how many times as member of prog_arr= ay */ struct mutex ext_mutex; /* mutex for is_extended and prog_array_member_cn= t */ struct bpf_arena *arena; diff --git a/kernel/events/core.c b/kernel/events/core.c index 28de3baff792..c3f37b266fc4 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -11238,6 +11238,10 @@ static int __perf_event_set_bpf_prog(struct perf_e= vent *event, if (prog->kprobe_override && !is_kprobe) return -EINVAL; =20 + /* Writing to context allowed only for uprobes. */ + if (prog->aux->kprobe_write_ctx && !is_uprobe) + return -EINVAL; + if (is_tracepoint || is_syscall_tp) { int off =3D trace_event_get_offsets(event->tp_event); =20 diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 3ae52978cae6..467fd5ab4b79 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1521,8 +1521,6 @@ static bool kprobe_prog_is_valid_access(int off, int = size, enum bpf_access_type { if (off < 0 || off >=3D sizeof(struct pt_regs)) return false; - if (type !=3D BPF_READ) - return false; if (off % size !=3D 0) return false; /* @@ -1532,6 +1530,7 @@ static bool kprobe_prog_is_valid_access(int off, int = size, enum bpf_access_type if (off + size > sizeof(struct pt_regs)) return false; =20 + prog->aux->kprobe_write_ctx |=3D type =3D=3D BPF_WRITE; return true; } =20 --=20 2.51.0 From nobody Tue Dec 16 21:25:05 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D83AE552; Mon, 8 Sep 2025 12:13:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333623; cv=none; b=GqvO58TT/rodrLnt29O4HpdsraxtdoG8aADFZe4YvxAKTAVWKT2dTObiMbcfATd9LQ0Hdcsv29GhK15uoi0BaK6/Fkodbr0aqmUvEtkDqJZymW8bcFqiAF1+poMyqElaDqwgtfZvxRoJUIQg6oxQ2MCmR1LMf21c/mrEat6rhBA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333623; c=relaxed/simple; bh=6o24WB91e3G+pc7ZE6bwHLiyBlIwSK5wzIAI8siJQn0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZMbHH3noXk5YmaqoWE4PwGLyPNFQPhx/bDyTWsasjsOrad+mWm0Wo8PGJkeq3/UZd+g7ZvwUnEkLcowZDY3Vskf1PS8iLdSQPLKZX0ycba7+tAw2rGl5V9CyHkyu5gTExOYF/w1nZi8BR6ot6eadxTZ7jackG6yG1amBclyKebk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=I1GOkfrj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="I1GOkfrj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AA623C4CEF1; Mon, 8 Sep 2025 12:13:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757333623; bh=6o24WB91e3G+pc7ZE6bwHLiyBlIwSK5wzIAI8siJQn0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=I1GOkfrj/eb9ZfTIP652r8BhsUumox2CSBjpkL/Tyvj6Q/4WAZieEWfublTBNEGbc oyMMkyYJNDquIM3CF2lwhqU2T3J5OKMFmmdFrf6RMDK5cBtGThPBlIE/mEtLHJ3Ray fmGzcTpCiAwpPozG5BoA704YD0GKw7N+Pr41IJENMuG96Er8dXcSNaephQRN1Vwh8z iqOrlcKY6MSbeP9hLeYJbRD4Hu42JoUYSxp2TCBn0rX+uYKXOrVl6JZ7COqDtMXJXQ rFuQsGn6sCcEatNCnBFac3fSTR+4Rn2oCdNLjl06vprr9OzYtnTuwNj9IOE0DYA0PO QVD8gwJiQxDxw== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCHv2 perf/core 2/4] uprobe: Do not emulate/sstep original instruction when ip is changed Date: Mon, 8 Sep 2025 14:13:08 +0200 Message-ID: <20250908121310.46824-3-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250908121310.46824-1-jolsa@kernel.org> References: <20250908121310.46824-1-jolsa@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If uprobe handler changes instruction pointer we still execute single step) or emulate the original instruction and increment the (new) ip with its length. This makes the new instruction pointer bogus and application will likely crash on illegal instruction execution. If user decided to take execution elsewhere, it makes little sense to execute the original instruction, so let's skip it. Signed-off-by: Jiri Olsa Acked-by: Oleg Nesterov --- kernel/events/uprobes.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 996a81080d56..4f46018e507e 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -2768,6 +2768,13 @@ static void handle_swbp(struct pt_regs *regs) /* Try to optimize after first hit. */ arch_uprobe_optimize(&uprobe->arch, bp_vaddr); =20 + /* + * If user decided to take execution elsewhere, it makes little sense + * to execute the original instruction, so let's skip it. + */ + if (instruction_pointer(regs) !=3D bp_vaddr) + goto out; + if (arch_uprobe_skip_sstep(&uprobe->arch, regs)) goto out; =20 --=20 2.51.0 From nobody Tue Dec 16 21:25:05 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72A7AE552; Mon, 8 Sep 2025 12:13:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333634; cv=none; b=r067d2DitxM5XIA2olGAjgvAjFgNnl9ZpJPN4OsnyxLCWApKQvVc3xFArwfYPU61l0CJdPXHj4FjuMR6+BF87t0HCYb3ZeziJch6EFomyPg5tx7rpRgGtSPaRd3mSV65kKU1ScLOrfrttNpnpGrMhgQAK3h8xNWZaqM9oAEEs8g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333634; c=relaxed/simple; bh=3NANpKXl+pfp3BrIntDBj/EVTt9o2TzdBlkEWj5GkFY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ntRDVdQ8IoaZwpvuCw7FZfQScw2S6GtnXN3oXHvW1lT+4L1hvi+9P6pk9dlbwxK5NUOQfvW9pUVPMtV8Jr8AnKV4trz4G6Uwqa7QKiQYHBM5mIBBaVilC+BS2n8p8Q5lA/Xm4qDGs8+/bVBnQTHBvB5w8Xod9+mWYWt8gll2Ppg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uYTYimiT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uYTYimiT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B960C4CEF1; Mon, 8 Sep 2025 12:13:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757333634; bh=3NANpKXl+pfp3BrIntDBj/EVTt9o2TzdBlkEWj5GkFY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uYTYimiTjHSbdiJOJkADemdOKy/gS0G+yiBtjAGY7+bi41x1Ls2/rAR8O8IFnn0B8 6H5MlxjQ8nrQD4fZI9tzVrX03mFaOUrYFe4v3MiLVFZqUIbr95GGnlMQFzRqDLusO2 wEhaZG00T1etgtWXwySOpftlmRoSvi4JU1dQSmJvwK5BNgPkSEkERt4ZezG7R6400I 5RvSS8GAkPh7vdDeZnlHSJuZftSMz+DGQFKdgIAAFTHBhQBEyHE0WNksLF8wQdqstX 34drD48gisu4c0zKmOtsbBJlkNQwmruFCl6iqcqsMFjkwmcv9BwVYAHbJuYf6GC2OO wwbsXEREW0BLg== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCHv2 perf/core 3/4] selftests/bpf: Add uprobe context registers changes test Date: Mon, 8 Sep 2025 14:13:09 +0200 Message-ID: <20250908121310.46824-4-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250908121310.46824-1-jolsa@kernel.org> References: <20250908121310.46824-1-jolsa@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adding test to check we can change common register values through uprobe program. It's x86_64 specific test. Signed-off-by: Jiri Olsa --- .../testing/selftests/bpf/prog_tests/uprobe.c | 114 +++++++++++++++++- .../testing/selftests/bpf/progs/test_uprobe.c | 24 ++++ 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe.c b/tools/testin= g/selftests/bpf/prog_tests/uprobe.c index cf3e0e7a64fa..19dd900df188 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe.c @@ -2,6 +2,7 @@ /* Copyright (c) 2023 Hengqi Chen */ =20 #include +#include #include "test_uprobe.skel.h" =20 static FILE *urand_spawn(int *pid) @@ -33,7 +34,7 @@ static int urand_trigger(FILE **urand_pipe) return exit_code; } =20 -void test_uprobe(void) +static void test_uprobe_attach(void) { LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); struct test_uprobe *skel; @@ -93,3 +94,114 @@ void test_uprobe(void) pclose(urand_pipe); test_uprobe__destroy(skel); } + +#ifdef __x86_64__ +__naked __maybe_unused unsigned long uprobe_regs_change_trigger(void) +{ + asm volatile ( + "ret\n" + ); +} + +static __naked void uprobe_regs_change(struct pt_regs *before, struct pt_r= egs *after) +{ + asm volatile ( + "movq %r11, 48(%rdi)\n" + "movq %r10, 56(%rdi)\n" + "movq %r9, 64(%rdi)\n" + "movq %r8, 72(%rdi)\n" + "movq %rax, 80(%rdi)\n" + "movq %rcx, 88(%rdi)\n" + "movq %rdx, 96(%rdi)\n" + "movq %rsi, 104(%rdi)\n" + "movq %rdi, 112(%rdi)\n" + + /* save 2nd argument */ + "pushq %rsi\n" + "call uprobe_regs_change_trigger\n" + + /* save return value and load 2nd argument pointer to rax */ + "pushq %rax\n" + "movq 8(%rsp), %rax\n" + + "movq %r11, 48(%rax)\n" + "movq %r10, 56(%rax)\n" + "movq %r9, 64(%rax)\n" + "movq %r8, 72(%rax)\n" + "movq %rcx, 88(%rax)\n" + "movq %rdx, 96(%rax)\n" + "movq %rsi, 104(%rax)\n" + "movq %rdi, 112(%rax)\n" + + /* restore return value and 2nd argument */ + "pop %rax\n" + "pop %rsi\n" + + "movq %rax, 80(%rsi)\n" + "ret\n" + ); +} + +static void regs_common(void) +{ + struct pt_regs before =3D {}, after =3D {}, expected =3D { + .rax =3D 0xc0ffe, + .rcx =3D 0xbad, + .rdx =3D 0xdead, + .r8 =3D 0x8, + .r9 =3D 0x9, + .r10 =3D 0x10, + .r11 =3D 0x11, + .rdi =3D 0x12, + .rsi =3D 0x13, + }; + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + struct test_uprobe *skel; + + skel =3D test_uprobe__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open")) + return; + + skel->bss->my_pid =3D getpid(); + skel->bss->regs =3D expected; + + uprobe_opts.func_name =3D "uprobe_regs_change_trigger"; + skel->links.test_regs_change =3D bpf_program__attach_uprobe_opts(skel->pr= ogs.test_regs_change, + -1, + "/proc/self/exe", + 0 /* offset */, + &uprobe_opts); + if (!ASSERT_OK_PTR(skel->links.test_regs_change, "bpf_program__attach_upr= obe_opts")) + goto cleanup; + + uprobe_regs_change(&before, &after); + + ASSERT_EQ(after.rax, expected.rax, "ax"); + ASSERT_EQ(after.rcx, expected.rcx, "cx"); + ASSERT_EQ(after.rdx, expected.rdx, "dx"); + ASSERT_EQ(after.r8, expected.r8, "r8"); + ASSERT_EQ(after.r9, expected.r9, "r9"); + ASSERT_EQ(after.r10, expected.r10, "r10"); + ASSERT_EQ(after.r11, expected.r11, "r11"); + ASSERT_EQ(after.rdi, expected.rdi, "rdi"); + ASSERT_EQ(after.rsi, expected.rsi, "rsi"); + +cleanup: + test_uprobe__destroy(skel); +} + +static void test_uprobe_regs_change(void) +{ + if (test__start_subtest("regs_change_common")) + regs_common(); +} +#else +static void test_uprobe_regs_change(void) { } +#endif + +void test_uprobe(void) +{ + if (test__start_subtest("attach")) + test_uprobe_attach(); + test_uprobe_regs_change(); +} diff --git a/tools/testing/selftests/bpf/progs/test_uprobe.c b/tools/testin= g/selftests/bpf/progs/test_uprobe.c index 896c88a4960d..9437bd76a437 100644 --- a/tools/testing/selftests/bpf/progs/test_uprobe.c +++ b/tools/testing/selftests/bpf/progs/test_uprobe.c @@ -59,3 +59,27 @@ int BPF_UPROBE(test4) test4_result =3D 1; return 0; } + +#if defined(__TARGET_ARCH_x86) +struct pt_regs regs; + +SEC("uprobe") +int BPF_UPROBE(test_regs_change) +{ + pid_t pid =3D bpf_get_current_pid_tgid() >> 32; + + if (pid !=3D my_pid) + return 0; + + ctx->ax =3D regs.ax; + ctx->cx =3D regs.cx; + ctx->dx =3D regs.dx; + ctx->r8 =3D regs.r8; + ctx->r9 =3D regs.r9; + ctx->r10 =3D regs.r10; + ctx->r11 =3D regs.r11; + ctx->di =3D regs.di; + ctx->si =3D regs.si; + return 0; +} +#endif --=20 2.51.0 From nobody Tue Dec 16 21:25:05 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 593942EBDE6; Mon, 8 Sep 2025 12:14:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333645; cv=none; b=CCaOjpp65qRPLumpmjGLOee5dARc5PEXNOYkIEPPTK7NpM83xMmzZlwY3Ynyor9MsORpoB4OB8J/GYxwPhkvj01MuJdJJ4w96OR8ol1N8TZfW7MUkKeien6OXYZ9g1XT2X0MFRaL5S8WCkdP6kIOnoSxjje0miihFUlUM/ytukc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757333645; c=relaxed/simple; bh=AVpuHvvS5I5LtGxHyezfUbjP3WODclgFHrgBZgJ6/k0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D4XZmZBVIvjM05joEz4w/uKX6asS5GCydaDlTQ5sv2Yy3gYz84XivwsyNJLl5axPDGvJ43yqKSFF4H9V2vjKBgfw23zzI1j5SVc1SdKsCoFHcpSZAknffjHRwi935JSzUlleDLBsWyox2mibnmMvWKKGTbZT8WPzcSg6eVKOqwM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uCiHGmfj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uCiHGmfj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 669AAC4CEF1; Mon, 8 Sep 2025 12:14:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757333644; bh=AVpuHvvS5I5LtGxHyezfUbjP3WODclgFHrgBZgJ6/k0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uCiHGmfj5qcNS6q95ZUcfPGpvi4/qMPuorzGgZf1w8GCpCGIBpOWY1bdW4mVIyaGk 1peA2Sg7Vp4mhpMtYcThMSfw6fCbbNDu+ZYf4dhusiL+c5LfIZLYZUFo/oOwvm6bLz qFzAjW9nkpZzu8p7JUo8YSRgSzQvZxC7yZ8JuRha5giMmGD2nXy3igrCFYAeHS3HcM u9JduVk0gO5Oef3RR+BLQq8mX6Z7YlfGVZR+PlNoFGs95bTfIQZTk5liQ3QIslIYzj zQR28s2jNDoUnhQglzCuvFLhHJExO0XSGNjPi6iK3oV1cshXFgiM82JzaQxJc01rzB w+qMEVKlqFnTQ== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCHv2 perf/core 4/4] selftests/bpf: Add uprobe context ip register change test Date: Mon, 8 Sep 2025 14:13:10 +0200 Message-ID: <20250908121310.46824-5-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250908121310.46824-1-jolsa@kernel.org> References: <20250908121310.46824-1-jolsa@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adding test to check we can change the application execution through instruction pointer change through uprobe program. It's x86_64 specific test. Signed-off-by: Jiri Olsa --- .../testing/selftests/bpf/prog_tests/uprobe.c | 42 +++++++++++++++++++ .../testing/selftests/bpf/progs/test_uprobe.c | 14 +++++++ 2 files changed, 56 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe.c b/tools/testin= g/selftests/bpf/prog_tests/uprobe.c index 19dd900df188..86404476c1da 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe.c @@ -190,10 +190,52 @@ static void regs_common(void) test_uprobe__destroy(skel); } =20 +static noinline unsigned long uprobe_regs_change_ip_1(void) +{ + return 0xc0ffee; +} + +static noinline unsigned long uprobe_regs_change_ip_2(void) +{ + return 0xdeadbeef; +} + +static void regs_ip(void) +{ + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + struct test_uprobe *skel; + unsigned long ret; + + skel =3D test_uprobe__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open")) + return; + + skel->bss->my_pid =3D getpid(); + skel->bss->ip =3D (unsigned long) uprobe_regs_change_ip_2; + + uprobe_opts.func_name =3D "uprobe_regs_change_ip_1"; + skel->links.test_regs_change_ip =3D bpf_program__attach_uprobe_opts( + skel->progs.test_regs_change_ip, + -1, + "/proc/self/exe", + 0 /* offset */, + &uprobe_opts); + if (!ASSERT_OK_PTR(skel->links.test_regs_change_ip, "bpf_program__attach_= uprobe_opts")) + goto cleanup; + + ret =3D uprobe_regs_change_ip_1(); + ASSERT_EQ(ret, 0xdeadbeef, "ret"); + +cleanup: + test_uprobe__destroy(skel); +} + static void test_uprobe_regs_change(void) { if (test__start_subtest("regs_change_common")) regs_common(); + if (test__start_subtest("regs_change_ip")) + regs_ip(); } #else static void test_uprobe_regs_change(void) { } diff --git a/tools/testing/selftests/bpf/progs/test_uprobe.c b/tools/testin= g/selftests/bpf/progs/test_uprobe.c index 9437bd76a437..12f4065fca20 100644 --- a/tools/testing/selftests/bpf/progs/test_uprobe.c +++ b/tools/testing/selftests/bpf/progs/test_uprobe.c @@ -82,4 +82,18 @@ int BPF_UPROBE(test_regs_change) ctx->si =3D regs.si; return 0; } + +unsigned long ip; + +SEC("uprobe") +int BPF_UPROBE(test_regs_change_ip) +{ + pid_t pid =3D bpf_get_current_pid_tgid() >> 32; + + if (pid !=3D my_pid) + return 0; + + ctx->ip =3D ip; + return 0; +} #endif --=20 2.51.0