1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */
4 #include <test_progs.h>
5 #include "test_subskeleton.skel.h"
6 #include "test_subskeleton_lib.subskel.h"
8 static void subskeleton_lib_setup(struct bpf_object *obj)
10 struct test_subskeleton_lib *lib = test_subskeleton_lib__open(obj);
12 if (!ASSERT_OK_PTR(lib, "open subskeleton"))
15 *lib->rodata.var1 = 1;
17 lib->bss.var3->var3_1 = 3;
18 lib->bss.var3->var3_2 = 4;
20 test_subskeleton_lib__destroy(lib);
23 static int subskeleton_lib_subresult(struct bpf_object *obj)
25 struct test_subskeleton_lib *lib = test_subskeleton_lib__open(obj);
28 if (!ASSERT_OK_PTR(lib, "open subskeleton"))
31 result = *lib->bss.libout1;
32 ASSERT_EQ(result, 1 + 2 + 3 + 4 + 5 + 6, "lib subresult");
34 ASSERT_OK_PTR(lib->progs.lib_perf_handler, "lib_perf_handler");
35 ASSERT_STREQ(bpf_program__name(lib->progs.lib_perf_handler),
36 "lib_perf_handler", "program name");
38 ASSERT_OK_PTR(lib->maps.map1, "map1");
39 ASSERT_STREQ(bpf_map__name(lib->maps.map1), "map1", "map name");
41 ASSERT_EQ(*lib->data.var5, 5, "__weak var5");
42 ASSERT_EQ(*lib->data.var6, 6, "extern var6");
43 ASSERT_TRUE(*lib->kconfig.CONFIG_BPF_SYSCALL, "CONFIG_BPF_SYSCALL");
45 test_subskeleton_lib__destroy(lib);
49 /* initialize and load through skeleton, then instantiate subskeleton out of it */
50 static void subtest_skel_subskeleton(void)
53 struct test_subskeleton *skel;
55 skel = test_subskeleton__open();
56 if (!ASSERT_OK_PTR(skel, "skel_open"))
59 skel->rodata->rovar1 = 10;
60 skel->rodata->var1 = 1;
61 subskeleton_lib_setup(skel->obj);
63 err = test_subskeleton__load(skel);
64 if (!ASSERT_OK(err, "skel_load"))
67 err = test_subskeleton__attach(skel);
68 if (!ASSERT_OK(err, "skel_attach"))
71 /* trigger tracepoint */
74 result = subskeleton_lib_subresult(skel->obj) * 10;
75 ASSERT_EQ(skel->bss->out1, result, "unexpected calculation");
78 test_subskeleton__destroy(skel);
81 /* initialize and load through generic bpf_object API, then instantiate subskeleton out of it */
82 static void subtest_obj_subskeleton(void)
85 const void *elf_bytes;
86 size_t elf_bytes_sz = 0, rodata_sz = 0, bss_sz = 0;
87 struct bpf_object *obj;
88 const struct bpf_map *map;
89 const struct bpf_program *prog;
90 struct bpf_link *link = NULL;
91 struct test_subskeleton__rodata *rodata;
92 struct test_subskeleton__bss *bss;
94 elf_bytes = test_subskeleton__elf_bytes(&elf_bytes_sz);
95 if (!ASSERT_OK_PTR(elf_bytes, "elf_bytes"))
98 obj = bpf_object__open_mem(elf_bytes, elf_bytes_sz, NULL);
99 if (!ASSERT_OK_PTR(obj, "obj_open_mem"))
102 map = bpf_object__find_map_by_name(obj, ".rodata");
103 if (!ASSERT_OK_PTR(map, "rodata_map_by_name"))
106 rodata = bpf_map__initial_value(map, &rodata_sz);
107 if (!ASSERT_OK_PTR(rodata, "rodata_get"))
112 subskeleton_lib_setup(obj);
114 err = bpf_object__load(obj);
115 if (!ASSERT_OK(err, "obj_load"))
118 prog = bpf_object__find_program_by_name(obj, "handler1");
119 if (!ASSERT_OK_PTR(prog, "prog_by_name"))
122 link = bpf_program__attach(prog);
123 if (!ASSERT_OK_PTR(link, "prog_attach"))
126 /* trigger tracepoint */
129 map = bpf_object__find_map_by_name(obj, ".bss");
130 if (!ASSERT_OK_PTR(map, "bss_map_by_name"))
133 bss = bpf_map__initial_value(map, &bss_sz);
134 if (!ASSERT_OK_PTR(rodata, "rodata_get"))
137 result = subskeleton_lib_subresult(obj) * 10;
138 ASSERT_EQ(bss->out1, result, "out1");
141 bpf_link__destroy(link);
142 bpf_object__close(obj);
146 void test_subskeleton(void)
148 if (test__start_subtest("skel_subskel"))
149 subtest_skel_subskeleton();
150 if (test__start_subtest("obj_subskel"))
151 subtest_obj_subskeleton();