aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/bpf/prog_tests/btf_tag.c
blob: f7560b54a6bb53dd2df2c33d5878129361d23306 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2021 Facebook */
#include <test_progs.h>
#include <bpf/btf.h>
#include "test_btf_decl_tag.skel.h"

/* struct btf_type_tag_test is referenced in btf_type_tag.skel.h */
struct btf_type_tag_test {
        int **p;
};
#include "btf_type_tag.skel.h"
#include "btf_type_tag_user.skel.h"

static void test_btf_decl_tag(void)
{
	struct test_btf_decl_tag *skel;

	skel = test_btf_decl_tag__open_and_load();
	if (!ASSERT_OK_PTR(skel, "btf_decl_tag"))
		return;

	if (skel->rodata->skip_tests) {
		printf("%s:SKIP: btf_decl_tag attribute not supported", __func__);
		test__skip();
	}

	test_btf_decl_tag__destroy(skel);
}

static void test_btf_type_tag(void)
{
	struct btf_type_tag *skel;

	skel = btf_type_tag__open_and_load();
	if (!ASSERT_OK_PTR(skel, "btf_type_tag"))
		return;

	if (skel->rodata->skip_tests) {
		printf("%s:SKIP: btf_type_tag attribute not supported", __func__);
		test__skip();
	}

	btf_type_tag__destroy(skel);
}

static void test_btf_type_tag_mod_user(bool load_test_user1)
{
	const char *module_name = "bpf_testmod";
	struct btf *vmlinux_btf, *module_btf;
	struct btf_type_tag_user *skel;
	__s32 type_id;
	int err;

	if (!env.has_testmod) {
		test__skip();
		return;
	}

	/* skip the test if the module does not have __user tags */
	vmlinux_btf = btf__load_vmlinux_btf();
	if (!ASSERT_OK_PTR(vmlinux_btf, "could not load vmlinux BTF"))
		return;

	module_btf = btf__load_module_btf(module_name, vmlinux_btf);
	if (!ASSERT_OK_PTR(module_btf, "could not load module BTF"))
		goto free_vmlinux_btf;

	type_id = btf__find_by_name_kind(module_btf, "user", BTF_KIND_TYPE_TAG);
	if (type_id <= 0) {
		printf("%s:SKIP: btf_type_tag attribute not in %s", __func__, module_name);
		test__skip();
		goto free_module_btf;
	}

	skel = btf_type_tag_user__open();
	if (!ASSERT_OK_PTR(skel, "btf_type_tag_user"))
		goto free_module_btf;

	bpf_program__set_autoload(skel->progs.test_sys_getsockname, false);
	if (load_test_user1)
		bpf_program__set_autoload(skel->progs.test_user2, false);
	else
		bpf_program__set_autoload(skel->progs.test_user1, false);

	err = btf_type_tag_user__load(skel);
	ASSERT_ERR(err, "btf_type_tag_user");

	btf_type_tag_user__destroy(skel);

free_module_btf:
	btf__free(module_btf);
free_vmlinux_btf:
	btf__free(vmlinux_btf);
}

static void test_btf_type_tag_vmlinux_user(void)
{
	struct btf_type_tag_user *skel;
	struct btf *vmlinux_btf;
	__s32 type_id;
	int err;

	/* skip the test if the vmlinux does not have __user tags */
	vmlinux_btf = btf__load_vmlinux_btf();
	if (!ASSERT_OK_PTR(vmlinux_btf, "could not load vmlinux BTF"))
		return;

	type_id = btf__find_by_name_kind(vmlinux_btf, "user", BTF_KIND_TYPE_TAG);
	if (type_id <= 0) {
		printf("%s:SKIP: btf_type_tag attribute not in vmlinux btf", __func__);
		test__skip();
		goto free_vmlinux_btf;
	}

	skel = btf_type_tag_user__open();
	if (!ASSERT_OK_PTR(skel, "btf_type_tag_user"))
		goto free_vmlinux_btf;

	bpf_program__set_autoload(skel->progs.test_user2, false);
	bpf_program__set_autoload(skel->progs.test_user1, false);

	err = btf_type_tag_user__load(skel);
	ASSERT_ERR(err, "btf_type_tag_user");

	btf_type_tag_user__destroy(skel);

free_vmlinux_btf:
	btf__free(vmlinux_btf);
}

void test_btf_tag(void)
{
	if (test__start_subtest("btf_decl_tag"))
		test_btf_decl_tag();
	if (test__start_subtest("btf_type_tag"))
		test_btf_type_tag();
	if (test__start_subtest("btf_type_tag_user_mod1"))
		test_btf_type_tag_mod_user(true);
	if (test__start_subtest("btf_type_tag_user_mod2"))
		test_btf_type_tag_mod_user(false);
	if (test__start_subtest("btf_type_tag_sys_user_vmlinux"))
		test_btf_type_tag_vmlinux_user();
}