]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Add uprobe context ip register change test
authorJiri Olsa <jolsa@kernel.org>
Tue, 16 Sep 2025 21:52:59 +0000 (23:52 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 24 Sep 2025 09:25:06 +0000 (02:25 -0700)
Adding test to check we can change the application execution
through instruction pointer change through uprobe program.

It's x86_64 specific test.

Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/r/20250916215301.664963-5-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/uprobe.c
tools/testing/selftests/bpf/progs/test_uprobe.c

index 19dd900df188a4d0f647ef2d75be0200fe70152f..86404476c1dafeb1354b578a6c1ef53a9e21ebd3 100644 (file)
@@ -190,10 +190,52 @@ cleanup:
        test_uprobe__destroy(skel);
 }
 
+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 = test_uprobe__open_and_load();
+       if (!ASSERT_OK_PTR(skel, "skel_open"))
+               return;
+
+       skel->bss->my_pid = getpid();
+       skel->bss->ip = (unsigned long) uprobe_regs_change_ip_2;
+
+       uprobe_opts.func_name = "uprobe_regs_change_ip_1";
+       skel->links.test_regs_change_ip = 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 = 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) { }
index 9437bd76a437c63fed4417e548ba1e65be24d2ed..12f4065fca2016607adc920ddacfd225a644294d 100644 (file)
@@ -82,4 +82,18 @@ int BPF_UPROBE(test_regs_change)
        ctx->si  = regs.si;
        return 0;
 }
+
+unsigned long ip;
+
+SEC("uprobe")
+int BPF_UPROBE(test_regs_change_ip)
+{
+       pid_t pid = bpf_get_current_pid_tgid() >> 32;
+
+       if (pid != my_pid)
+               return 0;
+
+       ctx->ip = ip;
+       return 0;
+}
 #endif