Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1// SPDX-License-Identifier: GPL-2.0
  2/* Copyright (c) Meta Platforms, Inc. and affiliates. */
  3
  4#include <test_progs.h>
  5#include "test_subskeleton.skel.h"
  6#include "test_subskeleton_lib.subskel.h"
  7
  8static void subskeleton_lib_setup(struct bpf_object *obj)
  9{
 10	struct test_subskeleton_lib *lib = test_subskeleton_lib__open(obj);
 11
 12	if (!ASSERT_OK_PTR(lib, "open subskeleton"))
 13		return;
 14
 15	*lib->rodata.var1 = 1;
 16	*lib->data.var2 = 2;
 17	lib->bss.var3->var3_1 = 3;
 18	lib->bss.var3->var3_2 = 4;
 19
 20	test_subskeleton_lib__destroy(lib);
 21}
 22
 23static int subskeleton_lib_subresult(struct bpf_object *obj)
 24{
 25	struct test_subskeleton_lib *lib = test_subskeleton_lib__open(obj);
 26	int result;
 27
 28	if (!ASSERT_OK_PTR(lib, "open subskeleton"))
 29		return -EINVAL;
 30
 31	result = *lib->bss.libout1;
 32	ASSERT_EQ(result, 1 + 2 + 3 + 4 + 5 + 6, "lib subresult");
 33
 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");
 37
 38	ASSERT_OK_PTR(lib->maps.map1, "map1");
 39	ASSERT_STREQ(bpf_map__name(lib->maps.map1), "map1", "map name");
 40
 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");
 44
 45	test_subskeleton_lib__destroy(lib);
 46	return result;
 47}
 48
 49/* initialize and load through skeleton, then instantiate subskeleton out of it */
 50static void subtest_skel_subskeleton(void)
 51{
 52	int err, result;
 53	struct test_subskeleton *skel;
 54
 55	skel = test_subskeleton__open();
 56	if (!ASSERT_OK_PTR(skel, "skel_open"))
 57		return;
 58
 59	skel->rodata->rovar1 = 10;
 60	skel->rodata->var1 = 1;
 61	subskeleton_lib_setup(skel->obj);
 62
 63	err = test_subskeleton__load(skel);
 64	if (!ASSERT_OK(err, "skel_load"))
 65		goto cleanup;
 66
 67	err = test_subskeleton__attach(skel);
 68	if (!ASSERT_OK(err, "skel_attach"))
 69		goto cleanup;
 70
 71	/* trigger tracepoint */
 72	usleep(1);
 73
 74	result = subskeleton_lib_subresult(skel->obj) * 10;
 75	ASSERT_EQ(skel->bss->out1, result, "unexpected calculation");
 76
 77cleanup:
 78	test_subskeleton__destroy(skel);
 79}
 80
 81/* initialize and load through generic bpf_object API, then instantiate subskeleton out of it */
 82static void subtest_obj_subskeleton(void)
 83{
 84	int err, result;
 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;
 93
 94	elf_bytes = test_subskeleton__elf_bytes(&elf_bytes_sz);
 95	if (!ASSERT_OK_PTR(elf_bytes, "elf_bytes"))
 96		return;
 97
 98	obj = bpf_object__open_mem(elf_bytes, elf_bytes_sz, NULL);
 99	if (!ASSERT_OK_PTR(obj, "obj_open_mem"))
100		return;
101
102	map = bpf_object__find_map_by_name(obj, ".rodata");
103	if (!ASSERT_OK_PTR(map, "rodata_map_by_name"))
104		goto cleanup;
105
106	rodata = bpf_map__initial_value(map, &rodata_sz);
107	if (!ASSERT_OK_PTR(rodata, "rodata_get"))
108		goto cleanup;
109
110	rodata->rovar1 = 10;
111	rodata->var1 = 1;
112	subskeleton_lib_setup(obj);
113
114	err = bpf_object__load(obj);
115	if (!ASSERT_OK(err, "obj_load"))
116		goto cleanup;
117
118	prog = bpf_object__find_program_by_name(obj, "handler1");
119	if (!ASSERT_OK_PTR(prog, "prog_by_name"))
120		goto cleanup;
121
122	link = bpf_program__attach(prog);
123	if (!ASSERT_OK_PTR(link, "prog_attach"))
124		goto cleanup;
125
126	/* trigger tracepoint */
127	usleep(1);
128
129	map = bpf_object__find_map_by_name(obj, ".bss");
130	if (!ASSERT_OK_PTR(map, "bss_map_by_name"))
131		goto cleanup;
132
133	bss = bpf_map__initial_value(map, &bss_sz);
134	if (!ASSERT_OK_PTR(rodata, "rodata_get"))
135		goto cleanup;
136
137	result = subskeleton_lib_subresult(obj) * 10;
138	ASSERT_EQ(bss->out1, result, "out1");
139
140cleanup:
141	bpf_link__destroy(link);
142	bpf_object__close(obj);
143}
144
145
146void test_subskeleton(void)
147{
148	if (test__start_subtest("skel_subskel"))
149		subtest_skel_subskeleton();
150	if (test__start_subtest("obj_subskel"))
151		subtest_obj_subskeleton();
152}