1// SPDX-License-Identifier: GPL-2.0 2#include <test_progs.h> 3#include "kprobe_multi.skel.h" 4#include "trace_helpers.h" 5#include "bpf/libbpf_internal.h" 6 7static struct ksyms *ksyms; 8 9static void kprobe_multi_testmod_check(struct kprobe_multi *skel) 10{ 11 ASSERT_EQ(skel->bss->kprobe_testmod_test1_result, 1, "kprobe_test1_result"); 12 ASSERT_EQ(skel->bss->kprobe_testmod_test2_result, 1, "kprobe_test2_result"); 13 ASSERT_EQ(skel->bss->kprobe_testmod_test3_result, 1, "kprobe_test3_result"); 14 15 ASSERT_EQ(skel->bss->kretprobe_testmod_test1_result, 1, "kretprobe_test1_result"); 16 ASSERT_EQ(skel->bss->kretprobe_testmod_test2_result, 1, "kretprobe_test2_result"); 17 ASSERT_EQ(skel->bss->kretprobe_testmod_test3_result, 1, "kretprobe_test3_result"); 18} 19 20static void test_testmod_attach_api(struct bpf_kprobe_multi_opts *opts) 21{ 22 struct kprobe_multi *skel = NULL; 23 24 skel = kprobe_multi__open_and_load(); 25 if (!ASSERT_OK_PTR(skel, "fentry_raw_skel_load")) 26 return; 27 28 skel->bss->pid = getpid(); 29 30 skel->links.test_kprobe_testmod = bpf_program__attach_kprobe_multi_opts( 31 skel->progs.test_kprobe_testmod, 32 NULL, opts); 33 if (!skel->links.test_kprobe_testmod) 34 goto cleanup; 35 36 opts->retprobe = true; 37 skel->links.test_kretprobe_testmod = bpf_program__attach_kprobe_multi_opts( 38 skel->progs.test_kretprobe_testmod, 39 NULL, opts); 40 if (!skel->links.test_kretprobe_testmod) 41 goto cleanup; 42 43 ASSERT_OK(trigger_module_test_read(1), "trigger_read"); 44 kprobe_multi_testmod_check(skel); 45 46cleanup: 47 kprobe_multi__destroy(skel); 48} 49 50static void test_testmod_attach_api_addrs(void) 51{ 52 LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); 53 unsigned long long addrs[3]; 54 55 addrs[0] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test1"); 56 ASSERT_NEQ(addrs[0], 0, "ksym_get_addr_local"); 57 addrs[1] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test2"); 58 ASSERT_NEQ(addrs[1], 0, "ksym_get_addr_local"); 59 addrs[2] = ksym_get_addr_local(ksyms, "bpf_testmod_fentry_test3"); 60 ASSERT_NEQ(addrs[2], 0, "ksym_get_addr_local"); 61 62 opts.addrs = (const unsigned long *) addrs; 63 opts.cnt = ARRAY_SIZE(addrs); 64 65 test_testmod_attach_api(&opts); 66} 67 68static void test_testmod_attach_api_syms(void) 69{ 70 LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); 71 const char *syms[3] = { 72 "bpf_testmod_fentry_test1", 73 "bpf_testmod_fentry_test2", 74 "bpf_testmod_fentry_test3", 75 }; 76 77 opts.syms = syms; 78 opts.cnt = ARRAY_SIZE(syms); 79 test_testmod_attach_api(&opts); 80} 81 82void serial_test_kprobe_multi_testmod_test(void) 83{ 84 ksyms = load_kallsyms_local(); 85 if (!ASSERT_OK_PTR(ksyms, "load_kallsyms_local")) 86 return; 87 88 if (test__start_subtest("testmod_attach_api_syms")) 89 test_testmod_attach_api_syms(); 90 91 if (test__start_subtest("testmod_attach_api_addrs")) 92 test_testmod_attach_api_addrs(); 93 94 free_kallsyms_local(ksyms); 95} 96