| // SPDX-License-Identifier: GPL-2.0 | |
| #include <test_progs.h> | |
| #include "kprobe_multi.skel.h" | |
| #include "trace_helpers.h" | |
| #include "bpf/libbpf_internal.h" | |
| static struct ksyms *ksyms; | |
| static void kprobe_multi_testmod_check(struct kprobe_multi *skel) | |
| { | |
| ASSERT_EQ(skel->bss->kprobe_testmod_test1_result, 1, "kprobe_test1_result"); | |
| ASSERT_EQ(skel->bss->kprobe_testmod_test2_result, 1, "kprobe_test2_result"); | |
| ASSERT_EQ(skel->bss->kprobe_testmod_test3_result, 1, "kprobe_test3_result"); | |
| ASSERT_EQ(skel->bss->kretprobe_testmod_test1_result, 1, "kretprobe_test1_result"); | |
| ASSERT_EQ(skel->bss->kretprobe_testmod_test2_result, 1, "kretprobe_test2_result"); | |
| ASSERT_EQ(skel->bss->kretprobe_testmod_test3_result, 1, "kretprobe_test3_result"); | |
| } | |
| static void test_testmod_attach_api(struct bpf_kprobe_multi_opts *opts) | |
| { | |
| struct kprobe_multi *skel = NULL; | |
| skel = kprobe_multi__open_and_load(); | |
| if (!ASSERT_OK_PTR(skel, "fentry_raw_skel_load")) | |
| return; | |
| skel->bss->pid = getpid(); | |
| skel->links.test_kprobe_testmod = bpf_program__attach_kprobe_multi_opts( | |
| skel->progs.test_kprobe_testmod, | |
| NULL, opts); | |
| if (!skel->links.test_kprobe_testmod) | |
| goto cleanup; | |
| opts->retprobe = true; | |
| skel->links.test_kretprobe_testmod = bpf_program__attach_kprobe_multi_opts( | |
| skel->progs.test_kretprobe_testmod, | |
| NULL, opts); | |
| if (!skel->links.test_kretprobe_testmod) | |
| goto cleanup; | |
| ASSERT_OK(trigger_module_test_read(1), "trigger_read"); | |
| kprobe_multi_testmod_check(skel); | |
| cleanup: | |
| kprobe_multi__destroy(skel); | |
| } | |
| static void test_testmod_attach_api_addrs(void) | |
| { | |
| LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); | |
| unsigned long long addrs[3]; | |
| addrs[0] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test1"); | |
| ASSERT_NEQ(addrs[0], 0, "ksym_get_addr_local"); | |
| addrs[1] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test2"); | |
| ASSERT_NEQ(addrs[1], 0, "ksym_get_addr_local"); | |
| addrs[2] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test3"); | |
| ASSERT_NEQ(addrs[2], 0, "ksym_get_addr_local"); | |
| opts.addrs = (const unsigned long *) addrs; | |
| opts.cnt = ARRAY_SIZE(addrs); | |
| test_testmod_attach_api(&opts); | |
| } | |
| static void test_testmod_attach_api_syms(void) | |
| { | |
| LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); | |
| const char *syms[3] = { | |
| "bpf_testmod_fentry_test1", | |
| "bpf_testmod_fentry_test2", | |
| "bpf_testmod_fentry_test3", | |
| }; | |
| opts.syms = syms; | |
| opts.cnt = ARRAY_SIZE(syms); | |
| test_testmod_attach_api(&opts); | |
| } | |
| void serial_test_kprobe_multi_testmod_test(void) | |
| { | |
| ksyms = load_kallsyms_local(); | |
| if (!ASSERT_OK_PTR(ksyms, "load_kallsyms_local")) | |
| return; | |
| if (test__start_subtest("testmod_attach_api_syms")) | |
| test_testmod_attach_api_syms(); | |
| if (test__start_subtest("testmod_attach_api_addrs")) | |
| test_testmod_attach_api_addrs(); | |
| free_kallsyms_local(ksyms); | |
| } |