1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2018 Facebook */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <linux/bpf.h>
5*4882a593Smuzhiyun #include <linux/btf.h>
6*4882a593Smuzhiyun #include <linux/err.h>
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun #include <linux/filter.h>
9*4882a593Smuzhiyun #include <linux/unistd.h>
10*4882a593Smuzhiyun #include <bpf/bpf.h>
11*4882a593Smuzhiyun #include <sys/resource.h>
12*4882a593Smuzhiyun #include <libelf.h>
13*4882a593Smuzhiyun #include <gelf.h>
14*4882a593Smuzhiyun #include <string.h>
15*4882a593Smuzhiyun #include <stdlib.h>
16*4882a593Smuzhiyun #include <stdio.h>
17*4882a593Smuzhiyun #include <stdarg.h>
18*4882a593Smuzhiyun #include <unistd.h>
19*4882a593Smuzhiyun #include <fcntl.h>
20*4882a593Smuzhiyun #include <errno.h>
21*4882a593Smuzhiyun #include <assert.h>
22*4882a593Smuzhiyun #include <bpf/libbpf.h>
23*4882a593Smuzhiyun #include <bpf/btf.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include "bpf_rlimit.h"
26*4882a593Smuzhiyun #include "bpf_util.h"
27*4882a593Smuzhiyun #include "../test_btf.h"
28*4882a593Smuzhiyun #include "test_progs.h"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define MAX_INSNS 512
31*4882a593Smuzhiyun #define MAX_SUBPROGS 16
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun static int duration = 0;
34*4882a593Smuzhiyun static bool always_log;
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #undef CHECK
37*4882a593Smuzhiyun #define CHECK(condition, format...) _CHECK(condition, "check", duration, format)
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #define BTF_END_RAW 0xdeadbeef
40*4882a593Smuzhiyun #define NAME_TBD 0xdeadb33f
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define NAME_NTH(N) (0xffff0000 | N)
43*4882a593Smuzhiyun #define IS_NAME_NTH(X) ((X & 0xffff0000) == 0xffff0000)
44*4882a593Smuzhiyun #define GET_NAME_NTH_IDX(X) (X & 0x0000ffff)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun #define MAX_NR_RAW_U32 1024
47*4882a593Smuzhiyun #define BTF_LOG_BUF_SIZE 65535
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun static char btf_log_buf[BTF_LOG_BUF_SIZE];
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun static struct btf_header hdr_tmpl = {
52*4882a593Smuzhiyun .magic = BTF_MAGIC,
53*4882a593Smuzhiyun .version = BTF_VERSION,
54*4882a593Smuzhiyun .hdr_len = sizeof(struct btf_header),
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* several different mapv kinds(types) supported by pprint */
58*4882a593Smuzhiyun enum pprint_mapv_kind_t {
59*4882a593Smuzhiyun PPRINT_MAPV_KIND_BASIC = 0,
60*4882a593Smuzhiyun PPRINT_MAPV_KIND_INT128,
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun struct btf_raw_test {
64*4882a593Smuzhiyun const char *descr;
65*4882a593Smuzhiyun const char *str_sec;
66*4882a593Smuzhiyun const char *map_name;
67*4882a593Smuzhiyun const char *err_str;
68*4882a593Smuzhiyun __u32 raw_types[MAX_NR_RAW_U32];
69*4882a593Smuzhiyun __u32 str_sec_size;
70*4882a593Smuzhiyun enum bpf_map_type map_type;
71*4882a593Smuzhiyun __u32 key_size;
72*4882a593Smuzhiyun __u32 value_size;
73*4882a593Smuzhiyun __u32 key_type_id;
74*4882a593Smuzhiyun __u32 value_type_id;
75*4882a593Smuzhiyun __u32 max_entries;
76*4882a593Smuzhiyun bool btf_load_err;
77*4882a593Smuzhiyun bool map_create_err;
78*4882a593Smuzhiyun bool ordered_map;
79*4882a593Smuzhiyun bool lossless_map;
80*4882a593Smuzhiyun bool percpu_map;
81*4882a593Smuzhiyun int hdr_len_delta;
82*4882a593Smuzhiyun int type_off_delta;
83*4882a593Smuzhiyun int str_off_delta;
84*4882a593Smuzhiyun int str_len_delta;
85*4882a593Smuzhiyun enum pprint_mapv_kind_t mapv_kind;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define BTF_STR_SEC(str) \
89*4882a593Smuzhiyun .str_sec = str, .str_sec_size = sizeof(str)
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun static struct btf_raw_test raw_tests[] = {
92*4882a593Smuzhiyun /* enum E {
93*4882a593Smuzhiyun * E0,
94*4882a593Smuzhiyun * E1,
95*4882a593Smuzhiyun * };
96*4882a593Smuzhiyun *
97*4882a593Smuzhiyun * struct A {
98*4882a593Smuzhiyun * unsigned long long m;
99*4882a593Smuzhiyun * int n;
100*4882a593Smuzhiyun * char o;
101*4882a593Smuzhiyun * [3 bytes hole]
102*4882a593Smuzhiyun * int p[8];
103*4882a593Smuzhiyun * int q[4][8];
104*4882a593Smuzhiyun * enum E r;
105*4882a593Smuzhiyun * };
106*4882a593Smuzhiyun */
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun .descr = "struct test #1",
109*4882a593Smuzhiyun .raw_types = {
110*4882a593Smuzhiyun /* int */
111*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
112*4882a593Smuzhiyun /* unsigned long long */
113*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
114*4882a593Smuzhiyun /* char */
115*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
116*4882a593Smuzhiyun /* int[8] */
117*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
118*4882a593Smuzhiyun /* struct A { */ /* [5] */
119*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 6), 180),
120*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
121*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
122*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
123*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
124*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, 384),/* int q[4][8] */
125*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 7, 1408), /* enum E r */
126*4882a593Smuzhiyun /* } */
127*4882a593Smuzhiyun /* int[4][8] */
128*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [6] */
129*4882a593Smuzhiyun /* enum E */ /* [7] */
130*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)),
131*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
132*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
133*4882a593Smuzhiyun BTF_END_RAW,
134*4882a593Smuzhiyun },
135*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1",
136*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1"),
137*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
138*4882a593Smuzhiyun .map_name = "struct_test1_map",
139*4882a593Smuzhiyun .key_size = sizeof(int),
140*4882a593Smuzhiyun .value_size = 180,
141*4882a593Smuzhiyun .key_type_id = 1,
142*4882a593Smuzhiyun .value_type_id = 5,
143*4882a593Smuzhiyun .max_entries = 4,
144*4882a593Smuzhiyun },
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun /* typedef struct b Struct_B;
147*4882a593Smuzhiyun *
148*4882a593Smuzhiyun * struct A {
149*4882a593Smuzhiyun * int m;
150*4882a593Smuzhiyun * struct b n[4];
151*4882a593Smuzhiyun * const Struct_B o[4];
152*4882a593Smuzhiyun * };
153*4882a593Smuzhiyun *
154*4882a593Smuzhiyun * struct B {
155*4882a593Smuzhiyun * int m;
156*4882a593Smuzhiyun * int n;
157*4882a593Smuzhiyun * };
158*4882a593Smuzhiyun */
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun .descr = "struct test #2",
161*4882a593Smuzhiyun .raw_types = {
162*4882a593Smuzhiyun /* int */ /* [1] */
163*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
164*4882a593Smuzhiyun /* struct b [4] */ /* [2] */
165*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(4, 1, 4),
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /* struct A { */ /* [3] */
168*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 3), 68),
169*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
170*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct B n[4] */
171*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 8, 288),/* const Struct_B o[4];*/
172*4882a593Smuzhiyun /* } */
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /* struct B { */ /* [4] */
175*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
176*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
177*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */
178*4882a593Smuzhiyun /* } */
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /* const int */ /* [5] */
181*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),
182*4882a593Smuzhiyun /* typedef struct b Struct_B */ /* [6] */
183*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 4),
184*4882a593Smuzhiyun /* const Struct_B */ /* [7] */
185*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 6),
186*4882a593Smuzhiyun /* const Struct_B [4] */ /* [8] */
187*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(7, 1, 4),
188*4882a593Smuzhiyun BTF_END_RAW,
189*4882a593Smuzhiyun },
190*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0B\0m\0n\0Struct_B",
191*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0B\0m\0n\0Struct_B"),
192*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
193*4882a593Smuzhiyun .map_name = "struct_test2_map",
194*4882a593Smuzhiyun .key_size = sizeof(int),
195*4882a593Smuzhiyun .value_size = 68,
196*4882a593Smuzhiyun .key_type_id = 1,
197*4882a593Smuzhiyun .value_type_id = 3,
198*4882a593Smuzhiyun .max_entries = 4,
199*4882a593Smuzhiyun },
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun .descr = "struct test #3 Invalid member offset",
202*4882a593Smuzhiyun .raw_types = {
203*4882a593Smuzhiyun /* int */ /* [1] */
204*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
205*4882a593Smuzhiyun /* int64 */ /* [2] */
206*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8),
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun /* struct A { */ /* [3] */
209*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 16),
210*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64), /* int m; */
211*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* int64 n; */
212*4882a593Smuzhiyun /* } */
213*4882a593Smuzhiyun BTF_END_RAW,
214*4882a593Smuzhiyun },
215*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0",
216*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0"),
217*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
218*4882a593Smuzhiyun .map_name = "struct_test3_map",
219*4882a593Smuzhiyun .key_size = sizeof(int),
220*4882a593Smuzhiyun .value_size = 16,
221*4882a593Smuzhiyun .key_type_id = 1,
222*4882a593Smuzhiyun .value_type_id = 3,
223*4882a593Smuzhiyun .max_entries = 4,
224*4882a593Smuzhiyun .btf_load_err = true,
225*4882a593Smuzhiyun .err_str = "Invalid member bits_offset",
226*4882a593Smuzhiyun },
227*4882a593Smuzhiyun /*
228*4882a593Smuzhiyun * struct A {
229*4882a593Smuzhiyun * unsigned long long m;
230*4882a593Smuzhiyun * int n;
231*4882a593Smuzhiyun * char o;
232*4882a593Smuzhiyun * [3 bytes hole]
233*4882a593Smuzhiyun * int p[8];
234*4882a593Smuzhiyun * };
235*4882a593Smuzhiyun */
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun .descr = "global data test #1",
238*4882a593Smuzhiyun .raw_types = {
239*4882a593Smuzhiyun /* int */
240*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
241*4882a593Smuzhiyun /* unsigned long long */
242*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
243*4882a593Smuzhiyun /* char */
244*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
245*4882a593Smuzhiyun /* int[8] */
246*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
247*4882a593Smuzhiyun /* struct A { */ /* [5] */
248*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
249*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
250*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
251*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
252*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
253*4882a593Smuzhiyun /* } */
254*4882a593Smuzhiyun BTF_END_RAW,
255*4882a593Smuzhiyun },
256*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p",
257*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p"),
258*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
259*4882a593Smuzhiyun .map_name = "struct_test1_map",
260*4882a593Smuzhiyun .key_size = sizeof(int),
261*4882a593Smuzhiyun .value_size = 48,
262*4882a593Smuzhiyun .key_type_id = 1,
263*4882a593Smuzhiyun .value_type_id = 5,
264*4882a593Smuzhiyun .max_entries = 4,
265*4882a593Smuzhiyun },
266*4882a593Smuzhiyun /*
267*4882a593Smuzhiyun * struct A {
268*4882a593Smuzhiyun * unsigned long long m;
269*4882a593Smuzhiyun * int n;
270*4882a593Smuzhiyun * char o;
271*4882a593Smuzhiyun * [3 bytes hole]
272*4882a593Smuzhiyun * int p[8];
273*4882a593Smuzhiyun * };
274*4882a593Smuzhiyun * static struct A t; <- in .bss
275*4882a593Smuzhiyun */
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun .descr = "global data test #2",
278*4882a593Smuzhiyun .raw_types = {
279*4882a593Smuzhiyun /* int */
280*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
281*4882a593Smuzhiyun /* unsigned long long */
282*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
283*4882a593Smuzhiyun /* char */
284*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
285*4882a593Smuzhiyun /* int[8] */
286*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
287*4882a593Smuzhiyun /* struct A { */ /* [5] */
288*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
289*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
290*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
291*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
292*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
293*4882a593Smuzhiyun /* } */
294*4882a593Smuzhiyun /* static struct A t */
295*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
296*4882a593Smuzhiyun /* .bss section */ /* [7] */
297*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48),
298*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 0, 48),
299*4882a593Smuzhiyun BTF_END_RAW,
300*4882a593Smuzhiyun },
301*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
302*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
303*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
304*4882a593Smuzhiyun .map_name = ".bss",
305*4882a593Smuzhiyun .key_size = sizeof(int),
306*4882a593Smuzhiyun .value_size = 48,
307*4882a593Smuzhiyun .key_type_id = 0,
308*4882a593Smuzhiyun .value_type_id = 7,
309*4882a593Smuzhiyun .max_entries = 1,
310*4882a593Smuzhiyun },
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun .descr = "global data test #3",
313*4882a593Smuzhiyun .raw_types = {
314*4882a593Smuzhiyun /* int */
315*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
316*4882a593Smuzhiyun /* static int t */
317*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */
318*4882a593Smuzhiyun /* .bss section */ /* [3] */
319*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
320*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
321*4882a593Smuzhiyun BTF_END_RAW,
322*4882a593Smuzhiyun },
323*4882a593Smuzhiyun .str_sec = "\0t\0.bss",
324*4882a593Smuzhiyun .str_sec_size = sizeof("\0t\0.bss"),
325*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
326*4882a593Smuzhiyun .map_name = ".bss",
327*4882a593Smuzhiyun .key_size = sizeof(int),
328*4882a593Smuzhiyun .value_size = 4,
329*4882a593Smuzhiyun .key_type_id = 0,
330*4882a593Smuzhiyun .value_type_id = 3,
331*4882a593Smuzhiyun .max_entries = 1,
332*4882a593Smuzhiyun },
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun .descr = "global data test #4, unsupported linkage",
335*4882a593Smuzhiyun .raw_types = {
336*4882a593Smuzhiyun /* int */
337*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
338*4882a593Smuzhiyun /* static int t */
339*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 2), /* [2] */
340*4882a593Smuzhiyun /* .bss section */ /* [3] */
341*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
342*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
343*4882a593Smuzhiyun BTF_END_RAW,
344*4882a593Smuzhiyun },
345*4882a593Smuzhiyun .str_sec = "\0t\0.bss",
346*4882a593Smuzhiyun .str_sec_size = sizeof("\0t\0.bss"),
347*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
348*4882a593Smuzhiyun .map_name = ".bss",
349*4882a593Smuzhiyun .key_size = sizeof(int),
350*4882a593Smuzhiyun .value_size = 4,
351*4882a593Smuzhiyun .key_type_id = 0,
352*4882a593Smuzhiyun .value_type_id = 3,
353*4882a593Smuzhiyun .max_entries = 1,
354*4882a593Smuzhiyun .btf_load_err = true,
355*4882a593Smuzhiyun .err_str = "Linkage not supported",
356*4882a593Smuzhiyun },
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun .descr = "global data test #5, invalid var type",
359*4882a593Smuzhiyun .raw_types = {
360*4882a593Smuzhiyun /* static void t */
361*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 0, 0), /* [1] */
362*4882a593Smuzhiyun /* .bss section */ /* [2] */
363*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
364*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(1, 0, 4),
365*4882a593Smuzhiyun BTF_END_RAW,
366*4882a593Smuzhiyun },
367*4882a593Smuzhiyun .str_sec = "\0t\0.bss",
368*4882a593Smuzhiyun .str_sec_size = sizeof("\0t\0.bss"),
369*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
370*4882a593Smuzhiyun .map_name = ".bss",
371*4882a593Smuzhiyun .key_size = sizeof(int),
372*4882a593Smuzhiyun .value_size = 4,
373*4882a593Smuzhiyun .key_type_id = 0,
374*4882a593Smuzhiyun .value_type_id = 2,
375*4882a593Smuzhiyun .max_entries = 1,
376*4882a593Smuzhiyun .btf_load_err = true,
377*4882a593Smuzhiyun .err_str = "Invalid type_id",
378*4882a593Smuzhiyun },
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun .descr = "global data test #6, invalid var type (fwd type)",
381*4882a593Smuzhiyun .raw_types = {
382*4882a593Smuzhiyun /* union A */
383*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
384*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */
385*4882a593Smuzhiyun /* static union A t */
386*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */
387*4882a593Smuzhiyun /* .bss section */ /* [3] */
388*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
389*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
390*4882a593Smuzhiyun BTF_END_RAW,
391*4882a593Smuzhiyun },
392*4882a593Smuzhiyun .str_sec = "\0A\0t\0.bss",
393*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0.bss"),
394*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
395*4882a593Smuzhiyun .map_name = ".bss",
396*4882a593Smuzhiyun .key_size = sizeof(int),
397*4882a593Smuzhiyun .value_size = 4,
398*4882a593Smuzhiyun .key_type_id = 0,
399*4882a593Smuzhiyun .value_type_id = 2,
400*4882a593Smuzhiyun .max_entries = 1,
401*4882a593Smuzhiyun .btf_load_err = true,
402*4882a593Smuzhiyun .err_str = "Invalid type",
403*4882a593Smuzhiyun },
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun .descr = "global data test #7, invalid var type (fwd type)",
406*4882a593Smuzhiyun .raw_types = {
407*4882a593Smuzhiyun /* union A */
408*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
409*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */
410*4882a593Smuzhiyun /* static union A t */
411*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */
412*4882a593Smuzhiyun /* .bss section */ /* [3] */
413*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
414*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(1, 0, 4),
415*4882a593Smuzhiyun BTF_END_RAW,
416*4882a593Smuzhiyun },
417*4882a593Smuzhiyun .str_sec = "\0A\0t\0.bss",
418*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0.bss"),
419*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
420*4882a593Smuzhiyun .map_name = ".bss",
421*4882a593Smuzhiyun .key_size = sizeof(int),
422*4882a593Smuzhiyun .value_size = 4,
423*4882a593Smuzhiyun .key_type_id = 0,
424*4882a593Smuzhiyun .value_type_id = 2,
425*4882a593Smuzhiyun .max_entries = 1,
426*4882a593Smuzhiyun .btf_load_err = true,
427*4882a593Smuzhiyun .err_str = "Invalid type",
428*4882a593Smuzhiyun },
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun .descr = "global data test #8, invalid var size",
431*4882a593Smuzhiyun .raw_types = {
432*4882a593Smuzhiyun /* int */
433*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
434*4882a593Smuzhiyun /* unsigned long long */
435*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
436*4882a593Smuzhiyun /* char */
437*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
438*4882a593Smuzhiyun /* int[8] */
439*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
440*4882a593Smuzhiyun /* struct A { */ /* [5] */
441*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
442*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
443*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
444*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
445*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
446*4882a593Smuzhiyun /* } */
447*4882a593Smuzhiyun /* static struct A t */
448*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
449*4882a593Smuzhiyun /* .bss section */ /* [7] */
450*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48),
451*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 0, 47),
452*4882a593Smuzhiyun BTF_END_RAW,
453*4882a593Smuzhiyun },
454*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
455*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
456*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
457*4882a593Smuzhiyun .map_name = ".bss",
458*4882a593Smuzhiyun .key_size = sizeof(int),
459*4882a593Smuzhiyun .value_size = 48,
460*4882a593Smuzhiyun .key_type_id = 0,
461*4882a593Smuzhiyun .value_type_id = 7,
462*4882a593Smuzhiyun .max_entries = 1,
463*4882a593Smuzhiyun .btf_load_err = true,
464*4882a593Smuzhiyun .err_str = "Invalid size",
465*4882a593Smuzhiyun },
466*4882a593Smuzhiyun {
467*4882a593Smuzhiyun .descr = "global data test #9, invalid var size",
468*4882a593Smuzhiyun .raw_types = {
469*4882a593Smuzhiyun /* int */
470*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
471*4882a593Smuzhiyun /* unsigned long long */
472*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
473*4882a593Smuzhiyun /* char */
474*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
475*4882a593Smuzhiyun /* int[8] */
476*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
477*4882a593Smuzhiyun /* struct A { */ /* [5] */
478*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
479*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
480*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
481*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
482*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
483*4882a593Smuzhiyun /* } */
484*4882a593Smuzhiyun /* static struct A t */
485*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
486*4882a593Smuzhiyun /* .bss section */ /* [7] */
487*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46),
488*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 0, 48),
489*4882a593Smuzhiyun BTF_END_RAW,
490*4882a593Smuzhiyun },
491*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
492*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
493*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
494*4882a593Smuzhiyun .map_name = ".bss",
495*4882a593Smuzhiyun .key_size = sizeof(int),
496*4882a593Smuzhiyun .value_size = 48,
497*4882a593Smuzhiyun .key_type_id = 0,
498*4882a593Smuzhiyun .value_type_id = 7,
499*4882a593Smuzhiyun .max_entries = 1,
500*4882a593Smuzhiyun .btf_load_err = true,
501*4882a593Smuzhiyun .err_str = "Invalid size",
502*4882a593Smuzhiyun },
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun .descr = "global data test #10, invalid var size",
505*4882a593Smuzhiyun .raw_types = {
506*4882a593Smuzhiyun /* int */
507*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
508*4882a593Smuzhiyun /* unsigned long long */
509*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
510*4882a593Smuzhiyun /* char */
511*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
512*4882a593Smuzhiyun /* int[8] */
513*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
514*4882a593Smuzhiyun /* struct A { */ /* [5] */
515*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
516*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
517*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
518*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
519*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
520*4882a593Smuzhiyun /* } */
521*4882a593Smuzhiyun /* static struct A t */
522*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
523*4882a593Smuzhiyun /* .bss section */ /* [7] */
524*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46),
525*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 0, 46),
526*4882a593Smuzhiyun BTF_END_RAW,
527*4882a593Smuzhiyun },
528*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
529*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
530*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
531*4882a593Smuzhiyun .map_name = ".bss",
532*4882a593Smuzhiyun .key_size = sizeof(int),
533*4882a593Smuzhiyun .value_size = 48,
534*4882a593Smuzhiyun .key_type_id = 0,
535*4882a593Smuzhiyun .value_type_id = 7,
536*4882a593Smuzhiyun .max_entries = 1,
537*4882a593Smuzhiyun .btf_load_err = true,
538*4882a593Smuzhiyun .err_str = "Invalid size",
539*4882a593Smuzhiyun },
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun .descr = "global data test #11, multiple section members",
542*4882a593Smuzhiyun .raw_types = {
543*4882a593Smuzhiyun /* int */
544*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
545*4882a593Smuzhiyun /* unsigned long long */
546*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
547*4882a593Smuzhiyun /* char */
548*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
549*4882a593Smuzhiyun /* int[8] */
550*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
551*4882a593Smuzhiyun /* struct A { */ /* [5] */
552*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
553*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
554*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
555*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
556*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
557*4882a593Smuzhiyun /* } */
558*4882a593Smuzhiyun /* static struct A t */
559*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
560*4882a593Smuzhiyun /* static int u */
561*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */
562*4882a593Smuzhiyun /* .bss section */ /* [8] */
563*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
564*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 10, 48),
565*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(7, 58, 4),
566*4882a593Smuzhiyun BTF_END_RAW,
567*4882a593Smuzhiyun },
568*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
569*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
570*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
571*4882a593Smuzhiyun .map_name = ".bss",
572*4882a593Smuzhiyun .key_size = sizeof(int),
573*4882a593Smuzhiyun .value_size = 62,
574*4882a593Smuzhiyun .key_type_id = 0,
575*4882a593Smuzhiyun .value_type_id = 8,
576*4882a593Smuzhiyun .max_entries = 1,
577*4882a593Smuzhiyun },
578*4882a593Smuzhiyun {
579*4882a593Smuzhiyun .descr = "global data test #12, invalid offset",
580*4882a593Smuzhiyun .raw_types = {
581*4882a593Smuzhiyun /* int */
582*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
583*4882a593Smuzhiyun /* unsigned long long */
584*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
585*4882a593Smuzhiyun /* char */
586*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
587*4882a593Smuzhiyun /* int[8] */
588*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
589*4882a593Smuzhiyun /* struct A { */ /* [5] */
590*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
591*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
592*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
593*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
594*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
595*4882a593Smuzhiyun /* } */
596*4882a593Smuzhiyun /* static struct A t */
597*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
598*4882a593Smuzhiyun /* static int u */
599*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */
600*4882a593Smuzhiyun /* .bss section */ /* [8] */
601*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
602*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 10, 48),
603*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(7, 60, 4),
604*4882a593Smuzhiyun BTF_END_RAW,
605*4882a593Smuzhiyun },
606*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
607*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
608*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
609*4882a593Smuzhiyun .map_name = ".bss",
610*4882a593Smuzhiyun .key_size = sizeof(int),
611*4882a593Smuzhiyun .value_size = 62,
612*4882a593Smuzhiyun .key_type_id = 0,
613*4882a593Smuzhiyun .value_type_id = 8,
614*4882a593Smuzhiyun .max_entries = 1,
615*4882a593Smuzhiyun .btf_load_err = true,
616*4882a593Smuzhiyun .err_str = "Invalid offset+size",
617*4882a593Smuzhiyun },
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun .descr = "global data test #13, invalid offset",
620*4882a593Smuzhiyun .raw_types = {
621*4882a593Smuzhiyun /* int */
622*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
623*4882a593Smuzhiyun /* unsigned long long */
624*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
625*4882a593Smuzhiyun /* char */
626*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
627*4882a593Smuzhiyun /* int[8] */
628*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
629*4882a593Smuzhiyun /* struct A { */ /* [5] */
630*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
631*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
632*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
633*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
634*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
635*4882a593Smuzhiyun /* } */
636*4882a593Smuzhiyun /* static struct A t */
637*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
638*4882a593Smuzhiyun /* static int u */
639*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */
640*4882a593Smuzhiyun /* .bss section */ /* [8] */
641*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
642*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 10, 48),
643*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(7, 12, 4),
644*4882a593Smuzhiyun BTF_END_RAW,
645*4882a593Smuzhiyun },
646*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
647*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
648*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
649*4882a593Smuzhiyun .map_name = ".bss",
650*4882a593Smuzhiyun .key_size = sizeof(int),
651*4882a593Smuzhiyun .value_size = 62,
652*4882a593Smuzhiyun .key_type_id = 0,
653*4882a593Smuzhiyun .value_type_id = 8,
654*4882a593Smuzhiyun .max_entries = 1,
655*4882a593Smuzhiyun .btf_load_err = true,
656*4882a593Smuzhiyun .err_str = "Invalid offset",
657*4882a593Smuzhiyun },
658*4882a593Smuzhiyun {
659*4882a593Smuzhiyun .descr = "global data test #14, invalid offset",
660*4882a593Smuzhiyun .raw_types = {
661*4882a593Smuzhiyun /* int */
662*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
663*4882a593Smuzhiyun /* unsigned long long */
664*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
665*4882a593Smuzhiyun /* char */
666*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */
667*4882a593Smuzhiyun /* int[8] */
668*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
669*4882a593Smuzhiyun /* struct A { */ /* [5] */
670*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
671*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/
672*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */
673*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */
674*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */
675*4882a593Smuzhiyun /* } */
676*4882a593Smuzhiyun /* static struct A t */
677*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
678*4882a593Smuzhiyun /* static int u */
679*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */
680*4882a593Smuzhiyun /* .bss section */ /* [8] */
681*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
682*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(7, 58, 4),
683*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 10, 48),
684*4882a593Smuzhiyun BTF_END_RAW,
685*4882a593Smuzhiyun },
686*4882a593Smuzhiyun .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
687*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
688*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
689*4882a593Smuzhiyun .map_name = ".bss",
690*4882a593Smuzhiyun .key_size = sizeof(int),
691*4882a593Smuzhiyun .value_size = 62,
692*4882a593Smuzhiyun .key_type_id = 0,
693*4882a593Smuzhiyun .value_type_id = 8,
694*4882a593Smuzhiyun .max_entries = 1,
695*4882a593Smuzhiyun .btf_load_err = true,
696*4882a593Smuzhiyun .err_str = "Invalid offset",
697*4882a593Smuzhiyun },
698*4882a593Smuzhiyun {
699*4882a593Smuzhiyun .descr = "global data test #15, not var kind",
700*4882a593Smuzhiyun .raw_types = {
701*4882a593Smuzhiyun /* int */
702*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
703*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */
704*4882a593Smuzhiyun /* .bss section */ /* [3] */
705*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
706*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(1, 0, 4),
707*4882a593Smuzhiyun BTF_END_RAW,
708*4882a593Smuzhiyun },
709*4882a593Smuzhiyun .str_sec = "\0A\0t\0.bss",
710*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0.bss"),
711*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
712*4882a593Smuzhiyun .map_name = ".bss",
713*4882a593Smuzhiyun .key_size = sizeof(int),
714*4882a593Smuzhiyun .value_size = 4,
715*4882a593Smuzhiyun .key_type_id = 0,
716*4882a593Smuzhiyun .value_type_id = 3,
717*4882a593Smuzhiyun .max_entries = 1,
718*4882a593Smuzhiyun .btf_load_err = true,
719*4882a593Smuzhiyun .err_str = "Not a VAR kind member",
720*4882a593Smuzhiyun },
721*4882a593Smuzhiyun {
722*4882a593Smuzhiyun .descr = "global data test #16, invalid var referencing sec",
723*4882a593Smuzhiyun .raw_types = {
724*4882a593Smuzhiyun /* int */
725*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
726*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 5, 0), /* [2] */
727*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 2, 0), /* [3] */
728*4882a593Smuzhiyun /* a section */ /* [4] */
729*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
730*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(3, 0, 4),
731*4882a593Smuzhiyun /* a section */ /* [5] */
732*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
733*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(6, 0, 4),
734*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [6] */
735*4882a593Smuzhiyun BTF_END_RAW,
736*4882a593Smuzhiyun },
737*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
738*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
739*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
740*4882a593Smuzhiyun .map_name = ".bss",
741*4882a593Smuzhiyun .key_size = sizeof(int),
742*4882a593Smuzhiyun .value_size = 4,
743*4882a593Smuzhiyun .key_type_id = 0,
744*4882a593Smuzhiyun .value_type_id = 4,
745*4882a593Smuzhiyun .max_entries = 1,
746*4882a593Smuzhiyun .btf_load_err = true,
747*4882a593Smuzhiyun .err_str = "Invalid type_id",
748*4882a593Smuzhiyun },
749*4882a593Smuzhiyun {
750*4882a593Smuzhiyun .descr = "global data test #17, invalid var referencing var",
751*4882a593Smuzhiyun .raw_types = {
752*4882a593Smuzhiyun /* int */
753*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
754*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */
755*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 2, 0), /* [3] */
756*4882a593Smuzhiyun /* a section */ /* [4] */
757*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
758*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(3, 0, 4),
759*4882a593Smuzhiyun BTF_END_RAW,
760*4882a593Smuzhiyun },
761*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
762*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
763*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
764*4882a593Smuzhiyun .map_name = ".bss",
765*4882a593Smuzhiyun .key_size = sizeof(int),
766*4882a593Smuzhiyun .value_size = 4,
767*4882a593Smuzhiyun .key_type_id = 0,
768*4882a593Smuzhiyun .value_type_id = 4,
769*4882a593Smuzhiyun .max_entries = 1,
770*4882a593Smuzhiyun .btf_load_err = true,
771*4882a593Smuzhiyun .err_str = "Invalid type_id",
772*4882a593Smuzhiyun },
773*4882a593Smuzhiyun {
774*4882a593Smuzhiyun .descr = "global data test #18, invalid var loop",
775*4882a593Smuzhiyun .raw_types = {
776*4882a593Smuzhiyun /* int */
777*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
778*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 2, 0), /* [2] */
779*4882a593Smuzhiyun /* .bss section */ /* [3] */
780*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
781*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
782*4882a593Smuzhiyun BTF_END_RAW,
783*4882a593Smuzhiyun },
784*4882a593Smuzhiyun .str_sec = "\0A\0t\0aaa",
785*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0aaa"),
786*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
787*4882a593Smuzhiyun .map_name = ".bss",
788*4882a593Smuzhiyun .key_size = sizeof(int),
789*4882a593Smuzhiyun .value_size = 4,
790*4882a593Smuzhiyun .key_type_id = 0,
791*4882a593Smuzhiyun .value_type_id = 4,
792*4882a593Smuzhiyun .max_entries = 1,
793*4882a593Smuzhiyun .btf_load_err = true,
794*4882a593Smuzhiyun .err_str = "Invalid type_id",
795*4882a593Smuzhiyun },
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun .descr = "global data test #19, invalid var referencing var",
798*4882a593Smuzhiyun .raw_types = {
799*4882a593Smuzhiyun /* int */
800*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
801*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 3, 0), /* [2] */
802*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */
803*4882a593Smuzhiyun BTF_END_RAW,
804*4882a593Smuzhiyun },
805*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
806*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
807*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
808*4882a593Smuzhiyun .map_name = ".bss",
809*4882a593Smuzhiyun .key_size = sizeof(int),
810*4882a593Smuzhiyun .value_size = 4,
811*4882a593Smuzhiyun .key_type_id = 0,
812*4882a593Smuzhiyun .value_type_id = 4,
813*4882a593Smuzhiyun .max_entries = 1,
814*4882a593Smuzhiyun .btf_load_err = true,
815*4882a593Smuzhiyun .err_str = "Invalid type_id",
816*4882a593Smuzhiyun },
817*4882a593Smuzhiyun {
818*4882a593Smuzhiyun .descr = "global data test #20, invalid ptr referencing var",
819*4882a593Smuzhiyun .raw_types = {
820*4882a593Smuzhiyun /* int */
821*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
822*4882a593Smuzhiyun /* PTR type_id=3 */ /* [2] */
823*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3),
824*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */
825*4882a593Smuzhiyun BTF_END_RAW,
826*4882a593Smuzhiyun },
827*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
828*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
829*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
830*4882a593Smuzhiyun .map_name = ".bss",
831*4882a593Smuzhiyun .key_size = sizeof(int),
832*4882a593Smuzhiyun .value_size = 4,
833*4882a593Smuzhiyun .key_type_id = 0,
834*4882a593Smuzhiyun .value_type_id = 4,
835*4882a593Smuzhiyun .max_entries = 1,
836*4882a593Smuzhiyun .btf_load_err = true,
837*4882a593Smuzhiyun .err_str = "Invalid type_id",
838*4882a593Smuzhiyun },
839*4882a593Smuzhiyun {
840*4882a593Smuzhiyun .descr = "global data test #21, var included in struct",
841*4882a593Smuzhiyun .raw_types = {
842*4882a593Smuzhiyun /* int */
843*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
844*4882a593Smuzhiyun /* struct A { */ /* [2] */
845*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2),
846*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
847*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* VAR type_id=3; */
848*4882a593Smuzhiyun /* } */
849*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */
850*4882a593Smuzhiyun BTF_END_RAW,
851*4882a593Smuzhiyun },
852*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
853*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
854*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
855*4882a593Smuzhiyun .map_name = ".bss",
856*4882a593Smuzhiyun .key_size = sizeof(int),
857*4882a593Smuzhiyun .value_size = 4,
858*4882a593Smuzhiyun .key_type_id = 0,
859*4882a593Smuzhiyun .value_type_id = 4,
860*4882a593Smuzhiyun .max_entries = 1,
861*4882a593Smuzhiyun .btf_load_err = true,
862*4882a593Smuzhiyun .err_str = "Invalid member",
863*4882a593Smuzhiyun },
864*4882a593Smuzhiyun {
865*4882a593Smuzhiyun .descr = "global data test #22, array of var",
866*4882a593Smuzhiyun .raw_types = {
867*4882a593Smuzhiyun /* int */
868*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
869*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */
870*4882a593Smuzhiyun BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */
871*4882a593Smuzhiyun BTF_END_RAW,
872*4882a593Smuzhiyun },
873*4882a593Smuzhiyun .str_sec = "\0A\0t\0s\0a\0a",
874*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
875*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
876*4882a593Smuzhiyun .map_name = ".bss",
877*4882a593Smuzhiyun .key_size = sizeof(int),
878*4882a593Smuzhiyun .value_size = 4,
879*4882a593Smuzhiyun .key_type_id = 0,
880*4882a593Smuzhiyun .value_type_id = 4,
881*4882a593Smuzhiyun .max_entries = 1,
882*4882a593Smuzhiyun .btf_load_err = true,
883*4882a593Smuzhiyun .err_str = "Invalid elem",
884*4882a593Smuzhiyun },
885*4882a593Smuzhiyun /* Test member exceeds the size of struct.
886*4882a593Smuzhiyun *
887*4882a593Smuzhiyun * struct A {
888*4882a593Smuzhiyun * int m;
889*4882a593Smuzhiyun * int n;
890*4882a593Smuzhiyun * };
891*4882a593Smuzhiyun */
892*4882a593Smuzhiyun {
893*4882a593Smuzhiyun .descr = "size check test #1",
894*4882a593Smuzhiyun .raw_types = {
895*4882a593Smuzhiyun /* int */ /* [1] */
896*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
897*4882a593Smuzhiyun /* struct A { */ /* [2] */
898*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1),
899*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
900*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */
901*4882a593Smuzhiyun /* } */
902*4882a593Smuzhiyun BTF_END_RAW,
903*4882a593Smuzhiyun },
904*4882a593Smuzhiyun .str_sec = "\0A\0m\0n",
905*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n"),
906*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
907*4882a593Smuzhiyun .map_name = "size_check1_map",
908*4882a593Smuzhiyun .key_size = sizeof(int),
909*4882a593Smuzhiyun .value_size = 1,
910*4882a593Smuzhiyun .key_type_id = 1,
911*4882a593Smuzhiyun .value_type_id = 2,
912*4882a593Smuzhiyun .max_entries = 4,
913*4882a593Smuzhiyun .btf_load_err = true,
914*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
915*4882a593Smuzhiyun },
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun /* Test member exeeds the size of struct
918*4882a593Smuzhiyun *
919*4882a593Smuzhiyun * struct A {
920*4882a593Smuzhiyun * int m;
921*4882a593Smuzhiyun * int n[2];
922*4882a593Smuzhiyun * };
923*4882a593Smuzhiyun */
924*4882a593Smuzhiyun {
925*4882a593Smuzhiyun .descr = "size check test #2",
926*4882a593Smuzhiyun .raw_types = {
927*4882a593Smuzhiyun /* int */ /* [1] */
928*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
929*4882a593Smuzhiyun /* int[2] */ /* [2] */
930*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 2),
931*4882a593Smuzhiyun /* struct A { */ /* [3] */
932*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 3 - 1),
933*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
934*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* int n[2]; */
935*4882a593Smuzhiyun /* } */
936*4882a593Smuzhiyun BTF_END_RAW,
937*4882a593Smuzhiyun },
938*4882a593Smuzhiyun .str_sec = "\0A\0m\0n",
939*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n"),
940*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
941*4882a593Smuzhiyun .map_name = "size_check2_map",
942*4882a593Smuzhiyun .key_size = sizeof(int),
943*4882a593Smuzhiyun .value_size = 1,
944*4882a593Smuzhiyun .key_type_id = 1,
945*4882a593Smuzhiyun .value_type_id = 3,
946*4882a593Smuzhiyun .max_entries = 4,
947*4882a593Smuzhiyun .btf_load_err = true,
948*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
949*4882a593Smuzhiyun },
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun /* Test member exeeds the size of struct
952*4882a593Smuzhiyun *
953*4882a593Smuzhiyun * struct A {
954*4882a593Smuzhiyun * int m;
955*4882a593Smuzhiyun * void *n;
956*4882a593Smuzhiyun * };
957*4882a593Smuzhiyun */
958*4882a593Smuzhiyun {
959*4882a593Smuzhiyun .descr = "size check test #3",
960*4882a593Smuzhiyun .raw_types = {
961*4882a593Smuzhiyun /* int */ /* [1] */
962*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
963*4882a593Smuzhiyun /* void* */ /* [2] */
964*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
965*4882a593Smuzhiyun /* struct A { */ /* [3] */
966*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) + sizeof(void *) - 1),
967*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
968*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* void *n; */
969*4882a593Smuzhiyun /* } */
970*4882a593Smuzhiyun BTF_END_RAW,
971*4882a593Smuzhiyun },
972*4882a593Smuzhiyun .str_sec = "\0A\0m\0n",
973*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0n"),
974*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
975*4882a593Smuzhiyun .map_name = "size_check3_map",
976*4882a593Smuzhiyun .key_size = sizeof(int),
977*4882a593Smuzhiyun .value_size = 1,
978*4882a593Smuzhiyun .key_type_id = 1,
979*4882a593Smuzhiyun .value_type_id = 3,
980*4882a593Smuzhiyun .max_entries = 4,
981*4882a593Smuzhiyun .btf_load_err = true,
982*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
983*4882a593Smuzhiyun },
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun /* Test member exceeds the size of struct
986*4882a593Smuzhiyun *
987*4882a593Smuzhiyun * enum E {
988*4882a593Smuzhiyun * E0,
989*4882a593Smuzhiyun * E1,
990*4882a593Smuzhiyun * };
991*4882a593Smuzhiyun *
992*4882a593Smuzhiyun * struct A {
993*4882a593Smuzhiyun * int m;
994*4882a593Smuzhiyun * enum E n;
995*4882a593Smuzhiyun * };
996*4882a593Smuzhiyun */
997*4882a593Smuzhiyun {
998*4882a593Smuzhiyun .descr = "size check test #4",
999*4882a593Smuzhiyun .raw_types = {
1000*4882a593Smuzhiyun /* int */ /* [1] */
1001*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1002*4882a593Smuzhiyun /* enum E { */ /* [2] */
1003*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)),
1004*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
1005*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
1006*4882a593Smuzhiyun /* } */
1007*4882a593Smuzhiyun /* struct A { */ /* [3] */
1008*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1),
1009*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */
1010*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* enum E n; */
1011*4882a593Smuzhiyun /* } */
1012*4882a593Smuzhiyun BTF_END_RAW,
1013*4882a593Smuzhiyun },
1014*4882a593Smuzhiyun .str_sec = "\0E\0E0\0E1\0A\0m\0n",
1015*4882a593Smuzhiyun .str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1016*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1017*4882a593Smuzhiyun .map_name = "size_check4_map",
1018*4882a593Smuzhiyun .key_size = sizeof(int),
1019*4882a593Smuzhiyun .value_size = 1,
1020*4882a593Smuzhiyun .key_type_id = 1,
1021*4882a593Smuzhiyun .value_type_id = 3,
1022*4882a593Smuzhiyun .max_entries = 4,
1023*4882a593Smuzhiyun .btf_load_err = true,
1024*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
1025*4882a593Smuzhiyun },
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun /* Test member unexceeds the size of struct
1028*4882a593Smuzhiyun *
1029*4882a593Smuzhiyun * enum E {
1030*4882a593Smuzhiyun * E0,
1031*4882a593Smuzhiyun * E1,
1032*4882a593Smuzhiyun * };
1033*4882a593Smuzhiyun *
1034*4882a593Smuzhiyun * struct A {
1035*4882a593Smuzhiyun * char m;
1036*4882a593Smuzhiyun * enum E __attribute__((packed)) n;
1037*4882a593Smuzhiyun * };
1038*4882a593Smuzhiyun */
1039*4882a593Smuzhiyun {
1040*4882a593Smuzhiyun .descr = "size check test #5",
1041*4882a593Smuzhiyun .raw_types = {
1042*4882a593Smuzhiyun /* int */ /* [1] */
1043*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1044*4882a593Smuzhiyun /* char */ /* [2] */
1045*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),
1046*4882a593Smuzhiyun /* enum E { */ /* [3] */
1047*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 1),
1048*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
1049*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
1050*4882a593Smuzhiyun /* } */
1051*4882a593Smuzhiyun /* struct A { */ /* [4] */
1052*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 2),
1053*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* char m; */
1054*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 8),/* enum E __attribute__((packed)) n; */
1055*4882a593Smuzhiyun /* } */
1056*4882a593Smuzhiyun BTF_END_RAW,
1057*4882a593Smuzhiyun },
1058*4882a593Smuzhiyun .str_sec = "\0E\0E0\0E1\0A\0m\0n",
1059*4882a593Smuzhiyun .str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1060*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1061*4882a593Smuzhiyun .map_name = "size_check5_map",
1062*4882a593Smuzhiyun .key_size = sizeof(int),
1063*4882a593Smuzhiyun .value_size = 2,
1064*4882a593Smuzhiyun .key_type_id = 1,
1065*4882a593Smuzhiyun .value_type_id = 4,
1066*4882a593Smuzhiyun .max_entries = 4,
1067*4882a593Smuzhiyun },
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun /* typedef const void * const_void_ptr;
1070*4882a593Smuzhiyun * struct A {
1071*4882a593Smuzhiyun * const_void_ptr m;
1072*4882a593Smuzhiyun * };
1073*4882a593Smuzhiyun */
1074*4882a593Smuzhiyun {
1075*4882a593Smuzhiyun .descr = "void test #1",
1076*4882a593Smuzhiyun .raw_types = {
1077*4882a593Smuzhiyun /* int */ /* [1] */
1078*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1079*4882a593Smuzhiyun /* const void */ /* [2] */
1080*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1081*4882a593Smuzhiyun /* const void* */ /* [3] */
1082*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1083*4882a593Smuzhiyun /* typedef const void * const_void_ptr */
1084*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 3), /* [4] */
1085*4882a593Smuzhiyun /* struct A { */ /* [5] */
1086*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1087*4882a593Smuzhiyun /* const_void_ptr m; */
1088*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1089*4882a593Smuzhiyun /* } */
1090*4882a593Smuzhiyun BTF_END_RAW,
1091*4882a593Smuzhiyun },
1092*4882a593Smuzhiyun .str_sec = "\0const_void_ptr\0A\0m",
1093*4882a593Smuzhiyun .str_sec_size = sizeof("\0const_void_ptr\0A\0m"),
1094*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1095*4882a593Smuzhiyun .map_name = "void_test1_map",
1096*4882a593Smuzhiyun .key_size = sizeof(int),
1097*4882a593Smuzhiyun .value_size = sizeof(void *),
1098*4882a593Smuzhiyun .key_type_id = 1,
1099*4882a593Smuzhiyun .value_type_id = 4,
1100*4882a593Smuzhiyun .max_entries = 4,
1101*4882a593Smuzhiyun },
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun /* struct A {
1104*4882a593Smuzhiyun * const void m;
1105*4882a593Smuzhiyun * };
1106*4882a593Smuzhiyun */
1107*4882a593Smuzhiyun {
1108*4882a593Smuzhiyun .descr = "void test #2",
1109*4882a593Smuzhiyun .raw_types = {
1110*4882a593Smuzhiyun /* int */ /* [1] */
1111*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1112*4882a593Smuzhiyun /* const void */ /* [2] */
1113*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1114*4882a593Smuzhiyun /* struct A { */ /* [3] */
1115*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 8),
1116*4882a593Smuzhiyun /* const void m; */
1117*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
1118*4882a593Smuzhiyun /* } */
1119*4882a593Smuzhiyun BTF_END_RAW,
1120*4882a593Smuzhiyun },
1121*4882a593Smuzhiyun .str_sec = "\0A\0m",
1122*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m"),
1123*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1124*4882a593Smuzhiyun .map_name = "void_test2_map",
1125*4882a593Smuzhiyun .key_size = sizeof(int),
1126*4882a593Smuzhiyun .value_size = sizeof(void *),
1127*4882a593Smuzhiyun .key_type_id = 1,
1128*4882a593Smuzhiyun .value_type_id = 3,
1129*4882a593Smuzhiyun .max_entries = 4,
1130*4882a593Smuzhiyun .btf_load_err = true,
1131*4882a593Smuzhiyun .err_str = "Invalid member",
1132*4882a593Smuzhiyun },
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun /* typedef const void * const_void_ptr;
1135*4882a593Smuzhiyun * const_void_ptr[4]
1136*4882a593Smuzhiyun */
1137*4882a593Smuzhiyun {
1138*4882a593Smuzhiyun .descr = "void test #3",
1139*4882a593Smuzhiyun .raw_types = {
1140*4882a593Smuzhiyun /* int */ /* [1] */
1141*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1142*4882a593Smuzhiyun /* const void */ /* [2] */
1143*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1144*4882a593Smuzhiyun /* const void* */ /* [3] */
1145*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1146*4882a593Smuzhiyun /* typedef const void * const_void_ptr */
1147*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 3), /* [4] */
1148*4882a593Smuzhiyun /* const_void_ptr[4] */
1149*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [5] */
1150*4882a593Smuzhiyun BTF_END_RAW,
1151*4882a593Smuzhiyun },
1152*4882a593Smuzhiyun .str_sec = "\0const_void_ptr",
1153*4882a593Smuzhiyun .str_sec_size = sizeof("\0const_void_ptr"),
1154*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1155*4882a593Smuzhiyun .map_name = "void_test3_map",
1156*4882a593Smuzhiyun .key_size = sizeof(int),
1157*4882a593Smuzhiyun .value_size = sizeof(void *) * 4,
1158*4882a593Smuzhiyun .key_type_id = 1,
1159*4882a593Smuzhiyun .value_type_id = 5,
1160*4882a593Smuzhiyun .max_entries = 4,
1161*4882a593Smuzhiyun },
1162*4882a593Smuzhiyun
1163*4882a593Smuzhiyun /* const void[4] */
1164*4882a593Smuzhiyun {
1165*4882a593Smuzhiyun .descr = "void test #4",
1166*4882a593Smuzhiyun .raw_types = {
1167*4882a593Smuzhiyun /* int */ /* [1] */
1168*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1169*4882a593Smuzhiyun /* const void */ /* [2] */
1170*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1171*4882a593Smuzhiyun /* const void[4] */ /* [3] */
1172*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 4),
1173*4882a593Smuzhiyun BTF_END_RAW,
1174*4882a593Smuzhiyun },
1175*4882a593Smuzhiyun .str_sec = "\0A\0m",
1176*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m"),
1177*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1178*4882a593Smuzhiyun .map_name = "void_test4_map",
1179*4882a593Smuzhiyun .key_size = sizeof(int),
1180*4882a593Smuzhiyun .value_size = sizeof(void *) * 4,
1181*4882a593Smuzhiyun .key_type_id = 1,
1182*4882a593Smuzhiyun .value_type_id = 3,
1183*4882a593Smuzhiyun .max_entries = 4,
1184*4882a593Smuzhiyun .btf_load_err = true,
1185*4882a593Smuzhiyun .err_str = "Invalid elem",
1186*4882a593Smuzhiyun },
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun /* Array_A <------------------+
1189*4882a593Smuzhiyun * elem_type == Array_B |
1190*4882a593Smuzhiyun * | |
1191*4882a593Smuzhiyun * | |
1192*4882a593Smuzhiyun * Array_B <-------- + |
1193*4882a593Smuzhiyun * elem_type == Array A --+
1194*4882a593Smuzhiyun */
1195*4882a593Smuzhiyun {
1196*4882a593Smuzhiyun .descr = "loop test #1",
1197*4882a593Smuzhiyun .raw_types = {
1198*4882a593Smuzhiyun /* int */ /* [1] */
1199*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1200*4882a593Smuzhiyun /* Array_A */ /* [2] */
1201*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 8),
1202*4882a593Smuzhiyun /* Array_B */ /* [3] */
1203*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 8),
1204*4882a593Smuzhiyun BTF_END_RAW,
1205*4882a593Smuzhiyun },
1206*4882a593Smuzhiyun .str_sec = "",
1207*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1208*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1209*4882a593Smuzhiyun .map_name = "loop_test1_map",
1210*4882a593Smuzhiyun .key_size = sizeof(int),
1211*4882a593Smuzhiyun .value_size = sizeof(sizeof(int) * 8),
1212*4882a593Smuzhiyun .key_type_id = 1,
1213*4882a593Smuzhiyun .value_type_id = 2,
1214*4882a593Smuzhiyun .max_entries = 4,
1215*4882a593Smuzhiyun .btf_load_err = true,
1216*4882a593Smuzhiyun .err_str = "Loop detected",
1217*4882a593Smuzhiyun },
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun /* typedef is _before_ the BTF type of Array_A and Array_B
1220*4882a593Smuzhiyun *
1221*4882a593Smuzhiyun * typedef Array_B int_array;
1222*4882a593Smuzhiyun *
1223*4882a593Smuzhiyun * Array_A <------------------+
1224*4882a593Smuzhiyun * elem_type == int_array |
1225*4882a593Smuzhiyun * | |
1226*4882a593Smuzhiyun * | |
1227*4882a593Smuzhiyun * Array_B <-------- + |
1228*4882a593Smuzhiyun * elem_type == Array_A --+
1229*4882a593Smuzhiyun */
1230*4882a593Smuzhiyun {
1231*4882a593Smuzhiyun .descr = "loop test #2",
1232*4882a593Smuzhiyun .raw_types = {
1233*4882a593Smuzhiyun /* int */
1234*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1235*4882a593Smuzhiyun /* typedef Array_B int_array */
1236*4882a593Smuzhiyun BTF_TYPEDEF_ENC(1, 4), /* [2] */
1237*4882a593Smuzhiyun /* Array_A */
1238*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 8), /* [3] */
1239*4882a593Smuzhiyun /* Array_B */
1240*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 8), /* [4] */
1241*4882a593Smuzhiyun BTF_END_RAW,
1242*4882a593Smuzhiyun },
1243*4882a593Smuzhiyun .str_sec = "\0int_array\0",
1244*4882a593Smuzhiyun .str_sec_size = sizeof("\0int_array"),
1245*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1246*4882a593Smuzhiyun .map_name = "loop_test2_map",
1247*4882a593Smuzhiyun .key_size = sizeof(int),
1248*4882a593Smuzhiyun .value_size = sizeof(sizeof(int) * 8),
1249*4882a593Smuzhiyun .key_type_id = 1,
1250*4882a593Smuzhiyun .value_type_id = 2,
1251*4882a593Smuzhiyun .max_entries = 4,
1252*4882a593Smuzhiyun .btf_load_err = true,
1253*4882a593Smuzhiyun .err_str = "Loop detected",
1254*4882a593Smuzhiyun },
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun /* Array_A <------------------+
1257*4882a593Smuzhiyun * elem_type == Array_B |
1258*4882a593Smuzhiyun * | |
1259*4882a593Smuzhiyun * | |
1260*4882a593Smuzhiyun * Array_B <-------- + |
1261*4882a593Smuzhiyun * elem_type == Array_A --+
1262*4882a593Smuzhiyun */
1263*4882a593Smuzhiyun {
1264*4882a593Smuzhiyun .descr = "loop test #3",
1265*4882a593Smuzhiyun .raw_types = {
1266*4882a593Smuzhiyun /* int */ /* [1] */
1267*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1268*4882a593Smuzhiyun /* Array_A */ /* [2] */
1269*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 8),
1270*4882a593Smuzhiyun /* Array_B */ /* [3] */
1271*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 8),
1272*4882a593Smuzhiyun BTF_END_RAW,
1273*4882a593Smuzhiyun },
1274*4882a593Smuzhiyun .str_sec = "",
1275*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1276*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1277*4882a593Smuzhiyun .map_name = "loop_test3_map",
1278*4882a593Smuzhiyun .key_size = sizeof(int),
1279*4882a593Smuzhiyun .value_size = sizeof(sizeof(int) * 8),
1280*4882a593Smuzhiyun .key_type_id = 1,
1281*4882a593Smuzhiyun .value_type_id = 2,
1282*4882a593Smuzhiyun .max_entries = 4,
1283*4882a593Smuzhiyun .btf_load_err = true,
1284*4882a593Smuzhiyun .err_str = "Loop detected",
1285*4882a593Smuzhiyun },
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun /* typedef is _between_ the BTF type of Array_A and Array_B
1288*4882a593Smuzhiyun *
1289*4882a593Smuzhiyun * typedef Array_B int_array;
1290*4882a593Smuzhiyun *
1291*4882a593Smuzhiyun * Array_A <------------------+
1292*4882a593Smuzhiyun * elem_type == int_array |
1293*4882a593Smuzhiyun * | |
1294*4882a593Smuzhiyun * | |
1295*4882a593Smuzhiyun * Array_B <-------- + |
1296*4882a593Smuzhiyun * elem_type == Array_A --+
1297*4882a593Smuzhiyun */
1298*4882a593Smuzhiyun {
1299*4882a593Smuzhiyun .descr = "loop test #4",
1300*4882a593Smuzhiyun .raw_types = {
1301*4882a593Smuzhiyun /* int */ /* [1] */
1302*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1303*4882a593Smuzhiyun /* Array_A */ /* [2] */
1304*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 8),
1305*4882a593Smuzhiyun /* typedef Array_B int_array */ /* [3] */
1306*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4),
1307*4882a593Smuzhiyun /* Array_B */ /* [4] */
1308*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 8),
1309*4882a593Smuzhiyun BTF_END_RAW,
1310*4882a593Smuzhiyun },
1311*4882a593Smuzhiyun .str_sec = "\0int_array\0",
1312*4882a593Smuzhiyun .str_sec_size = sizeof("\0int_array"),
1313*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1314*4882a593Smuzhiyun .map_name = "loop_test4_map",
1315*4882a593Smuzhiyun .key_size = sizeof(int),
1316*4882a593Smuzhiyun .value_size = sizeof(sizeof(int) * 8),
1317*4882a593Smuzhiyun .key_type_id = 1,
1318*4882a593Smuzhiyun .value_type_id = 2,
1319*4882a593Smuzhiyun .max_entries = 4,
1320*4882a593Smuzhiyun .btf_load_err = true,
1321*4882a593Smuzhiyun .err_str = "Loop detected",
1322*4882a593Smuzhiyun },
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun /* typedef struct B Struct_B
1325*4882a593Smuzhiyun *
1326*4882a593Smuzhiyun * struct A {
1327*4882a593Smuzhiyun * int x;
1328*4882a593Smuzhiyun * Struct_B y;
1329*4882a593Smuzhiyun * };
1330*4882a593Smuzhiyun *
1331*4882a593Smuzhiyun * struct B {
1332*4882a593Smuzhiyun * int x;
1333*4882a593Smuzhiyun * struct A y;
1334*4882a593Smuzhiyun * };
1335*4882a593Smuzhiyun */
1336*4882a593Smuzhiyun {
1337*4882a593Smuzhiyun .descr = "loop test #5",
1338*4882a593Smuzhiyun .raw_types = {
1339*4882a593Smuzhiyun /* int */
1340*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1341*4882a593Smuzhiyun /* struct A */ /* [2] */
1342*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1343*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */
1344*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* Struct_B y; */
1345*4882a593Smuzhiyun /* typedef struct B Struct_B */
1346*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */
1347*4882a593Smuzhiyun /* struct B */ /* [4] */
1348*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1349*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */
1350*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A y; */
1351*4882a593Smuzhiyun BTF_END_RAW,
1352*4882a593Smuzhiyun },
1353*4882a593Smuzhiyun .str_sec = "\0A\0x\0y\0Struct_B\0B\0x\0y",
1354*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0x\0y\0Struct_B\0B\0x\0y"),
1355*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1356*4882a593Smuzhiyun .map_name = "loop_test5_map",
1357*4882a593Smuzhiyun .key_size = sizeof(int),
1358*4882a593Smuzhiyun .value_size = 8,
1359*4882a593Smuzhiyun .key_type_id = 1,
1360*4882a593Smuzhiyun .value_type_id = 2,
1361*4882a593Smuzhiyun .max_entries = 4,
1362*4882a593Smuzhiyun .btf_load_err = true,
1363*4882a593Smuzhiyun .err_str = "Loop detected",
1364*4882a593Smuzhiyun },
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun /* struct A {
1367*4882a593Smuzhiyun * int x;
1368*4882a593Smuzhiyun * struct A array_a[4];
1369*4882a593Smuzhiyun * };
1370*4882a593Smuzhiyun */
1371*4882a593Smuzhiyun {
1372*4882a593Smuzhiyun .descr = "loop test #6",
1373*4882a593Smuzhiyun .raw_types = {
1374*4882a593Smuzhiyun /* int */
1375*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1376*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */
1377*4882a593Smuzhiyun /* struct A */ /* [3] */
1378*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1379*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */
1380*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A array_a[4]; */
1381*4882a593Smuzhiyun BTF_END_RAW,
1382*4882a593Smuzhiyun },
1383*4882a593Smuzhiyun .str_sec = "\0A\0x\0y",
1384*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0x\0y"),
1385*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1386*4882a593Smuzhiyun .map_name = "loop_test6_map",
1387*4882a593Smuzhiyun .key_size = sizeof(int),
1388*4882a593Smuzhiyun .value_size = 8,
1389*4882a593Smuzhiyun .key_type_id = 1,
1390*4882a593Smuzhiyun .value_type_id = 2,
1391*4882a593Smuzhiyun .max_entries = 4,
1392*4882a593Smuzhiyun .btf_load_err = true,
1393*4882a593Smuzhiyun .err_str = "Loop detected",
1394*4882a593Smuzhiyun },
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyun {
1397*4882a593Smuzhiyun .descr = "loop test #7",
1398*4882a593Smuzhiyun .raw_types = {
1399*4882a593Smuzhiyun /* int */ /* [1] */
1400*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1401*4882a593Smuzhiyun /* struct A { */ /* [2] */
1402*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1403*4882a593Smuzhiyun /* const void *m; */
1404*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, 0),
1405*4882a593Smuzhiyun /* CONST type_id=3 */ /* [3] */
1406*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1407*4882a593Smuzhiyun /* PTR type_id=2 */ /* [4] */
1408*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3),
1409*4882a593Smuzhiyun BTF_END_RAW,
1410*4882a593Smuzhiyun },
1411*4882a593Smuzhiyun .str_sec = "\0A\0m",
1412*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m"),
1413*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1414*4882a593Smuzhiyun .map_name = "loop_test7_map",
1415*4882a593Smuzhiyun .key_size = sizeof(int),
1416*4882a593Smuzhiyun .value_size = sizeof(void *),
1417*4882a593Smuzhiyun .key_type_id = 1,
1418*4882a593Smuzhiyun .value_type_id = 2,
1419*4882a593Smuzhiyun .max_entries = 4,
1420*4882a593Smuzhiyun .btf_load_err = true,
1421*4882a593Smuzhiyun .err_str = "Loop detected",
1422*4882a593Smuzhiyun },
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun {
1425*4882a593Smuzhiyun .descr = "loop test #8",
1426*4882a593Smuzhiyun .raw_types = {
1427*4882a593Smuzhiyun /* int */ /* [1] */
1428*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1429*4882a593Smuzhiyun /* struct A { */ /* [2] */
1430*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1431*4882a593Smuzhiyun /* const void *m; */
1432*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1433*4882a593Smuzhiyun /* struct B { */ /* [3] */
1434*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1435*4882a593Smuzhiyun /* const void *n; */
1436*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, 0),
1437*4882a593Smuzhiyun /* CONST type_id=5 */ /* [4] */
1438*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 5),
1439*4882a593Smuzhiyun /* PTR type_id=6 */ /* [5] */
1440*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 6),
1441*4882a593Smuzhiyun /* CONST type_id=7 */ /* [6] */
1442*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 7),
1443*4882a593Smuzhiyun /* PTR type_id=4 */ /* [7] */
1444*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 4),
1445*4882a593Smuzhiyun BTF_END_RAW,
1446*4882a593Smuzhiyun },
1447*4882a593Smuzhiyun .str_sec = "\0A\0m\0B\0n",
1448*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0m\0B\0n"),
1449*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1450*4882a593Smuzhiyun .map_name = "loop_test8_map",
1451*4882a593Smuzhiyun .key_size = sizeof(int),
1452*4882a593Smuzhiyun .value_size = sizeof(void *),
1453*4882a593Smuzhiyun .key_type_id = 1,
1454*4882a593Smuzhiyun .value_type_id = 2,
1455*4882a593Smuzhiyun .max_entries = 4,
1456*4882a593Smuzhiyun .btf_load_err = true,
1457*4882a593Smuzhiyun .err_str = "Loop detected",
1458*4882a593Smuzhiyun },
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun {
1461*4882a593Smuzhiyun .descr = "string section does not end with null",
1462*4882a593Smuzhiyun .raw_types = {
1463*4882a593Smuzhiyun /* int */ /* [1] */
1464*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1465*4882a593Smuzhiyun BTF_END_RAW,
1466*4882a593Smuzhiyun },
1467*4882a593Smuzhiyun .str_sec = "\0int",
1468*4882a593Smuzhiyun .str_sec_size = sizeof("\0int") - 1,
1469*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1470*4882a593Smuzhiyun .map_name = "hdr_test_map",
1471*4882a593Smuzhiyun .key_size = sizeof(int),
1472*4882a593Smuzhiyun .value_size = sizeof(int),
1473*4882a593Smuzhiyun .key_type_id = 1,
1474*4882a593Smuzhiyun .value_type_id = 1,
1475*4882a593Smuzhiyun .max_entries = 4,
1476*4882a593Smuzhiyun .btf_load_err = true,
1477*4882a593Smuzhiyun .err_str = "Invalid string section",
1478*4882a593Smuzhiyun },
1479*4882a593Smuzhiyun
1480*4882a593Smuzhiyun {
1481*4882a593Smuzhiyun .descr = "empty string section",
1482*4882a593Smuzhiyun .raw_types = {
1483*4882a593Smuzhiyun /* int */ /* [1] */
1484*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1485*4882a593Smuzhiyun BTF_END_RAW,
1486*4882a593Smuzhiyun },
1487*4882a593Smuzhiyun .str_sec = "",
1488*4882a593Smuzhiyun .str_sec_size = 0,
1489*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1490*4882a593Smuzhiyun .map_name = "hdr_test_map",
1491*4882a593Smuzhiyun .key_size = sizeof(int),
1492*4882a593Smuzhiyun .value_size = sizeof(int),
1493*4882a593Smuzhiyun .key_type_id = 1,
1494*4882a593Smuzhiyun .value_type_id = 1,
1495*4882a593Smuzhiyun .max_entries = 4,
1496*4882a593Smuzhiyun .btf_load_err = true,
1497*4882a593Smuzhiyun .err_str = "Invalid string section",
1498*4882a593Smuzhiyun },
1499*4882a593Smuzhiyun
1500*4882a593Smuzhiyun {
1501*4882a593Smuzhiyun .descr = "empty type section",
1502*4882a593Smuzhiyun .raw_types = {
1503*4882a593Smuzhiyun BTF_END_RAW,
1504*4882a593Smuzhiyun },
1505*4882a593Smuzhiyun .str_sec = "\0int",
1506*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1507*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1508*4882a593Smuzhiyun .map_name = "hdr_test_map",
1509*4882a593Smuzhiyun .key_size = sizeof(int),
1510*4882a593Smuzhiyun .value_size = sizeof(int),
1511*4882a593Smuzhiyun .key_type_id = 1,
1512*4882a593Smuzhiyun .value_type_id = 1,
1513*4882a593Smuzhiyun .max_entries = 4,
1514*4882a593Smuzhiyun .btf_load_err = true,
1515*4882a593Smuzhiyun .err_str = "No type found",
1516*4882a593Smuzhiyun },
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun {
1519*4882a593Smuzhiyun .descr = "btf_header test. Longer hdr_len",
1520*4882a593Smuzhiyun .raw_types = {
1521*4882a593Smuzhiyun /* int */ /* [1] */
1522*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1523*4882a593Smuzhiyun BTF_END_RAW,
1524*4882a593Smuzhiyun },
1525*4882a593Smuzhiyun .str_sec = "\0int",
1526*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1527*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1528*4882a593Smuzhiyun .map_name = "hdr_test_map",
1529*4882a593Smuzhiyun .key_size = sizeof(int),
1530*4882a593Smuzhiyun .value_size = sizeof(int),
1531*4882a593Smuzhiyun .key_type_id = 1,
1532*4882a593Smuzhiyun .value_type_id = 1,
1533*4882a593Smuzhiyun .max_entries = 4,
1534*4882a593Smuzhiyun .btf_load_err = true,
1535*4882a593Smuzhiyun .hdr_len_delta = 4,
1536*4882a593Smuzhiyun .err_str = "Unsupported btf_header",
1537*4882a593Smuzhiyun },
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun {
1540*4882a593Smuzhiyun .descr = "btf_header test. Gap between hdr and type",
1541*4882a593Smuzhiyun .raw_types = {
1542*4882a593Smuzhiyun /* int */ /* [1] */
1543*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1544*4882a593Smuzhiyun BTF_END_RAW,
1545*4882a593Smuzhiyun },
1546*4882a593Smuzhiyun .str_sec = "\0int",
1547*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1548*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1549*4882a593Smuzhiyun .map_name = "hdr_test_map",
1550*4882a593Smuzhiyun .key_size = sizeof(int),
1551*4882a593Smuzhiyun .value_size = sizeof(int),
1552*4882a593Smuzhiyun .key_type_id = 1,
1553*4882a593Smuzhiyun .value_type_id = 1,
1554*4882a593Smuzhiyun .max_entries = 4,
1555*4882a593Smuzhiyun .btf_load_err = true,
1556*4882a593Smuzhiyun .type_off_delta = 4,
1557*4882a593Smuzhiyun .err_str = "Unsupported section found",
1558*4882a593Smuzhiyun },
1559*4882a593Smuzhiyun
1560*4882a593Smuzhiyun {
1561*4882a593Smuzhiyun .descr = "btf_header test. Gap between type and str",
1562*4882a593Smuzhiyun .raw_types = {
1563*4882a593Smuzhiyun /* int */ /* [1] */
1564*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1565*4882a593Smuzhiyun BTF_END_RAW,
1566*4882a593Smuzhiyun },
1567*4882a593Smuzhiyun .str_sec = "\0int",
1568*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1569*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1570*4882a593Smuzhiyun .map_name = "hdr_test_map",
1571*4882a593Smuzhiyun .key_size = sizeof(int),
1572*4882a593Smuzhiyun .value_size = sizeof(int),
1573*4882a593Smuzhiyun .key_type_id = 1,
1574*4882a593Smuzhiyun .value_type_id = 1,
1575*4882a593Smuzhiyun .max_entries = 4,
1576*4882a593Smuzhiyun .btf_load_err = true,
1577*4882a593Smuzhiyun .str_off_delta = 4,
1578*4882a593Smuzhiyun .err_str = "Unsupported section found",
1579*4882a593Smuzhiyun },
1580*4882a593Smuzhiyun
1581*4882a593Smuzhiyun {
1582*4882a593Smuzhiyun .descr = "btf_header test. Overlap between type and str",
1583*4882a593Smuzhiyun .raw_types = {
1584*4882a593Smuzhiyun /* int */ /* [1] */
1585*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1586*4882a593Smuzhiyun BTF_END_RAW,
1587*4882a593Smuzhiyun },
1588*4882a593Smuzhiyun .str_sec = "\0int",
1589*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1590*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1591*4882a593Smuzhiyun .map_name = "hdr_test_map",
1592*4882a593Smuzhiyun .key_size = sizeof(int),
1593*4882a593Smuzhiyun .value_size = sizeof(int),
1594*4882a593Smuzhiyun .key_type_id = 1,
1595*4882a593Smuzhiyun .value_type_id = 1,
1596*4882a593Smuzhiyun .max_entries = 4,
1597*4882a593Smuzhiyun .btf_load_err = true,
1598*4882a593Smuzhiyun .str_off_delta = -4,
1599*4882a593Smuzhiyun .err_str = "Section overlap found",
1600*4882a593Smuzhiyun },
1601*4882a593Smuzhiyun
1602*4882a593Smuzhiyun {
1603*4882a593Smuzhiyun .descr = "btf_header test. Larger BTF size",
1604*4882a593Smuzhiyun .raw_types = {
1605*4882a593Smuzhiyun /* int */ /* [1] */
1606*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1607*4882a593Smuzhiyun BTF_END_RAW,
1608*4882a593Smuzhiyun },
1609*4882a593Smuzhiyun .str_sec = "\0int",
1610*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1611*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1612*4882a593Smuzhiyun .map_name = "hdr_test_map",
1613*4882a593Smuzhiyun .key_size = sizeof(int),
1614*4882a593Smuzhiyun .value_size = sizeof(int),
1615*4882a593Smuzhiyun .key_type_id = 1,
1616*4882a593Smuzhiyun .value_type_id = 1,
1617*4882a593Smuzhiyun .max_entries = 4,
1618*4882a593Smuzhiyun .btf_load_err = true,
1619*4882a593Smuzhiyun .str_len_delta = -4,
1620*4882a593Smuzhiyun .err_str = "Unsupported section found",
1621*4882a593Smuzhiyun },
1622*4882a593Smuzhiyun
1623*4882a593Smuzhiyun {
1624*4882a593Smuzhiyun .descr = "btf_header test. Smaller BTF size",
1625*4882a593Smuzhiyun .raw_types = {
1626*4882a593Smuzhiyun /* int */ /* [1] */
1627*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1628*4882a593Smuzhiyun BTF_END_RAW,
1629*4882a593Smuzhiyun },
1630*4882a593Smuzhiyun .str_sec = "\0int",
1631*4882a593Smuzhiyun .str_sec_size = sizeof("\0int"),
1632*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1633*4882a593Smuzhiyun .map_name = "hdr_test_map",
1634*4882a593Smuzhiyun .key_size = sizeof(int),
1635*4882a593Smuzhiyun .value_size = sizeof(int),
1636*4882a593Smuzhiyun .key_type_id = 1,
1637*4882a593Smuzhiyun .value_type_id = 1,
1638*4882a593Smuzhiyun .max_entries = 4,
1639*4882a593Smuzhiyun .btf_load_err = true,
1640*4882a593Smuzhiyun .str_len_delta = 4,
1641*4882a593Smuzhiyun .err_str = "Total section length too long",
1642*4882a593Smuzhiyun },
1643*4882a593Smuzhiyun
1644*4882a593Smuzhiyun {
1645*4882a593Smuzhiyun .descr = "array test. index_type/elem_type \"int\"",
1646*4882a593Smuzhiyun .raw_types = {
1647*4882a593Smuzhiyun /* int */ /* [1] */
1648*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1649*4882a593Smuzhiyun /* int[16] */ /* [2] */
1650*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 16),
1651*4882a593Smuzhiyun BTF_END_RAW,
1652*4882a593Smuzhiyun },
1653*4882a593Smuzhiyun .str_sec = "",
1654*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1655*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1656*4882a593Smuzhiyun .map_name = "array_test_map",
1657*4882a593Smuzhiyun .key_size = sizeof(int),
1658*4882a593Smuzhiyun .value_size = sizeof(int),
1659*4882a593Smuzhiyun .key_type_id = 1,
1660*4882a593Smuzhiyun .value_type_id = 1,
1661*4882a593Smuzhiyun .max_entries = 4,
1662*4882a593Smuzhiyun },
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun {
1665*4882a593Smuzhiyun .descr = "array test. index_type/elem_type \"const int\"",
1666*4882a593Smuzhiyun .raw_types = {
1667*4882a593Smuzhiyun /* int */ /* [1] */
1668*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1669*4882a593Smuzhiyun /* int[16] */ /* [2] */
1670*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 3, 16),
1671*4882a593Smuzhiyun /* CONST type_id=1 */ /* [3] */
1672*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),
1673*4882a593Smuzhiyun BTF_END_RAW,
1674*4882a593Smuzhiyun },
1675*4882a593Smuzhiyun .str_sec = "",
1676*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1677*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1678*4882a593Smuzhiyun .map_name = "array_test_map",
1679*4882a593Smuzhiyun .key_size = sizeof(int),
1680*4882a593Smuzhiyun .value_size = sizeof(int),
1681*4882a593Smuzhiyun .key_type_id = 1,
1682*4882a593Smuzhiyun .value_type_id = 1,
1683*4882a593Smuzhiyun .max_entries = 4,
1684*4882a593Smuzhiyun },
1685*4882a593Smuzhiyun
1686*4882a593Smuzhiyun {
1687*4882a593Smuzhiyun .descr = "array test. index_type \"const int:31\"",
1688*4882a593Smuzhiyun .raw_types = {
1689*4882a593Smuzhiyun /* int */ /* [1] */
1690*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1691*4882a593Smuzhiyun /* int:31 */ /* [2] */
1692*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1693*4882a593Smuzhiyun /* int[16] */ /* [3] */
1694*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 4, 16),
1695*4882a593Smuzhiyun /* CONST type_id=2 */ /* [4] */
1696*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1697*4882a593Smuzhiyun BTF_END_RAW,
1698*4882a593Smuzhiyun },
1699*4882a593Smuzhiyun .str_sec = "",
1700*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1701*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1702*4882a593Smuzhiyun .map_name = "array_test_map",
1703*4882a593Smuzhiyun .key_size = sizeof(int),
1704*4882a593Smuzhiyun .value_size = sizeof(int),
1705*4882a593Smuzhiyun .key_type_id = 1,
1706*4882a593Smuzhiyun .value_type_id = 1,
1707*4882a593Smuzhiyun .max_entries = 4,
1708*4882a593Smuzhiyun .btf_load_err = true,
1709*4882a593Smuzhiyun .err_str = "Invalid index",
1710*4882a593Smuzhiyun },
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun {
1713*4882a593Smuzhiyun .descr = "array test. elem_type \"const int:31\"",
1714*4882a593Smuzhiyun .raw_types = {
1715*4882a593Smuzhiyun /* int */ /* [1] */
1716*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1717*4882a593Smuzhiyun /* int:31 */ /* [2] */
1718*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1719*4882a593Smuzhiyun /* int[16] */ /* [3] */
1720*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(4, 1, 16),
1721*4882a593Smuzhiyun /* CONST type_id=2 */ /* [4] */
1722*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1723*4882a593Smuzhiyun BTF_END_RAW,
1724*4882a593Smuzhiyun },
1725*4882a593Smuzhiyun .str_sec = "",
1726*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1727*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1728*4882a593Smuzhiyun .map_name = "array_test_map",
1729*4882a593Smuzhiyun .key_size = sizeof(int),
1730*4882a593Smuzhiyun .value_size = sizeof(int),
1731*4882a593Smuzhiyun .key_type_id = 1,
1732*4882a593Smuzhiyun .value_type_id = 1,
1733*4882a593Smuzhiyun .max_entries = 4,
1734*4882a593Smuzhiyun .btf_load_err = true,
1735*4882a593Smuzhiyun .err_str = "Invalid array of int",
1736*4882a593Smuzhiyun },
1737*4882a593Smuzhiyun
1738*4882a593Smuzhiyun {
1739*4882a593Smuzhiyun .descr = "array test. index_type \"void\"",
1740*4882a593Smuzhiyun .raw_types = {
1741*4882a593Smuzhiyun /* int */ /* [1] */
1742*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1743*4882a593Smuzhiyun /* int[16] */ /* [2] */
1744*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 0, 16),
1745*4882a593Smuzhiyun BTF_END_RAW,
1746*4882a593Smuzhiyun },
1747*4882a593Smuzhiyun .str_sec = "",
1748*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1749*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1750*4882a593Smuzhiyun .map_name = "array_test_map",
1751*4882a593Smuzhiyun .key_size = sizeof(int),
1752*4882a593Smuzhiyun .value_size = sizeof(int),
1753*4882a593Smuzhiyun .key_type_id = 1,
1754*4882a593Smuzhiyun .value_type_id = 1,
1755*4882a593Smuzhiyun .max_entries = 4,
1756*4882a593Smuzhiyun .btf_load_err = true,
1757*4882a593Smuzhiyun .err_str = "Invalid index",
1758*4882a593Smuzhiyun },
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun {
1761*4882a593Smuzhiyun .descr = "array test. index_type \"const void\"",
1762*4882a593Smuzhiyun .raw_types = {
1763*4882a593Smuzhiyun /* int */ /* [1] */
1764*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1765*4882a593Smuzhiyun /* int[16] */ /* [2] */
1766*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 3, 16),
1767*4882a593Smuzhiyun /* CONST type_id=0 (void) */ /* [3] */
1768*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1769*4882a593Smuzhiyun BTF_END_RAW,
1770*4882a593Smuzhiyun },
1771*4882a593Smuzhiyun .str_sec = "",
1772*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1773*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1774*4882a593Smuzhiyun .map_name = "array_test_map",
1775*4882a593Smuzhiyun .key_size = sizeof(int),
1776*4882a593Smuzhiyun .value_size = sizeof(int),
1777*4882a593Smuzhiyun .key_type_id = 1,
1778*4882a593Smuzhiyun .value_type_id = 1,
1779*4882a593Smuzhiyun .max_entries = 4,
1780*4882a593Smuzhiyun .btf_load_err = true,
1781*4882a593Smuzhiyun .err_str = "Invalid index",
1782*4882a593Smuzhiyun },
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun {
1785*4882a593Smuzhiyun .descr = "array test. elem_type \"const void\"",
1786*4882a593Smuzhiyun .raw_types = {
1787*4882a593Smuzhiyun /* int */ /* [1] */
1788*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1789*4882a593Smuzhiyun /* int[16] */ /* [2] */
1790*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 16),
1791*4882a593Smuzhiyun /* CONST type_id=0 (void) */ /* [3] */
1792*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1793*4882a593Smuzhiyun BTF_END_RAW,
1794*4882a593Smuzhiyun },
1795*4882a593Smuzhiyun .str_sec = "",
1796*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1797*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1798*4882a593Smuzhiyun .map_name = "array_test_map",
1799*4882a593Smuzhiyun .key_size = sizeof(int),
1800*4882a593Smuzhiyun .value_size = sizeof(int),
1801*4882a593Smuzhiyun .key_type_id = 1,
1802*4882a593Smuzhiyun .value_type_id = 1,
1803*4882a593Smuzhiyun .max_entries = 4,
1804*4882a593Smuzhiyun .btf_load_err = true,
1805*4882a593Smuzhiyun .err_str = "Invalid elem",
1806*4882a593Smuzhiyun },
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun {
1809*4882a593Smuzhiyun .descr = "array test. elem_type \"const void *\"",
1810*4882a593Smuzhiyun .raw_types = {
1811*4882a593Smuzhiyun /* int */ /* [1] */
1812*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1813*4882a593Smuzhiyun /* const void *[16] */ /* [2] */
1814*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 1, 16),
1815*4882a593Smuzhiyun /* CONST type_id=4 */ /* [3] */
1816*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1817*4882a593Smuzhiyun /* void* */ /* [4] */
1818*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1819*4882a593Smuzhiyun BTF_END_RAW,
1820*4882a593Smuzhiyun },
1821*4882a593Smuzhiyun .str_sec = "",
1822*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1823*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1824*4882a593Smuzhiyun .map_name = "array_test_map",
1825*4882a593Smuzhiyun .key_size = sizeof(int),
1826*4882a593Smuzhiyun .value_size = sizeof(int),
1827*4882a593Smuzhiyun .key_type_id = 1,
1828*4882a593Smuzhiyun .value_type_id = 1,
1829*4882a593Smuzhiyun .max_entries = 4,
1830*4882a593Smuzhiyun },
1831*4882a593Smuzhiyun
1832*4882a593Smuzhiyun {
1833*4882a593Smuzhiyun .descr = "array test. index_type \"const void *\"",
1834*4882a593Smuzhiyun .raw_types = {
1835*4882a593Smuzhiyun /* int */ /* [1] */
1836*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1837*4882a593Smuzhiyun /* const void *[16] */ /* [2] */
1838*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(3, 3, 16),
1839*4882a593Smuzhiyun /* CONST type_id=4 */ /* [3] */
1840*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1841*4882a593Smuzhiyun /* void* */ /* [4] */
1842*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1843*4882a593Smuzhiyun BTF_END_RAW,
1844*4882a593Smuzhiyun },
1845*4882a593Smuzhiyun .str_sec = "",
1846*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1847*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1848*4882a593Smuzhiyun .map_name = "array_test_map",
1849*4882a593Smuzhiyun .key_size = sizeof(int),
1850*4882a593Smuzhiyun .value_size = sizeof(int),
1851*4882a593Smuzhiyun .key_type_id = 1,
1852*4882a593Smuzhiyun .value_type_id = 1,
1853*4882a593Smuzhiyun .max_entries = 4,
1854*4882a593Smuzhiyun .btf_load_err = true,
1855*4882a593Smuzhiyun .err_str = "Invalid index",
1856*4882a593Smuzhiyun },
1857*4882a593Smuzhiyun
1858*4882a593Smuzhiyun {
1859*4882a593Smuzhiyun .descr = "array test. t->size != 0\"",
1860*4882a593Smuzhiyun .raw_types = {
1861*4882a593Smuzhiyun /* int */ /* [1] */
1862*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1863*4882a593Smuzhiyun /* int[16] */ /* [2] */
1864*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 1),
1865*4882a593Smuzhiyun BTF_ARRAY_ENC(1, 1, 16),
1866*4882a593Smuzhiyun BTF_END_RAW,
1867*4882a593Smuzhiyun },
1868*4882a593Smuzhiyun .str_sec = "",
1869*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1870*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1871*4882a593Smuzhiyun .map_name = "array_test_map",
1872*4882a593Smuzhiyun .key_size = sizeof(int),
1873*4882a593Smuzhiyun .value_size = sizeof(int),
1874*4882a593Smuzhiyun .key_type_id = 1,
1875*4882a593Smuzhiyun .value_type_id = 1,
1876*4882a593Smuzhiyun .max_entries = 4,
1877*4882a593Smuzhiyun .btf_load_err = true,
1878*4882a593Smuzhiyun .err_str = "size != 0",
1879*4882a593Smuzhiyun },
1880*4882a593Smuzhiyun
1881*4882a593Smuzhiyun {
1882*4882a593Smuzhiyun .descr = "int test. invalid int_data",
1883*4882a593Smuzhiyun .raw_types = {
1884*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), 4),
1885*4882a593Smuzhiyun 0x10000000,
1886*4882a593Smuzhiyun BTF_END_RAW,
1887*4882a593Smuzhiyun },
1888*4882a593Smuzhiyun .str_sec = "",
1889*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1890*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1891*4882a593Smuzhiyun .map_name = "array_test_map",
1892*4882a593Smuzhiyun .key_size = sizeof(int),
1893*4882a593Smuzhiyun .value_size = sizeof(int),
1894*4882a593Smuzhiyun .key_type_id = 1,
1895*4882a593Smuzhiyun .value_type_id = 1,
1896*4882a593Smuzhiyun .max_entries = 4,
1897*4882a593Smuzhiyun .btf_load_err = true,
1898*4882a593Smuzhiyun .err_str = "Invalid int_data",
1899*4882a593Smuzhiyun },
1900*4882a593Smuzhiyun
1901*4882a593Smuzhiyun {
1902*4882a593Smuzhiyun .descr = "invalid BTF_INFO",
1903*4882a593Smuzhiyun .raw_types = {
1904*4882a593Smuzhiyun /* int */ /* [1] */
1905*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1906*4882a593Smuzhiyun BTF_TYPE_ENC(0, 0x10000000, 4),
1907*4882a593Smuzhiyun BTF_END_RAW,
1908*4882a593Smuzhiyun },
1909*4882a593Smuzhiyun .str_sec = "",
1910*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1911*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1912*4882a593Smuzhiyun .map_name = "array_test_map",
1913*4882a593Smuzhiyun .key_size = sizeof(int),
1914*4882a593Smuzhiyun .value_size = sizeof(int),
1915*4882a593Smuzhiyun .key_type_id = 1,
1916*4882a593Smuzhiyun .value_type_id = 1,
1917*4882a593Smuzhiyun .max_entries = 4,
1918*4882a593Smuzhiyun .btf_load_err = true,
1919*4882a593Smuzhiyun .err_str = "Invalid btf_info",
1920*4882a593Smuzhiyun },
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun {
1923*4882a593Smuzhiyun .descr = "fwd test. t->type != 0\"",
1924*4882a593Smuzhiyun .raw_types = {
1925*4882a593Smuzhiyun /* int */ /* [1] */
1926*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1927*4882a593Smuzhiyun /* fwd type */ /* [2] */
1928*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 1),
1929*4882a593Smuzhiyun BTF_END_RAW,
1930*4882a593Smuzhiyun },
1931*4882a593Smuzhiyun .str_sec = "",
1932*4882a593Smuzhiyun .str_sec_size = sizeof(""),
1933*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1934*4882a593Smuzhiyun .map_name = "fwd_test_map",
1935*4882a593Smuzhiyun .key_size = sizeof(int),
1936*4882a593Smuzhiyun .value_size = sizeof(int),
1937*4882a593Smuzhiyun .key_type_id = 1,
1938*4882a593Smuzhiyun .value_type_id = 1,
1939*4882a593Smuzhiyun .max_entries = 4,
1940*4882a593Smuzhiyun .btf_load_err = true,
1941*4882a593Smuzhiyun .err_str = "type != 0",
1942*4882a593Smuzhiyun },
1943*4882a593Smuzhiyun
1944*4882a593Smuzhiyun {
1945*4882a593Smuzhiyun .descr = "typedef (invalid name, name_off = 0)",
1946*4882a593Smuzhiyun .raw_types = {
1947*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1948*4882a593Smuzhiyun BTF_TYPEDEF_ENC(0, 1), /* [2] */
1949*4882a593Smuzhiyun BTF_END_RAW,
1950*4882a593Smuzhiyun },
1951*4882a593Smuzhiyun .str_sec = "\0__int",
1952*4882a593Smuzhiyun .str_sec_size = sizeof("\0__int"),
1953*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1954*4882a593Smuzhiyun .map_name = "typedef_check_btf",
1955*4882a593Smuzhiyun .key_size = sizeof(int),
1956*4882a593Smuzhiyun .value_size = sizeof(int),
1957*4882a593Smuzhiyun .key_type_id = 1,
1958*4882a593Smuzhiyun .value_type_id = 1,
1959*4882a593Smuzhiyun .max_entries = 4,
1960*4882a593Smuzhiyun .btf_load_err = true,
1961*4882a593Smuzhiyun .err_str = "Invalid name",
1962*4882a593Smuzhiyun },
1963*4882a593Smuzhiyun
1964*4882a593Smuzhiyun {
1965*4882a593Smuzhiyun .descr = "typedef (invalid name, invalid identifier)",
1966*4882a593Smuzhiyun .raw_types = {
1967*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1968*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [2] */
1969*4882a593Smuzhiyun BTF_END_RAW,
1970*4882a593Smuzhiyun },
1971*4882a593Smuzhiyun .str_sec = "\0__!int",
1972*4882a593Smuzhiyun .str_sec_size = sizeof("\0__!int"),
1973*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1974*4882a593Smuzhiyun .map_name = "typedef_check_btf",
1975*4882a593Smuzhiyun .key_size = sizeof(int),
1976*4882a593Smuzhiyun .value_size = sizeof(int),
1977*4882a593Smuzhiyun .key_type_id = 1,
1978*4882a593Smuzhiyun .value_type_id = 1,
1979*4882a593Smuzhiyun .max_entries = 4,
1980*4882a593Smuzhiyun .btf_load_err = true,
1981*4882a593Smuzhiyun .err_str = "Invalid name",
1982*4882a593Smuzhiyun },
1983*4882a593Smuzhiyun
1984*4882a593Smuzhiyun {
1985*4882a593Smuzhiyun .descr = "ptr type (invalid name, name_off <> 0)",
1986*4882a593Smuzhiyun .raw_types = {
1987*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
1988*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
1989*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1), /* [2] */
1990*4882a593Smuzhiyun BTF_END_RAW,
1991*4882a593Smuzhiyun },
1992*4882a593Smuzhiyun .str_sec = "\0__int",
1993*4882a593Smuzhiyun .str_sec_size = sizeof("\0__int"),
1994*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
1995*4882a593Smuzhiyun .map_name = "ptr_type_check_btf",
1996*4882a593Smuzhiyun .key_size = sizeof(int),
1997*4882a593Smuzhiyun .value_size = sizeof(int),
1998*4882a593Smuzhiyun .key_type_id = 1,
1999*4882a593Smuzhiyun .value_type_id = 1,
2000*4882a593Smuzhiyun .max_entries = 4,
2001*4882a593Smuzhiyun .btf_load_err = true,
2002*4882a593Smuzhiyun .err_str = "Invalid name",
2003*4882a593Smuzhiyun },
2004*4882a593Smuzhiyun
2005*4882a593Smuzhiyun {
2006*4882a593Smuzhiyun .descr = "volatile type (invalid name, name_off <> 0)",
2007*4882a593Smuzhiyun .raw_types = {
2008*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2009*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2010*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 1), /* [2] */
2011*4882a593Smuzhiyun BTF_END_RAW,
2012*4882a593Smuzhiyun },
2013*4882a593Smuzhiyun .str_sec = "\0__int",
2014*4882a593Smuzhiyun .str_sec_size = sizeof("\0__int"),
2015*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2016*4882a593Smuzhiyun .map_name = "volatile_type_check_btf",
2017*4882a593Smuzhiyun .key_size = sizeof(int),
2018*4882a593Smuzhiyun .value_size = sizeof(int),
2019*4882a593Smuzhiyun .key_type_id = 1,
2020*4882a593Smuzhiyun .value_type_id = 1,
2021*4882a593Smuzhiyun .max_entries = 4,
2022*4882a593Smuzhiyun .btf_load_err = true,
2023*4882a593Smuzhiyun .err_str = "Invalid name",
2024*4882a593Smuzhiyun },
2025*4882a593Smuzhiyun
2026*4882a593Smuzhiyun {
2027*4882a593Smuzhiyun .descr = "const type (invalid name, name_off <> 0)",
2028*4882a593Smuzhiyun .raw_types = {
2029*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2030*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2031*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1), /* [2] */
2032*4882a593Smuzhiyun BTF_END_RAW,
2033*4882a593Smuzhiyun },
2034*4882a593Smuzhiyun .str_sec = "\0__int",
2035*4882a593Smuzhiyun .str_sec_size = sizeof("\0__int"),
2036*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2037*4882a593Smuzhiyun .map_name = "const_type_check_btf",
2038*4882a593Smuzhiyun .key_size = sizeof(int),
2039*4882a593Smuzhiyun .value_size = sizeof(int),
2040*4882a593Smuzhiyun .key_type_id = 1,
2041*4882a593Smuzhiyun .value_type_id = 1,
2042*4882a593Smuzhiyun .max_entries = 4,
2043*4882a593Smuzhiyun .btf_load_err = true,
2044*4882a593Smuzhiyun .err_str = "Invalid name",
2045*4882a593Smuzhiyun },
2046*4882a593Smuzhiyun
2047*4882a593Smuzhiyun {
2048*4882a593Smuzhiyun .descr = "restrict type (invalid name, name_off <> 0)",
2049*4882a593Smuzhiyun .raw_types = {
2050*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2051*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1), /* [2] */
2052*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2053*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_RESTRICT, 0, 0), 2), /* [3] */
2054*4882a593Smuzhiyun BTF_END_RAW,
2055*4882a593Smuzhiyun },
2056*4882a593Smuzhiyun .str_sec = "\0__int",
2057*4882a593Smuzhiyun .str_sec_size = sizeof("\0__int"),
2058*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2059*4882a593Smuzhiyun .map_name = "restrict_type_check_btf",
2060*4882a593Smuzhiyun .key_size = sizeof(int),
2061*4882a593Smuzhiyun .value_size = sizeof(int),
2062*4882a593Smuzhiyun .key_type_id = 1,
2063*4882a593Smuzhiyun .value_type_id = 1,
2064*4882a593Smuzhiyun .max_entries = 4,
2065*4882a593Smuzhiyun .btf_load_err = true,
2066*4882a593Smuzhiyun .err_str = "Invalid name",
2067*4882a593Smuzhiyun },
2068*4882a593Smuzhiyun
2069*4882a593Smuzhiyun {
2070*4882a593Smuzhiyun .descr = "fwd type (invalid name, name_off = 0)",
2071*4882a593Smuzhiyun .raw_types = {
2072*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2073*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0), /* [2] */
2074*4882a593Smuzhiyun BTF_END_RAW,
2075*4882a593Smuzhiyun },
2076*4882a593Smuzhiyun .str_sec = "\0__skb",
2077*4882a593Smuzhiyun .str_sec_size = sizeof("\0__skb"),
2078*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2079*4882a593Smuzhiyun .map_name = "fwd_type_check_btf",
2080*4882a593Smuzhiyun .key_size = sizeof(int),
2081*4882a593Smuzhiyun .value_size = sizeof(int),
2082*4882a593Smuzhiyun .key_type_id = 1,
2083*4882a593Smuzhiyun .value_type_id = 1,
2084*4882a593Smuzhiyun .max_entries = 4,
2085*4882a593Smuzhiyun .btf_load_err = true,
2086*4882a593Smuzhiyun .err_str = "Invalid name",
2087*4882a593Smuzhiyun },
2088*4882a593Smuzhiyun
2089*4882a593Smuzhiyun {
2090*4882a593Smuzhiyun .descr = "fwd type (invalid name, invalid identifier)",
2091*4882a593Smuzhiyun .raw_types = {
2092*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2093*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2094*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0), /* [2] */
2095*4882a593Smuzhiyun BTF_END_RAW,
2096*4882a593Smuzhiyun },
2097*4882a593Smuzhiyun .str_sec = "\0__!skb",
2098*4882a593Smuzhiyun .str_sec_size = sizeof("\0__!skb"),
2099*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2100*4882a593Smuzhiyun .map_name = "fwd_type_check_btf",
2101*4882a593Smuzhiyun .key_size = sizeof(int),
2102*4882a593Smuzhiyun .value_size = sizeof(int),
2103*4882a593Smuzhiyun .key_type_id = 1,
2104*4882a593Smuzhiyun .value_type_id = 1,
2105*4882a593Smuzhiyun .max_entries = 4,
2106*4882a593Smuzhiyun .btf_load_err = true,
2107*4882a593Smuzhiyun .err_str = "Invalid name",
2108*4882a593Smuzhiyun },
2109*4882a593Smuzhiyun
2110*4882a593Smuzhiyun {
2111*4882a593Smuzhiyun .descr = "array type (invalid name, name_off <> 0)",
2112*4882a593Smuzhiyun .raw_types = {
2113*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2114*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2115*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 0), /* [2] */
2116*4882a593Smuzhiyun BTF_ARRAY_ENC(1, 1, 4),
2117*4882a593Smuzhiyun BTF_END_RAW,
2118*4882a593Smuzhiyun },
2119*4882a593Smuzhiyun .str_sec = "\0__skb",
2120*4882a593Smuzhiyun .str_sec_size = sizeof("\0__skb"),
2121*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2122*4882a593Smuzhiyun .map_name = "array_type_check_btf",
2123*4882a593Smuzhiyun .key_size = sizeof(int),
2124*4882a593Smuzhiyun .value_size = sizeof(int),
2125*4882a593Smuzhiyun .key_type_id = 1,
2126*4882a593Smuzhiyun .value_type_id = 1,
2127*4882a593Smuzhiyun .max_entries = 4,
2128*4882a593Smuzhiyun .btf_load_err = true,
2129*4882a593Smuzhiyun .err_str = "Invalid name",
2130*4882a593Smuzhiyun },
2131*4882a593Smuzhiyun
2132*4882a593Smuzhiyun {
2133*4882a593Smuzhiyun .descr = "struct type (name_off = 0)",
2134*4882a593Smuzhiyun .raw_types = {
2135*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2136*4882a593Smuzhiyun BTF_TYPE_ENC(0,
2137*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */
2138*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2139*4882a593Smuzhiyun BTF_END_RAW,
2140*4882a593Smuzhiyun },
2141*4882a593Smuzhiyun .str_sec = "\0A",
2142*4882a593Smuzhiyun .str_sec_size = sizeof("\0A"),
2143*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2144*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
2145*4882a593Smuzhiyun .key_size = sizeof(int),
2146*4882a593Smuzhiyun .value_size = sizeof(int),
2147*4882a593Smuzhiyun .key_type_id = 1,
2148*4882a593Smuzhiyun .value_type_id = 1,
2149*4882a593Smuzhiyun .max_entries = 4,
2150*4882a593Smuzhiyun },
2151*4882a593Smuzhiyun
2152*4882a593Smuzhiyun {
2153*4882a593Smuzhiyun .descr = "struct type (invalid name, invalid identifier)",
2154*4882a593Smuzhiyun .raw_types = {
2155*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2156*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2157*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */
2158*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2159*4882a593Smuzhiyun BTF_END_RAW,
2160*4882a593Smuzhiyun },
2161*4882a593Smuzhiyun .str_sec = "\0A!\0B",
2162*4882a593Smuzhiyun .str_sec_size = sizeof("\0A!\0B"),
2163*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2164*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
2165*4882a593Smuzhiyun .key_size = sizeof(int),
2166*4882a593Smuzhiyun .value_size = sizeof(int),
2167*4882a593Smuzhiyun .key_type_id = 1,
2168*4882a593Smuzhiyun .value_type_id = 1,
2169*4882a593Smuzhiyun .max_entries = 4,
2170*4882a593Smuzhiyun .btf_load_err = true,
2171*4882a593Smuzhiyun .err_str = "Invalid name",
2172*4882a593Smuzhiyun },
2173*4882a593Smuzhiyun
2174*4882a593Smuzhiyun {
2175*4882a593Smuzhiyun .descr = "struct member (name_off = 0)",
2176*4882a593Smuzhiyun .raw_types = {
2177*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2178*4882a593Smuzhiyun BTF_TYPE_ENC(0,
2179*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */
2180*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2181*4882a593Smuzhiyun BTF_END_RAW,
2182*4882a593Smuzhiyun },
2183*4882a593Smuzhiyun .str_sec = "\0A",
2184*4882a593Smuzhiyun .str_sec_size = sizeof("\0A"),
2185*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2186*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
2187*4882a593Smuzhiyun .key_size = sizeof(int),
2188*4882a593Smuzhiyun .value_size = sizeof(int),
2189*4882a593Smuzhiyun .key_type_id = 1,
2190*4882a593Smuzhiyun .value_type_id = 1,
2191*4882a593Smuzhiyun .max_entries = 4,
2192*4882a593Smuzhiyun },
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun {
2195*4882a593Smuzhiyun .descr = "struct member (invalid name, invalid identifier)",
2196*4882a593Smuzhiyun .raw_types = {
2197*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2198*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2199*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */
2200*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2201*4882a593Smuzhiyun BTF_END_RAW,
2202*4882a593Smuzhiyun },
2203*4882a593Smuzhiyun .str_sec = "\0A\0B*",
2204*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0B*"),
2205*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2206*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
2207*4882a593Smuzhiyun .key_size = sizeof(int),
2208*4882a593Smuzhiyun .value_size = sizeof(int),
2209*4882a593Smuzhiyun .key_type_id = 1,
2210*4882a593Smuzhiyun .value_type_id = 1,
2211*4882a593Smuzhiyun .max_entries = 4,
2212*4882a593Smuzhiyun .btf_load_err = true,
2213*4882a593Smuzhiyun .err_str = "Invalid name",
2214*4882a593Smuzhiyun },
2215*4882a593Smuzhiyun
2216*4882a593Smuzhiyun {
2217*4882a593Smuzhiyun .descr = "enum type (name_off = 0)",
2218*4882a593Smuzhiyun .raw_types = {
2219*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2220*4882a593Smuzhiyun BTF_TYPE_ENC(0,
2221*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2222*4882a593Smuzhiyun sizeof(int)), /* [2] */
2223*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
2224*4882a593Smuzhiyun BTF_END_RAW,
2225*4882a593Smuzhiyun },
2226*4882a593Smuzhiyun .str_sec = "\0A\0B",
2227*4882a593Smuzhiyun .str_sec_size = sizeof("\0A\0B"),
2228*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2229*4882a593Smuzhiyun .map_name = "enum_type_check_btf",
2230*4882a593Smuzhiyun .key_size = sizeof(int),
2231*4882a593Smuzhiyun .value_size = sizeof(int),
2232*4882a593Smuzhiyun .key_type_id = 1,
2233*4882a593Smuzhiyun .value_type_id = 1,
2234*4882a593Smuzhiyun .max_entries = 4,
2235*4882a593Smuzhiyun },
2236*4882a593Smuzhiyun
2237*4882a593Smuzhiyun {
2238*4882a593Smuzhiyun .descr = "enum type (invalid name, invalid identifier)",
2239*4882a593Smuzhiyun .raw_types = {
2240*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2241*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2242*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2243*4882a593Smuzhiyun sizeof(int)), /* [2] */
2244*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
2245*4882a593Smuzhiyun BTF_END_RAW,
2246*4882a593Smuzhiyun },
2247*4882a593Smuzhiyun .str_sec = "\0A!\0B",
2248*4882a593Smuzhiyun .str_sec_size = sizeof("\0A!\0B"),
2249*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2250*4882a593Smuzhiyun .map_name = "enum_type_check_btf",
2251*4882a593Smuzhiyun .key_size = sizeof(int),
2252*4882a593Smuzhiyun .value_size = sizeof(int),
2253*4882a593Smuzhiyun .key_type_id = 1,
2254*4882a593Smuzhiyun .value_type_id = 1,
2255*4882a593Smuzhiyun .max_entries = 4,
2256*4882a593Smuzhiyun .btf_load_err = true,
2257*4882a593Smuzhiyun .err_str = "Invalid name",
2258*4882a593Smuzhiyun },
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun {
2261*4882a593Smuzhiyun .descr = "enum member (invalid name, name_off = 0)",
2262*4882a593Smuzhiyun .raw_types = {
2263*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2264*4882a593Smuzhiyun BTF_TYPE_ENC(0,
2265*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2266*4882a593Smuzhiyun sizeof(int)), /* [2] */
2267*4882a593Smuzhiyun BTF_ENUM_ENC(0, 0),
2268*4882a593Smuzhiyun BTF_END_RAW,
2269*4882a593Smuzhiyun },
2270*4882a593Smuzhiyun .str_sec = "",
2271*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2272*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2273*4882a593Smuzhiyun .map_name = "enum_type_check_btf",
2274*4882a593Smuzhiyun .key_size = sizeof(int),
2275*4882a593Smuzhiyun .value_size = sizeof(int),
2276*4882a593Smuzhiyun .key_type_id = 1,
2277*4882a593Smuzhiyun .value_type_id = 1,
2278*4882a593Smuzhiyun .max_entries = 4,
2279*4882a593Smuzhiyun .btf_load_err = true,
2280*4882a593Smuzhiyun .err_str = "Invalid name",
2281*4882a593Smuzhiyun },
2282*4882a593Smuzhiyun
2283*4882a593Smuzhiyun {
2284*4882a593Smuzhiyun .descr = "enum member (invalid name, invalid identifier)",
2285*4882a593Smuzhiyun .raw_types = {
2286*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2287*4882a593Smuzhiyun BTF_TYPE_ENC(0,
2288*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2289*4882a593Smuzhiyun sizeof(int)), /* [2] */
2290*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
2291*4882a593Smuzhiyun BTF_END_RAW,
2292*4882a593Smuzhiyun },
2293*4882a593Smuzhiyun .str_sec = "\0A!",
2294*4882a593Smuzhiyun .str_sec_size = sizeof("\0A!"),
2295*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2296*4882a593Smuzhiyun .map_name = "enum_type_check_btf",
2297*4882a593Smuzhiyun .key_size = sizeof(int),
2298*4882a593Smuzhiyun .value_size = sizeof(int),
2299*4882a593Smuzhiyun .key_type_id = 1,
2300*4882a593Smuzhiyun .value_type_id = 1,
2301*4882a593Smuzhiyun .max_entries = 4,
2302*4882a593Smuzhiyun .btf_load_err = true,
2303*4882a593Smuzhiyun .err_str = "Invalid name",
2304*4882a593Smuzhiyun },
2305*4882a593Smuzhiyun {
2306*4882a593Smuzhiyun .descr = "arraymap invalid btf key (a bit field)",
2307*4882a593Smuzhiyun .raw_types = {
2308*4882a593Smuzhiyun /* int */ /* [1] */
2309*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2310*4882a593Smuzhiyun /* 32 bit int with 32 bit offset */ /* [2] */
2311*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 32, 32, 8),
2312*4882a593Smuzhiyun BTF_END_RAW,
2313*4882a593Smuzhiyun },
2314*4882a593Smuzhiyun .str_sec = "",
2315*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2316*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2317*4882a593Smuzhiyun .map_name = "array_map_check_btf",
2318*4882a593Smuzhiyun .key_size = sizeof(int),
2319*4882a593Smuzhiyun .value_size = sizeof(int),
2320*4882a593Smuzhiyun .key_type_id = 2,
2321*4882a593Smuzhiyun .value_type_id = 1,
2322*4882a593Smuzhiyun .max_entries = 4,
2323*4882a593Smuzhiyun .map_create_err = true,
2324*4882a593Smuzhiyun },
2325*4882a593Smuzhiyun
2326*4882a593Smuzhiyun {
2327*4882a593Smuzhiyun .descr = "arraymap invalid btf key (!= 32 bits)",
2328*4882a593Smuzhiyun .raw_types = {
2329*4882a593Smuzhiyun /* int */ /* [1] */
2330*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2331*4882a593Smuzhiyun /* 16 bit int with 0 bit offset */ /* [2] */
2332*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 16, 2),
2333*4882a593Smuzhiyun BTF_END_RAW,
2334*4882a593Smuzhiyun },
2335*4882a593Smuzhiyun .str_sec = "",
2336*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2337*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2338*4882a593Smuzhiyun .map_name = "array_map_check_btf",
2339*4882a593Smuzhiyun .key_size = sizeof(int),
2340*4882a593Smuzhiyun .value_size = sizeof(int),
2341*4882a593Smuzhiyun .key_type_id = 2,
2342*4882a593Smuzhiyun .value_type_id = 1,
2343*4882a593Smuzhiyun .max_entries = 4,
2344*4882a593Smuzhiyun .map_create_err = true,
2345*4882a593Smuzhiyun },
2346*4882a593Smuzhiyun
2347*4882a593Smuzhiyun {
2348*4882a593Smuzhiyun .descr = "arraymap invalid btf value (too small)",
2349*4882a593Smuzhiyun .raw_types = {
2350*4882a593Smuzhiyun /* int */ /* [1] */
2351*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2352*4882a593Smuzhiyun BTF_END_RAW,
2353*4882a593Smuzhiyun },
2354*4882a593Smuzhiyun .str_sec = "",
2355*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2356*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2357*4882a593Smuzhiyun .map_name = "array_map_check_btf",
2358*4882a593Smuzhiyun .key_size = sizeof(int),
2359*4882a593Smuzhiyun /* btf_value_size < map->value_size */
2360*4882a593Smuzhiyun .value_size = sizeof(__u64),
2361*4882a593Smuzhiyun .key_type_id = 1,
2362*4882a593Smuzhiyun .value_type_id = 1,
2363*4882a593Smuzhiyun .max_entries = 4,
2364*4882a593Smuzhiyun .map_create_err = true,
2365*4882a593Smuzhiyun },
2366*4882a593Smuzhiyun
2367*4882a593Smuzhiyun {
2368*4882a593Smuzhiyun .descr = "arraymap invalid btf value (too big)",
2369*4882a593Smuzhiyun .raw_types = {
2370*4882a593Smuzhiyun /* int */ /* [1] */
2371*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2372*4882a593Smuzhiyun BTF_END_RAW,
2373*4882a593Smuzhiyun },
2374*4882a593Smuzhiyun .str_sec = "",
2375*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2376*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2377*4882a593Smuzhiyun .map_name = "array_map_check_btf",
2378*4882a593Smuzhiyun .key_size = sizeof(int),
2379*4882a593Smuzhiyun /* btf_value_size > map->value_size */
2380*4882a593Smuzhiyun .value_size = sizeof(__u16),
2381*4882a593Smuzhiyun .key_type_id = 1,
2382*4882a593Smuzhiyun .value_type_id = 1,
2383*4882a593Smuzhiyun .max_entries = 4,
2384*4882a593Smuzhiyun .map_create_err = true,
2385*4882a593Smuzhiyun },
2386*4882a593Smuzhiyun
2387*4882a593Smuzhiyun {
2388*4882a593Smuzhiyun .descr = "func proto (int (*)(int, unsigned int))",
2389*4882a593Smuzhiyun .raw_types = {
2390*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2391*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2392*4882a593Smuzhiyun /* int (*)(int, unsigned int) */
2393*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
2394*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2395*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2396*4882a593Smuzhiyun BTF_END_RAW,
2397*4882a593Smuzhiyun },
2398*4882a593Smuzhiyun .str_sec = "",
2399*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2400*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2401*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2402*4882a593Smuzhiyun .key_size = sizeof(int),
2403*4882a593Smuzhiyun .value_size = sizeof(int),
2404*4882a593Smuzhiyun .key_type_id = 1,
2405*4882a593Smuzhiyun .value_type_id = 1,
2406*4882a593Smuzhiyun .max_entries = 4,
2407*4882a593Smuzhiyun },
2408*4882a593Smuzhiyun
2409*4882a593Smuzhiyun {
2410*4882a593Smuzhiyun .descr = "func proto (vararg)",
2411*4882a593Smuzhiyun .raw_types = {
2412*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2413*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2414*4882a593Smuzhiyun /* void (*)(int, unsigned int, ...) */
2415*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2416*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2417*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2418*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 0),
2419*4882a593Smuzhiyun BTF_END_RAW,
2420*4882a593Smuzhiyun },
2421*4882a593Smuzhiyun .str_sec = "",
2422*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2423*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2424*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2425*4882a593Smuzhiyun .key_size = sizeof(int),
2426*4882a593Smuzhiyun .value_size = sizeof(int),
2427*4882a593Smuzhiyun .key_type_id = 1,
2428*4882a593Smuzhiyun .value_type_id = 1,
2429*4882a593Smuzhiyun .max_entries = 4,
2430*4882a593Smuzhiyun },
2431*4882a593Smuzhiyun
2432*4882a593Smuzhiyun {
2433*4882a593Smuzhiyun .descr = "func proto (vararg with name)",
2434*4882a593Smuzhiyun .raw_types = {
2435*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2436*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2437*4882a593Smuzhiyun /* void (*)(int a, unsigned int b, ... c) */
2438*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2439*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2440*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2441*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 0),
2442*4882a593Smuzhiyun BTF_END_RAW,
2443*4882a593Smuzhiyun },
2444*4882a593Smuzhiyun .str_sec = "\0a\0b\0c",
2445*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b\0c"),
2446*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2447*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2448*4882a593Smuzhiyun .key_size = sizeof(int),
2449*4882a593Smuzhiyun .value_size = sizeof(int),
2450*4882a593Smuzhiyun .key_type_id = 1,
2451*4882a593Smuzhiyun .value_type_id = 1,
2452*4882a593Smuzhiyun .max_entries = 4,
2453*4882a593Smuzhiyun .btf_load_err = true,
2454*4882a593Smuzhiyun .err_str = "Invalid arg#3",
2455*4882a593Smuzhiyun },
2456*4882a593Smuzhiyun
2457*4882a593Smuzhiyun {
2458*4882a593Smuzhiyun .descr = "func proto (arg after vararg)",
2459*4882a593Smuzhiyun .raw_types = {
2460*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2461*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2462*4882a593Smuzhiyun /* void (*)(int a, ..., unsigned int b) */
2463*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2464*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2465*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 0),
2466*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2467*4882a593Smuzhiyun BTF_END_RAW,
2468*4882a593Smuzhiyun },
2469*4882a593Smuzhiyun .str_sec = "\0a\0b",
2470*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b"),
2471*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2472*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2473*4882a593Smuzhiyun .key_size = sizeof(int),
2474*4882a593Smuzhiyun .value_size = sizeof(int),
2475*4882a593Smuzhiyun .key_type_id = 1,
2476*4882a593Smuzhiyun .value_type_id = 1,
2477*4882a593Smuzhiyun .max_entries = 4,
2478*4882a593Smuzhiyun .btf_load_err = true,
2479*4882a593Smuzhiyun .err_str = "Invalid arg#2",
2480*4882a593Smuzhiyun },
2481*4882a593Smuzhiyun
2482*4882a593Smuzhiyun {
2483*4882a593Smuzhiyun .descr = "func proto (CONST=>TYPEDEF=>PTR=>FUNC_PROTO)",
2484*4882a593Smuzhiyun .raw_types = {
2485*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2486*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2487*4882a593Smuzhiyun /* typedef void (*func_ptr)(int, unsigned int) */
2488*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 5), /* [3] */
2489*4882a593Smuzhiyun /* const func_ptr */
2490*4882a593Smuzhiyun BTF_CONST_ENC(3), /* [4] */
2491*4882a593Smuzhiyun BTF_PTR_ENC(6), /* [5] */
2492*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [6] */
2493*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2494*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2495*4882a593Smuzhiyun BTF_END_RAW,
2496*4882a593Smuzhiyun },
2497*4882a593Smuzhiyun .str_sec = "\0func_ptr",
2498*4882a593Smuzhiyun .str_sec_size = sizeof("\0func_ptr"),
2499*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2500*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2501*4882a593Smuzhiyun .key_size = sizeof(int),
2502*4882a593Smuzhiyun .value_size = sizeof(int),
2503*4882a593Smuzhiyun .key_type_id = 1,
2504*4882a593Smuzhiyun .value_type_id = 1,
2505*4882a593Smuzhiyun .max_entries = 4,
2506*4882a593Smuzhiyun },
2507*4882a593Smuzhiyun
2508*4882a593Smuzhiyun {
2509*4882a593Smuzhiyun .descr = "func proto (TYPEDEF=>FUNC_PROTO)",
2510*4882a593Smuzhiyun .raw_types = {
2511*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2512*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2513*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */
2514*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [4] */
2515*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2516*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2517*4882a593Smuzhiyun BTF_END_RAW,
2518*4882a593Smuzhiyun },
2519*4882a593Smuzhiyun .str_sec = "\0func_typedef",
2520*4882a593Smuzhiyun .str_sec_size = sizeof("\0func_typedef"),
2521*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2522*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2523*4882a593Smuzhiyun .key_size = sizeof(int),
2524*4882a593Smuzhiyun .value_size = sizeof(int),
2525*4882a593Smuzhiyun .key_type_id = 1,
2526*4882a593Smuzhiyun .value_type_id = 1,
2527*4882a593Smuzhiyun .max_entries = 4,
2528*4882a593Smuzhiyun },
2529*4882a593Smuzhiyun
2530*4882a593Smuzhiyun {
2531*4882a593Smuzhiyun .descr = "func proto (btf_resolve(arg))",
2532*4882a593Smuzhiyun .raw_types = {
2533*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2534*4882a593Smuzhiyun /* void (*)(const void *) */
2535*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 1), /* [2] */
2536*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 3),
2537*4882a593Smuzhiyun BTF_CONST_ENC(4), /* [3] */
2538*4882a593Smuzhiyun BTF_PTR_ENC(0), /* [4] */
2539*4882a593Smuzhiyun BTF_END_RAW,
2540*4882a593Smuzhiyun },
2541*4882a593Smuzhiyun .str_sec = "",
2542*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2543*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2544*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2545*4882a593Smuzhiyun .key_size = sizeof(int),
2546*4882a593Smuzhiyun .value_size = sizeof(int),
2547*4882a593Smuzhiyun .key_type_id = 1,
2548*4882a593Smuzhiyun .value_type_id = 1,
2549*4882a593Smuzhiyun .max_entries = 4,
2550*4882a593Smuzhiyun },
2551*4882a593Smuzhiyun
2552*4882a593Smuzhiyun {
2553*4882a593Smuzhiyun .descr = "func proto (Not all arg has name)",
2554*4882a593Smuzhiyun .raw_types = {
2555*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2556*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2557*4882a593Smuzhiyun /* void (*)(int, unsigned int b) */
2558*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2559*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2560*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2561*4882a593Smuzhiyun BTF_END_RAW,
2562*4882a593Smuzhiyun },
2563*4882a593Smuzhiyun .str_sec = "\0b",
2564*4882a593Smuzhiyun .str_sec_size = sizeof("\0b"),
2565*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2566*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2567*4882a593Smuzhiyun .key_size = sizeof(int),
2568*4882a593Smuzhiyun .value_size = sizeof(int),
2569*4882a593Smuzhiyun .key_type_id = 1,
2570*4882a593Smuzhiyun .value_type_id = 1,
2571*4882a593Smuzhiyun .max_entries = 4,
2572*4882a593Smuzhiyun },
2573*4882a593Smuzhiyun
2574*4882a593Smuzhiyun {
2575*4882a593Smuzhiyun .descr = "func proto (Bad arg name_off)",
2576*4882a593Smuzhiyun .raw_types = {
2577*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2578*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2579*4882a593Smuzhiyun /* void (*)(int a, unsigned int <bad_name_off>) */
2580*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2581*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2582*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0x0fffffff, 2),
2583*4882a593Smuzhiyun BTF_END_RAW,
2584*4882a593Smuzhiyun },
2585*4882a593Smuzhiyun .str_sec = "\0a",
2586*4882a593Smuzhiyun .str_sec_size = sizeof("\0a"),
2587*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2588*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2589*4882a593Smuzhiyun .key_size = sizeof(int),
2590*4882a593Smuzhiyun .value_size = sizeof(int),
2591*4882a593Smuzhiyun .key_type_id = 1,
2592*4882a593Smuzhiyun .value_type_id = 1,
2593*4882a593Smuzhiyun .max_entries = 4,
2594*4882a593Smuzhiyun .btf_load_err = true,
2595*4882a593Smuzhiyun .err_str = "Invalid arg#2",
2596*4882a593Smuzhiyun },
2597*4882a593Smuzhiyun
2598*4882a593Smuzhiyun {
2599*4882a593Smuzhiyun .descr = "func proto (Bad arg name)",
2600*4882a593Smuzhiyun .raw_types = {
2601*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2602*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2603*4882a593Smuzhiyun /* void (*)(int a, unsigned int !!!) */
2604*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2605*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2606*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2607*4882a593Smuzhiyun BTF_END_RAW,
2608*4882a593Smuzhiyun },
2609*4882a593Smuzhiyun .str_sec = "\0a\0!!!",
2610*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0!!!"),
2611*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2612*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2613*4882a593Smuzhiyun .key_size = sizeof(int),
2614*4882a593Smuzhiyun .value_size = sizeof(int),
2615*4882a593Smuzhiyun .key_type_id = 1,
2616*4882a593Smuzhiyun .value_type_id = 1,
2617*4882a593Smuzhiyun .max_entries = 4,
2618*4882a593Smuzhiyun .btf_load_err = true,
2619*4882a593Smuzhiyun .err_str = "Invalid arg#2",
2620*4882a593Smuzhiyun },
2621*4882a593Smuzhiyun
2622*4882a593Smuzhiyun {
2623*4882a593Smuzhiyun .descr = "func proto (Invalid return type)",
2624*4882a593Smuzhiyun .raw_types = {
2625*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2626*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2627*4882a593Smuzhiyun /* <bad_ret_type> (*)(int, unsigned int) */
2628*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(100, 2), /* [3] */
2629*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2630*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2631*4882a593Smuzhiyun BTF_END_RAW,
2632*4882a593Smuzhiyun },
2633*4882a593Smuzhiyun .str_sec = "",
2634*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2635*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2636*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2637*4882a593Smuzhiyun .key_size = sizeof(int),
2638*4882a593Smuzhiyun .value_size = sizeof(int),
2639*4882a593Smuzhiyun .key_type_id = 1,
2640*4882a593Smuzhiyun .value_type_id = 1,
2641*4882a593Smuzhiyun .max_entries = 4,
2642*4882a593Smuzhiyun .btf_load_err = true,
2643*4882a593Smuzhiyun .err_str = "Invalid return type",
2644*4882a593Smuzhiyun },
2645*4882a593Smuzhiyun
2646*4882a593Smuzhiyun {
2647*4882a593Smuzhiyun .descr = "func proto (with func name)",
2648*4882a593Smuzhiyun .raw_types = {
2649*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2650*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2651*4882a593Smuzhiyun /* void func_proto(int, unsigned int) */
2652*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 2), 0), /* [3] */
2653*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 1),
2654*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2655*4882a593Smuzhiyun BTF_END_RAW,
2656*4882a593Smuzhiyun },
2657*4882a593Smuzhiyun .str_sec = "\0func_proto",
2658*4882a593Smuzhiyun .str_sec_size = sizeof("\0func_proto"),
2659*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2660*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2661*4882a593Smuzhiyun .key_size = sizeof(int),
2662*4882a593Smuzhiyun .value_size = sizeof(int),
2663*4882a593Smuzhiyun .key_type_id = 1,
2664*4882a593Smuzhiyun .value_type_id = 1,
2665*4882a593Smuzhiyun .max_entries = 4,
2666*4882a593Smuzhiyun .btf_load_err = true,
2667*4882a593Smuzhiyun .err_str = "Invalid name",
2668*4882a593Smuzhiyun },
2669*4882a593Smuzhiyun
2670*4882a593Smuzhiyun {
2671*4882a593Smuzhiyun .descr = "func proto (const void arg)",
2672*4882a593Smuzhiyun .raw_types = {
2673*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2674*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2675*4882a593Smuzhiyun /* void (*)(const void) */
2676*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 1), /* [3] */
2677*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 4),
2678*4882a593Smuzhiyun BTF_CONST_ENC(0), /* [4] */
2679*4882a593Smuzhiyun BTF_END_RAW,
2680*4882a593Smuzhiyun },
2681*4882a593Smuzhiyun .str_sec = "",
2682*4882a593Smuzhiyun .str_sec_size = sizeof(""),
2683*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2684*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
2685*4882a593Smuzhiyun .key_size = sizeof(int),
2686*4882a593Smuzhiyun .value_size = sizeof(int),
2687*4882a593Smuzhiyun .key_type_id = 1,
2688*4882a593Smuzhiyun .value_type_id = 1,
2689*4882a593Smuzhiyun .max_entries = 4,
2690*4882a593Smuzhiyun .btf_load_err = true,
2691*4882a593Smuzhiyun .err_str = "Invalid arg#1",
2692*4882a593Smuzhiyun },
2693*4882a593Smuzhiyun
2694*4882a593Smuzhiyun {
2695*4882a593Smuzhiyun .descr = "func (void func(int a, unsigned int b))",
2696*4882a593Smuzhiyun .raw_types = {
2697*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2698*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2699*4882a593Smuzhiyun /* void (*)(int a, unsigned int b) */
2700*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2701*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2702*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2703*4882a593Smuzhiyun /* void func(int a, unsigned int b) */
2704*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */
2705*4882a593Smuzhiyun BTF_END_RAW,
2706*4882a593Smuzhiyun },
2707*4882a593Smuzhiyun .str_sec = "\0a\0b\0func",
2708*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b\0func"),
2709*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2710*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2711*4882a593Smuzhiyun .key_size = sizeof(int),
2712*4882a593Smuzhiyun .value_size = sizeof(int),
2713*4882a593Smuzhiyun .key_type_id = 1,
2714*4882a593Smuzhiyun .value_type_id = 1,
2715*4882a593Smuzhiyun .max_entries = 4,
2716*4882a593Smuzhiyun },
2717*4882a593Smuzhiyun
2718*4882a593Smuzhiyun {
2719*4882a593Smuzhiyun .descr = "func (No func name)",
2720*4882a593Smuzhiyun .raw_types = {
2721*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2722*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2723*4882a593Smuzhiyun /* void (*)(int a, unsigned int b) */
2724*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2725*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2726*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2727*4882a593Smuzhiyun /* void <no_name>(int a, unsigned int b) */
2728*4882a593Smuzhiyun BTF_FUNC_ENC(0, 3), /* [4] */
2729*4882a593Smuzhiyun BTF_END_RAW,
2730*4882a593Smuzhiyun },
2731*4882a593Smuzhiyun .str_sec = "\0a\0b",
2732*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b"),
2733*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2734*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2735*4882a593Smuzhiyun .key_size = sizeof(int),
2736*4882a593Smuzhiyun .value_size = sizeof(int),
2737*4882a593Smuzhiyun .key_type_id = 1,
2738*4882a593Smuzhiyun .value_type_id = 1,
2739*4882a593Smuzhiyun .max_entries = 4,
2740*4882a593Smuzhiyun .btf_load_err = true,
2741*4882a593Smuzhiyun .err_str = "Invalid name",
2742*4882a593Smuzhiyun },
2743*4882a593Smuzhiyun
2744*4882a593Smuzhiyun {
2745*4882a593Smuzhiyun .descr = "func (Invalid func name)",
2746*4882a593Smuzhiyun .raw_types = {
2747*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2748*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2749*4882a593Smuzhiyun /* void (*)(int a, unsigned int b) */
2750*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2751*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2752*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2753*4882a593Smuzhiyun /* void !!!(int a, unsigned int b) */
2754*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */
2755*4882a593Smuzhiyun BTF_END_RAW,
2756*4882a593Smuzhiyun },
2757*4882a593Smuzhiyun .str_sec = "\0a\0b\0!!!",
2758*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b\0!!!"),
2759*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2760*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2761*4882a593Smuzhiyun .key_size = sizeof(int),
2762*4882a593Smuzhiyun .value_size = sizeof(int),
2763*4882a593Smuzhiyun .key_type_id = 1,
2764*4882a593Smuzhiyun .value_type_id = 1,
2765*4882a593Smuzhiyun .max_entries = 4,
2766*4882a593Smuzhiyun .btf_load_err = true,
2767*4882a593Smuzhiyun .err_str = "Invalid name",
2768*4882a593Smuzhiyun },
2769*4882a593Smuzhiyun
2770*4882a593Smuzhiyun {
2771*4882a593Smuzhiyun .descr = "func (Some arg has no name)",
2772*4882a593Smuzhiyun .raw_types = {
2773*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2774*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2775*4882a593Smuzhiyun /* void (*)(int a, unsigned int) */
2776*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2777*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2778*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(0, 2),
2779*4882a593Smuzhiyun /* void func(int a, unsigned int) */
2780*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */
2781*4882a593Smuzhiyun BTF_END_RAW,
2782*4882a593Smuzhiyun },
2783*4882a593Smuzhiyun .str_sec = "\0a\0func",
2784*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0func"),
2785*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2786*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2787*4882a593Smuzhiyun .key_size = sizeof(int),
2788*4882a593Smuzhiyun .value_size = sizeof(int),
2789*4882a593Smuzhiyun .key_type_id = 1,
2790*4882a593Smuzhiyun .value_type_id = 1,
2791*4882a593Smuzhiyun .max_entries = 4,
2792*4882a593Smuzhiyun .btf_load_err = true,
2793*4882a593Smuzhiyun .err_str = "Invalid arg#2",
2794*4882a593Smuzhiyun },
2795*4882a593Smuzhiyun
2796*4882a593Smuzhiyun {
2797*4882a593Smuzhiyun .descr = "func (Non zero vlen)",
2798*4882a593Smuzhiyun .raw_types = {
2799*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2800*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2801*4882a593Smuzhiyun /* void (*)(int a, unsigned int b) */
2802*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2803*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2804*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2805*4882a593Smuzhiyun /* void func(int a, unsigned int b) */
2806*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 2), 3), /* [4] */
2807*4882a593Smuzhiyun BTF_END_RAW,
2808*4882a593Smuzhiyun },
2809*4882a593Smuzhiyun .str_sec = "\0a\0b\0func",
2810*4882a593Smuzhiyun .str_sec_size = sizeof("\0a\0b\0func"),
2811*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2812*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2813*4882a593Smuzhiyun .key_size = sizeof(int),
2814*4882a593Smuzhiyun .value_size = sizeof(int),
2815*4882a593Smuzhiyun .key_type_id = 1,
2816*4882a593Smuzhiyun .value_type_id = 1,
2817*4882a593Smuzhiyun .max_entries = 4,
2818*4882a593Smuzhiyun .btf_load_err = true,
2819*4882a593Smuzhiyun .err_str = "Invalid func linkage",
2820*4882a593Smuzhiyun },
2821*4882a593Smuzhiyun
2822*4882a593Smuzhiyun {
2823*4882a593Smuzhiyun .descr = "func (Not referring to FUNC_PROTO)",
2824*4882a593Smuzhiyun .raw_types = {
2825*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2826*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 1), /* [2] */
2827*4882a593Smuzhiyun BTF_END_RAW,
2828*4882a593Smuzhiyun },
2829*4882a593Smuzhiyun .str_sec = "\0func",
2830*4882a593Smuzhiyun .str_sec_size = sizeof("\0func"),
2831*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2832*4882a593Smuzhiyun .map_name = "func_type_check_btf",
2833*4882a593Smuzhiyun .key_size = sizeof(int),
2834*4882a593Smuzhiyun .value_size = sizeof(int),
2835*4882a593Smuzhiyun .key_type_id = 1,
2836*4882a593Smuzhiyun .value_type_id = 1,
2837*4882a593Smuzhiyun .max_entries = 4,
2838*4882a593Smuzhiyun .btf_load_err = true,
2839*4882a593Smuzhiyun .err_str = "Invalid type_id",
2840*4882a593Smuzhiyun },
2841*4882a593Smuzhiyun
2842*4882a593Smuzhiyun {
2843*4882a593Smuzhiyun .descr = "invalid int kind_flag",
2844*4882a593Smuzhiyun .raw_types = {
2845*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2846*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 1, 0), 4), /* [2] */
2847*4882a593Smuzhiyun BTF_INT_ENC(0, 0, 32),
2848*4882a593Smuzhiyun BTF_END_RAW,
2849*4882a593Smuzhiyun },
2850*4882a593Smuzhiyun BTF_STR_SEC(""),
2851*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2852*4882a593Smuzhiyun .map_name = "int_type_check_btf",
2853*4882a593Smuzhiyun .key_size = sizeof(int),
2854*4882a593Smuzhiyun .value_size = sizeof(int),
2855*4882a593Smuzhiyun .key_type_id = 1,
2856*4882a593Smuzhiyun .value_type_id = 1,
2857*4882a593Smuzhiyun .max_entries = 4,
2858*4882a593Smuzhiyun .btf_load_err = true,
2859*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2860*4882a593Smuzhiyun },
2861*4882a593Smuzhiyun
2862*4882a593Smuzhiyun {
2863*4882a593Smuzhiyun .descr = "invalid ptr kind_flag",
2864*4882a593Smuzhiyun .raw_types = {
2865*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2866*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 1, 0), 1), /* [2] */
2867*4882a593Smuzhiyun BTF_END_RAW,
2868*4882a593Smuzhiyun },
2869*4882a593Smuzhiyun BTF_STR_SEC(""),
2870*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2871*4882a593Smuzhiyun .map_name = "ptr_type_check_btf",
2872*4882a593Smuzhiyun .key_size = sizeof(int),
2873*4882a593Smuzhiyun .value_size = sizeof(int),
2874*4882a593Smuzhiyun .key_type_id = 1,
2875*4882a593Smuzhiyun .value_type_id = 1,
2876*4882a593Smuzhiyun .max_entries = 4,
2877*4882a593Smuzhiyun .btf_load_err = true,
2878*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2879*4882a593Smuzhiyun },
2880*4882a593Smuzhiyun
2881*4882a593Smuzhiyun {
2882*4882a593Smuzhiyun .descr = "invalid array kind_flag",
2883*4882a593Smuzhiyun .raw_types = {
2884*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2885*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 1, 0), 0), /* [2] */
2886*4882a593Smuzhiyun BTF_ARRAY_ENC(1, 1, 1),
2887*4882a593Smuzhiyun BTF_END_RAW,
2888*4882a593Smuzhiyun },
2889*4882a593Smuzhiyun BTF_STR_SEC(""),
2890*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2891*4882a593Smuzhiyun .map_name = "array_type_check_btf",
2892*4882a593Smuzhiyun .key_size = sizeof(int),
2893*4882a593Smuzhiyun .value_size = sizeof(int),
2894*4882a593Smuzhiyun .key_type_id = 1,
2895*4882a593Smuzhiyun .value_type_id = 1,
2896*4882a593Smuzhiyun .max_entries = 4,
2897*4882a593Smuzhiyun .btf_load_err = true,
2898*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2899*4882a593Smuzhiyun },
2900*4882a593Smuzhiyun
2901*4882a593Smuzhiyun {
2902*4882a593Smuzhiyun .descr = "invalid enum kind_flag",
2903*4882a593Smuzhiyun .raw_types = {
2904*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2905*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 1, 1), 4), /* [2] */
2906*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
2907*4882a593Smuzhiyun BTF_END_RAW,
2908*4882a593Smuzhiyun },
2909*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
2910*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2911*4882a593Smuzhiyun .map_name = "enum_type_check_btf",
2912*4882a593Smuzhiyun .key_size = sizeof(int),
2913*4882a593Smuzhiyun .value_size = sizeof(int),
2914*4882a593Smuzhiyun .key_type_id = 1,
2915*4882a593Smuzhiyun .value_type_id = 1,
2916*4882a593Smuzhiyun .max_entries = 4,
2917*4882a593Smuzhiyun .btf_load_err = true,
2918*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2919*4882a593Smuzhiyun },
2920*4882a593Smuzhiyun
2921*4882a593Smuzhiyun {
2922*4882a593Smuzhiyun .descr = "valid fwd kind_flag",
2923*4882a593Smuzhiyun .raw_types = {
2924*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2925*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2926*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [2] */
2927*4882a593Smuzhiyun BTF_END_RAW,
2928*4882a593Smuzhiyun },
2929*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
2930*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2931*4882a593Smuzhiyun .map_name = "fwd_type_check_btf",
2932*4882a593Smuzhiyun .key_size = sizeof(int),
2933*4882a593Smuzhiyun .value_size = sizeof(int),
2934*4882a593Smuzhiyun .key_type_id = 1,
2935*4882a593Smuzhiyun .value_type_id = 1,
2936*4882a593Smuzhiyun .max_entries = 4,
2937*4882a593Smuzhiyun },
2938*4882a593Smuzhiyun
2939*4882a593Smuzhiyun {
2940*4882a593Smuzhiyun .descr = "invalid typedef kind_flag",
2941*4882a593Smuzhiyun .raw_types = {
2942*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2943*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD,
2944*4882a593Smuzhiyun BTF_INFO_ENC(BTF_KIND_TYPEDEF, 1, 0), 1), /* [2] */
2945*4882a593Smuzhiyun BTF_END_RAW,
2946*4882a593Smuzhiyun },
2947*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
2948*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2949*4882a593Smuzhiyun .map_name = "typedef_type_check_btf",
2950*4882a593Smuzhiyun .key_size = sizeof(int),
2951*4882a593Smuzhiyun .value_size = sizeof(int),
2952*4882a593Smuzhiyun .key_type_id = 1,
2953*4882a593Smuzhiyun .value_type_id = 1,
2954*4882a593Smuzhiyun .max_entries = 4,
2955*4882a593Smuzhiyun .btf_load_err = true,
2956*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2957*4882a593Smuzhiyun },
2958*4882a593Smuzhiyun
2959*4882a593Smuzhiyun {
2960*4882a593Smuzhiyun .descr = "invalid volatile kind_flag",
2961*4882a593Smuzhiyun .raw_types = {
2962*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2963*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 1, 0), 1), /* [2] */
2964*4882a593Smuzhiyun BTF_END_RAW,
2965*4882a593Smuzhiyun },
2966*4882a593Smuzhiyun BTF_STR_SEC(""),
2967*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2968*4882a593Smuzhiyun .map_name = "volatile_type_check_btf",
2969*4882a593Smuzhiyun .key_size = sizeof(int),
2970*4882a593Smuzhiyun .value_size = sizeof(int),
2971*4882a593Smuzhiyun .key_type_id = 1,
2972*4882a593Smuzhiyun .value_type_id = 1,
2973*4882a593Smuzhiyun .max_entries = 4,
2974*4882a593Smuzhiyun .btf_load_err = true,
2975*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2976*4882a593Smuzhiyun },
2977*4882a593Smuzhiyun
2978*4882a593Smuzhiyun {
2979*4882a593Smuzhiyun .descr = "invalid const kind_flag",
2980*4882a593Smuzhiyun .raw_types = {
2981*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2982*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 1, 0), 1), /* [2] */
2983*4882a593Smuzhiyun BTF_END_RAW,
2984*4882a593Smuzhiyun },
2985*4882a593Smuzhiyun BTF_STR_SEC(""),
2986*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
2987*4882a593Smuzhiyun .map_name = "const_type_check_btf",
2988*4882a593Smuzhiyun .key_size = sizeof(int),
2989*4882a593Smuzhiyun .value_size = sizeof(int),
2990*4882a593Smuzhiyun .key_type_id = 1,
2991*4882a593Smuzhiyun .value_type_id = 1,
2992*4882a593Smuzhiyun .max_entries = 4,
2993*4882a593Smuzhiyun .btf_load_err = true,
2994*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
2995*4882a593Smuzhiyun },
2996*4882a593Smuzhiyun
2997*4882a593Smuzhiyun {
2998*4882a593Smuzhiyun .descr = "invalid restrict kind_flag",
2999*4882a593Smuzhiyun .raw_types = {
3000*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3001*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_RESTRICT, 1, 0), 1), /* [2] */
3002*4882a593Smuzhiyun BTF_END_RAW,
3003*4882a593Smuzhiyun },
3004*4882a593Smuzhiyun BTF_STR_SEC(""),
3005*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3006*4882a593Smuzhiyun .map_name = "restrict_type_check_btf",
3007*4882a593Smuzhiyun .key_size = sizeof(int),
3008*4882a593Smuzhiyun .value_size = sizeof(int),
3009*4882a593Smuzhiyun .key_type_id = 1,
3010*4882a593Smuzhiyun .value_type_id = 1,
3011*4882a593Smuzhiyun .max_entries = 4,
3012*4882a593Smuzhiyun .btf_load_err = true,
3013*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
3014*4882a593Smuzhiyun },
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun {
3017*4882a593Smuzhiyun .descr = "invalid func kind_flag",
3018*4882a593Smuzhiyun .raw_types = {
3019*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3020*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 0), 0), /* [2] */
3021*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 1, 0), 2), /* [3] */
3022*4882a593Smuzhiyun BTF_END_RAW,
3023*4882a593Smuzhiyun },
3024*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3025*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3026*4882a593Smuzhiyun .map_name = "func_type_check_btf",
3027*4882a593Smuzhiyun .key_size = sizeof(int),
3028*4882a593Smuzhiyun .value_size = sizeof(int),
3029*4882a593Smuzhiyun .key_type_id = 1,
3030*4882a593Smuzhiyun .value_type_id = 1,
3031*4882a593Smuzhiyun .max_entries = 4,
3032*4882a593Smuzhiyun .btf_load_err = true,
3033*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
3034*4882a593Smuzhiyun },
3035*4882a593Smuzhiyun
3036*4882a593Smuzhiyun {
3037*4882a593Smuzhiyun .descr = "invalid func_proto kind_flag",
3038*4882a593Smuzhiyun .raw_types = {
3039*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3040*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 1, 0), 0), /* [2] */
3041*4882a593Smuzhiyun BTF_END_RAW,
3042*4882a593Smuzhiyun },
3043*4882a593Smuzhiyun BTF_STR_SEC(""),
3044*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3045*4882a593Smuzhiyun .map_name = "func_proto_type_check_btf",
3046*4882a593Smuzhiyun .key_size = sizeof(int),
3047*4882a593Smuzhiyun .value_size = sizeof(int),
3048*4882a593Smuzhiyun .key_type_id = 1,
3049*4882a593Smuzhiyun .value_type_id = 1,
3050*4882a593Smuzhiyun .max_entries = 4,
3051*4882a593Smuzhiyun .btf_load_err = true,
3052*4882a593Smuzhiyun .err_str = "Invalid btf_info kind_flag",
3053*4882a593Smuzhiyun },
3054*4882a593Smuzhiyun
3055*4882a593Smuzhiyun {
3056*4882a593Smuzhiyun .descr = "valid struct, kind_flag, bitfield_size = 0",
3057*4882a593Smuzhiyun .raw_types = {
3058*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3059*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 8), /* [2] */
3060*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 0)),
3061*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 32)),
3062*4882a593Smuzhiyun BTF_END_RAW,
3063*4882a593Smuzhiyun },
3064*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3065*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3066*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3067*4882a593Smuzhiyun .key_size = sizeof(int),
3068*4882a593Smuzhiyun .value_size = sizeof(int),
3069*4882a593Smuzhiyun .key_type_id = 1,
3070*4882a593Smuzhiyun .value_type_id = 1,
3071*4882a593Smuzhiyun .max_entries = 4,
3072*4882a593Smuzhiyun },
3073*4882a593Smuzhiyun
3074*4882a593Smuzhiyun {
3075*4882a593Smuzhiyun .descr = "valid struct, kind_flag, int member, bitfield_size != 0",
3076*4882a593Smuzhiyun .raw_types = {
3077*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3078*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [2] */
3079*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3080*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 4)),
3081*4882a593Smuzhiyun BTF_END_RAW,
3082*4882a593Smuzhiyun },
3083*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3084*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3085*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3086*4882a593Smuzhiyun .key_size = sizeof(int),
3087*4882a593Smuzhiyun .value_size = sizeof(int),
3088*4882a593Smuzhiyun .key_type_id = 1,
3089*4882a593Smuzhiyun .value_type_id = 1,
3090*4882a593Smuzhiyun .max_entries = 4,
3091*4882a593Smuzhiyun },
3092*4882a593Smuzhiyun
3093*4882a593Smuzhiyun {
3094*4882a593Smuzhiyun .descr = "valid union, kind_flag, int member, bitfield_size != 0",
3095*4882a593Smuzhiyun .raw_types = {
3096*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3097*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4), /* [2] */
3098*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3099*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3100*4882a593Smuzhiyun BTF_END_RAW,
3101*4882a593Smuzhiyun },
3102*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3103*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3104*4882a593Smuzhiyun .map_name = "union_type_check_btf",
3105*4882a593Smuzhiyun .key_size = sizeof(int),
3106*4882a593Smuzhiyun .value_size = sizeof(int),
3107*4882a593Smuzhiyun .key_type_id = 1,
3108*4882a593Smuzhiyun .value_type_id = 1,
3109*4882a593Smuzhiyun .max_entries = 4,
3110*4882a593Smuzhiyun },
3111*4882a593Smuzhiyun
3112*4882a593Smuzhiyun {
3113*4882a593Smuzhiyun .descr = "valid struct, kind_flag, enum member, bitfield_size != 0",
3114*4882a593Smuzhiyun .raw_types = {
3115*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3116*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */
3117*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
3118*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3119*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3120*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 4)),
3121*4882a593Smuzhiyun BTF_END_RAW,
3122*4882a593Smuzhiyun },
3123*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C"),
3124*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3125*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3126*4882a593Smuzhiyun .key_size = sizeof(int),
3127*4882a593Smuzhiyun .value_size = sizeof(int),
3128*4882a593Smuzhiyun .key_type_id = 1,
3129*4882a593Smuzhiyun .value_type_id = 1,
3130*4882a593Smuzhiyun .max_entries = 4,
3131*4882a593Smuzhiyun },
3132*4882a593Smuzhiyun
3133*4882a593Smuzhiyun {
3134*4882a593Smuzhiyun .descr = "valid union, kind_flag, enum member, bitfield_size != 0",
3135*4882a593Smuzhiyun .raw_types = {
3136*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3137*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */
3138*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
3139*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4), /* [3] */
3140*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3141*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3142*4882a593Smuzhiyun BTF_END_RAW,
3143*4882a593Smuzhiyun },
3144*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C"),
3145*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3146*4882a593Smuzhiyun .map_name = "union_type_check_btf",
3147*4882a593Smuzhiyun .key_size = sizeof(int),
3148*4882a593Smuzhiyun .value_size = sizeof(int),
3149*4882a593Smuzhiyun .key_type_id = 1,
3150*4882a593Smuzhiyun .value_type_id = 1,
3151*4882a593Smuzhiyun .max_entries = 4,
3152*4882a593Smuzhiyun },
3153*4882a593Smuzhiyun
3154*4882a593Smuzhiyun {
3155*4882a593Smuzhiyun .descr = "valid struct, kind_flag, typedef member, bitfield_size != 0",
3156*4882a593Smuzhiyun .raw_types = {
3157*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3158*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */
3159*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
3160*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3161*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3162*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 4)),
3163*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [4] */
3164*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [5] */
3165*4882a593Smuzhiyun BTF_END_RAW,
3166*4882a593Smuzhiyun },
3167*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3168*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3169*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3170*4882a593Smuzhiyun .key_size = sizeof(int),
3171*4882a593Smuzhiyun .value_size = sizeof(int),
3172*4882a593Smuzhiyun .key_type_id = 1,
3173*4882a593Smuzhiyun .value_type_id = 1,
3174*4882a593Smuzhiyun .max_entries = 4,
3175*4882a593Smuzhiyun },
3176*4882a593Smuzhiyun
3177*4882a593Smuzhiyun {
3178*4882a593Smuzhiyun .descr = "valid union, kind_flag, typedef member, bitfield_size != 0",
3179*4882a593Smuzhiyun .raw_types = {
3180*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3181*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */
3182*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
3183*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4), /* [3] */
3184*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3185*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 0)),
3186*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [4] */
3187*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [5] */
3188*4882a593Smuzhiyun BTF_END_RAW,
3189*4882a593Smuzhiyun },
3190*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3191*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3192*4882a593Smuzhiyun .map_name = "union_type_check_btf",
3193*4882a593Smuzhiyun .key_size = sizeof(int),
3194*4882a593Smuzhiyun .value_size = sizeof(int),
3195*4882a593Smuzhiyun .key_type_id = 1,
3196*4882a593Smuzhiyun .value_type_id = 1,
3197*4882a593Smuzhiyun .max_entries = 4,
3198*4882a593Smuzhiyun },
3199*4882a593Smuzhiyun
3200*4882a593Smuzhiyun {
3201*4882a593Smuzhiyun .descr = "invalid struct, kind_flag, bitfield_size greater than struct size",
3202*4882a593Smuzhiyun .raw_types = {
3203*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3204*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [2] */
3205*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3206*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 20)),
3207*4882a593Smuzhiyun BTF_END_RAW,
3208*4882a593Smuzhiyun },
3209*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3210*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3211*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3212*4882a593Smuzhiyun .key_size = sizeof(int),
3213*4882a593Smuzhiyun .value_size = sizeof(int),
3214*4882a593Smuzhiyun .key_type_id = 1,
3215*4882a593Smuzhiyun .value_type_id = 1,
3216*4882a593Smuzhiyun .max_entries = 4,
3217*4882a593Smuzhiyun .btf_load_err = true,
3218*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
3219*4882a593Smuzhiyun },
3220*4882a593Smuzhiyun
3221*4882a593Smuzhiyun {
3222*4882a593Smuzhiyun .descr = "invalid struct, kind_flag, bitfield base_type int not regular",
3223*4882a593Smuzhiyun .raw_types = {
3224*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3225*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 20, 4), /* [2] */
3226*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [3] */
3227*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 0)),
3228*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 20)),
3229*4882a593Smuzhiyun BTF_END_RAW,
3230*4882a593Smuzhiyun },
3231*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3232*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3233*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3234*4882a593Smuzhiyun .key_size = sizeof(int),
3235*4882a593Smuzhiyun .value_size = sizeof(int),
3236*4882a593Smuzhiyun .key_type_id = 1,
3237*4882a593Smuzhiyun .value_type_id = 1,
3238*4882a593Smuzhiyun .max_entries = 4,
3239*4882a593Smuzhiyun .btf_load_err = true,
3240*4882a593Smuzhiyun .err_str = "Invalid member base type",
3241*4882a593Smuzhiyun },
3242*4882a593Smuzhiyun
3243*4882a593Smuzhiyun {
3244*4882a593Smuzhiyun .descr = "invalid struct, kind_flag, base_type int not regular",
3245*4882a593Smuzhiyun .raw_types = {
3246*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3247*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 12, 4), /* [2] */
3248*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [3] */
3249*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 0)),
3250*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 8)),
3251*4882a593Smuzhiyun BTF_END_RAW,
3252*4882a593Smuzhiyun },
3253*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3254*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3255*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3256*4882a593Smuzhiyun .key_size = sizeof(int),
3257*4882a593Smuzhiyun .value_size = sizeof(int),
3258*4882a593Smuzhiyun .key_type_id = 1,
3259*4882a593Smuzhiyun .value_type_id = 1,
3260*4882a593Smuzhiyun .max_entries = 4,
3261*4882a593Smuzhiyun .btf_load_err = true,
3262*4882a593Smuzhiyun .err_str = "Invalid member base type",
3263*4882a593Smuzhiyun },
3264*4882a593Smuzhiyun
3265*4882a593Smuzhiyun {
3266*4882a593Smuzhiyun .descr = "invalid union, kind_flag, bitfield_size greater than struct size",
3267*4882a593Smuzhiyun .raw_types = {
3268*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3269*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 2), /* [2] */
3270*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(8, 0)),
3271*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3272*4882a593Smuzhiyun BTF_END_RAW,
3273*4882a593Smuzhiyun },
3274*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3275*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3276*4882a593Smuzhiyun .map_name = "union_type_check_btf",
3277*4882a593Smuzhiyun .key_size = sizeof(int),
3278*4882a593Smuzhiyun .value_size = sizeof(int),
3279*4882a593Smuzhiyun .key_type_id = 1,
3280*4882a593Smuzhiyun .value_type_id = 1,
3281*4882a593Smuzhiyun .max_entries = 4,
3282*4882a593Smuzhiyun .btf_load_err = true,
3283*4882a593Smuzhiyun .err_str = "Member exceeds struct_size",
3284*4882a593Smuzhiyun },
3285*4882a593Smuzhiyun
3286*4882a593Smuzhiyun {
3287*4882a593Smuzhiyun .descr = "invalid struct, kind_flag, int member, bitfield_size = 0, wrong byte alignment",
3288*4882a593Smuzhiyun .raw_types = {
3289*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3290*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
3291*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12), /* [3] */
3292*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3293*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3294*4882a593Smuzhiyun BTF_END_RAW,
3295*4882a593Smuzhiyun },
3296*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B"),
3297*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3298*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3299*4882a593Smuzhiyun .key_size = sizeof(int),
3300*4882a593Smuzhiyun .value_size = sizeof(int),
3301*4882a593Smuzhiyun .key_type_id = 1,
3302*4882a593Smuzhiyun .value_type_id = 1,
3303*4882a593Smuzhiyun .max_entries = 4,
3304*4882a593Smuzhiyun .btf_load_err = true,
3305*4882a593Smuzhiyun .err_str = "Invalid member offset",
3306*4882a593Smuzhiyun },
3307*4882a593Smuzhiyun
3308*4882a593Smuzhiyun {
3309*4882a593Smuzhiyun .descr = "invalid struct, kind_flag, enum member, bitfield_size = 0, wrong byte alignment",
3310*4882a593Smuzhiyun .raw_types = {
3311*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3312*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
3313*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */
3314*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
3315*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12), /* [3] */
3316*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3317*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3318*4882a593Smuzhiyun BTF_END_RAW,
3319*4882a593Smuzhiyun },
3320*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C"),
3321*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3322*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3323*4882a593Smuzhiyun .key_size = sizeof(int),
3324*4882a593Smuzhiyun .value_size = sizeof(int),
3325*4882a593Smuzhiyun .key_type_id = 1,
3326*4882a593Smuzhiyun .value_type_id = 1,
3327*4882a593Smuzhiyun .max_entries = 4,
3328*4882a593Smuzhiyun .btf_load_err = true,
3329*4882a593Smuzhiyun .err_str = "Invalid member offset",
3330*4882a593Smuzhiyun },
3331*4882a593Smuzhiyun
3332*4882a593Smuzhiyun {
3333*4882a593Smuzhiyun .descr = "128-bit int",
3334*4882a593Smuzhiyun .raw_types = {
3335*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3336*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */
3337*4882a593Smuzhiyun BTF_END_RAW,
3338*4882a593Smuzhiyun },
3339*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3340*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3341*4882a593Smuzhiyun .map_name = "int_type_check_btf",
3342*4882a593Smuzhiyun .key_size = sizeof(int),
3343*4882a593Smuzhiyun .value_size = sizeof(int),
3344*4882a593Smuzhiyun .key_type_id = 1,
3345*4882a593Smuzhiyun .value_type_id = 1,
3346*4882a593Smuzhiyun .max_entries = 4,
3347*4882a593Smuzhiyun },
3348*4882a593Smuzhiyun
3349*4882a593Smuzhiyun {
3350*4882a593Smuzhiyun .descr = "struct, 128-bit int member",
3351*4882a593Smuzhiyun .raw_types = {
3352*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3353*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */
3354*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16), /* [3] */
3355*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3356*4882a593Smuzhiyun BTF_END_RAW,
3357*4882a593Smuzhiyun },
3358*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3359*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3360*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3361*4882a593Smuzhiyun .key_size = sizeof(int),
3362*4882a593Smuzhiyun .value_size = sizeof(int),
3363*4882a593Smuzhiyun .key_type_id = 1,
3364*4882a593Smuzhiyun .value_type_id = 1,
3365*4882a593Smuzhiyun .max_entries = 4,
3366*4882a593Smuzhiyun },
3367*4882a593Smuzhiyun
3368*4882a593Smuzhiyun {
3369*4882a593Smuzhiyun .descr = "struct, 120-bit int member bitfield",
3370*4882a593Smuzhiyun .raw_types = {
3371*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3372*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 120, 16), /* [2] */
3373*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16), /* [3] */
3374*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3375*4882a593Smuzhiyun BTF_END_RAW,
3376*4882a593Smuzhiyun },
3377*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3378*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3379*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3380*4882a593Smuzhiyun .key_size = sizeof(int),
3381*4882a593Smuzhiyun .value_size = sizeof(int),
3382*4882a593Smuzhiyun .key_type_id = 1,
3383*4882a593Smuzhiyun .value_type_id = 1,
3384*4882a593Smuzhiyun .max_entries = 4,
3385*4882a593Smuzhiyun },
3386*4882a593Smuzhiyun
3387*4882a593Smuzhiyun {
3388*4882a593Smuzhiyun .descr = "struct, kind_flag, 128-bit int member",
3389*4882a593Smuzhiyun .raw_types = {
3390*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3391*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */
3392*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16), /* [3] */
3393*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3394*4882a593Smuzhiyun BTF_END_RAW,
3395*4882a593Smuzhiyun },
3396*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3397*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3398*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3399*4882a593Smuzhiyun .key_size = sizeof(int),
3400*4882a593Smuzhiyun .value_size = sizeof(int),
3401*4882a593Smuzhiyun .key_type_id = 1,
3402*4882a593Smuzhiyun .value_type_id = 1,
3403*4882a593Smuzhiyun .max_entries = 4,
3404*4882a593Smuzhiyun },
3405*4882a593Smuzhiyun
3406*4882a593Smuzhiyun {
3407*4882a593Smuzhiyun .descr = "struct, kind_flag, 120-bit int member bitfield",
3408*4882a593Smuzhiyun .raw_types = {
3409*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
3410*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */
3411*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16), /* [3] */
3412*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(120, 0)),
3413*4882a593Smuzhiyun BTF_END_RAW,
3414*4882a593Smuzhiyun },
3415*4882a593Smuzhiyun BTF_STR_SEC("\0A"),
3416*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3417*4882a593Smuzhiyun .map_name = "struct_type_check_btf",
3418*4882a593Smuzhiyun .key_size = sizeof(int),
3419*4882a593Smuzhiyun .value_size = sizeof(int),
3420*4882a593Smuzhiyun .key_type_id = 1,
3421*4882a593Smuzhiyun .value_type_id = 1,
3422*4882a593Smuzhiyun .max_entries = 4,
3423*4882a593Smuzhiyun },
3424*4882a593Smuzhiyun /*
3425*4882a593Smuzhiyun * typedef int arr_t[16];
3426*4882a593Smuzhiyun * struct s {
3427*4882a593Smuzhiyun * arr_t *a;
3428*4882a593Smuzhiyun * };
3429*4882a593Smuzhiyun */
3430*4882a593Smuzhiyun {
3431*4882a593Smuzhiyun .descr = "struct->ptr->typedef->array->int size resolution",
3432*4882a593Smuzhiyun .raw_types = {
3433*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */
3434*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3435*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [2] */
3436*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */
3437*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(5, 5, 16), /* [4] */
3438*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [5] */
3439*4882a593Smuzhiyun BTF_END_RAW,
3440*4882a593Smuzhiyun },
3441*4882a593Smuzhiyun BTF_STR_SEC("\0s\0a\0arr_t"),
3442*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3443*4882a593Smuzhiyun .map_name = "ptr_mod_chain_size_resolve_map",
3444*4882a593Smuzhiyun .key_size = sizeof(int),
3445*4882a593Smuzhiyun .value_size = sizeof(int) * 16,
3446*4882a593Smuzhiyun .key_type_id = 5 /* int */,
3447*4882a593Smuzhiyun .value_type_id = 3 /* arr_t */,
3448*4882a593Smuzhiyun .max_entries = 4,
3449*4882a593Smuzhiyun },
3450*4882a593Smuzhiyun /*
3451*4882a593Smuzhiyun * typedef int arr_t[16][8][4];
3452*4882a593Smuzhiyun * struct s {
3453*4882a593Smuzhiyun * arr_t *a;
3454*4882a593Smuzhiyun * };
3455*4882a593Smuzhiyun */
3456*4882a593Smuzhiyun {
3457*4882a593Smuzhiyun .descr = "struct->ptr->typedef->multi-array->int size resolution",
3458*4882a593Smuzhiyun .raw_types = {
3459*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */
3460*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3461*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [2] */
3462*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */
3463*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(5, 7, 16), /* [4] */
3464*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(6, 7, 8), /* [5] */
3465*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(7, 7, 4), /* [6] */
3466*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [7] */
3467*4882a593Smuzhiyun BTF_END_RAW,
3468*4882a593Smuzhiyun },
3469*4882a593Smuzhiyun BTF_STR_SEC("\0s\0a\0arr_t"),
3470*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3471*4882a593Smuzhiyun .map_name = "multi_arr_size_resolve_map",
3472*4882a593Smuzhiyun .key_size = sizeof(int),
3473*4882a593Smuzhiyun .value_size = sizeof(int) * 16 * 8 * 4,
3474*4882a593Smuzhiyun .key_type_id = 7 /* int */,
3475*4882a593Smuzhiyun .value_type_id = 3 /* arr_t */,
3476*4882a593Smuzhiyun .max_entries = 4,
3477*4882a593Smuzhiyun },
3478*4882a593Smuzhiyun /*
3479*4882a593Smuzhiyun * typedef int int_t;
3480*4882a593Smuzhiyun * typedef int_t arr3_t[4];
3481*4882a593Smuzhiyun * typedef arr3_t arr2_t[8];
3482*4882a593Smuzhiyun * typedef arr2_t arr1_t[16];
3483*4882a593Smuzhiyun * struct s {
3484*4882a593Smuzhiyun * arr1_t *a;
3485*4882a593Smuzhiyun * };
3486*4882a593Smuzhiyun */
3487*4882a593Smuzhiyun {
3488*4882a593Smuzhiyun .descr = "typedef/multi-arr mix size resolution",
3489*4882a593Smuzhiyun .raw_types = {
3490*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */
3491*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3492*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [2] */
3493*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */
3494*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(5, 10, 16), /* [4] */
3495*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 6), /* [5] */
3496*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(7, 10, 8), /* [6] */
3497*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 8), /* [7] */
3498*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(9, 10, 4), /* [8] */
3499*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 10), /* [9] */
3500*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [10] */
3501*4882a593Smuzhiyun BTF_END_RAW,
3502*4882a593Smuzhiyun },
3503*4882a593Smuzhiyun BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"),
3504*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
3505*4882a593Smuzhiyun .map_name = "typedef_arra_mix_size_resolve_map",
3506*4882a593Smuzhiyun .key_size = sizeof(int),
3507*4882a593Smuzhiyun .value_size = sizeof(int) * 16 * 8 * 4,
3508*4882a593Smuzhiyun .key_type_id = 10 /* int */,
3509*4882a593Smuzhiyun .value_type_id = 3 /* arr_t */,
3510*4882a593Smuzhiyun .max_entries = 4,
3511*4882a593Smuzhiyun },
3512*4882a593Smuzhiyun
3513*4882a593Smuzhiyun }; /* struct btf_raw_test raw_tests[] */
3514*4882a593Smuzhiyun
get_next_str(const char * start,const char * end)3515*4882a593Smuzhiyun static const char *get_next_str(const char *start, const char *end)
3516*4882a593Smuzhiyun {
3517*4882a593Smuzhiyun return start < end - 1 ? start + 1 : NULL;
3518*4882a593Smuzhiyun }
3519*4882a593Smuzhiyun
get_raw_sec_size(const __u32 * raw_types)3520*4882a593Smuzhiyun static int get_raw_sec_size(const __u32 *raw_types)
3521*4882a593Smuzhiyun {
3522*4882a593Smuzhiyun int i;
3523*4882a593Smuzhiyun
3524*4882a593Smuzhiyun for (i = MAX_NR_RAW_U32 - 1;
3525*4882a593Smuzhiyun i >= 0 && raw_types[i] != BTF_END_RAW;
3526*4882a593Smuzhiyun i--)
3527*4882a593Smuzhiyun ;
3528*4882a593Smuzhiyun
3529*4882a593Smuzhiyun return i < 0 ? i : i * sizeof(raw_types[0]);
3530*4882a593Smuzhiyun }
3531*4882a593Smuzhiyun
btf_raw_create(const struct btf_header * hdr,const __u32 * raw_types,const char * str,unsigned int str_sec_size,unsigned int * btf_size,const char ** ret_next_str)3532*4882a593Smuzhiyun static void *btf_raw_create(const struct btf_header *hdr,
3533*4882a593Smuzhiyun const __u32 *raw_types,
3534*4882a593Smuzhiyun const char *str,
3535*4882a593Smuzhiyun unsigned int str_sec_size,
3536*4882a593Smuzhiyun unsigned int *btf_size,
3537*4882a593Smuzhiyun const char **ret_next_str)
3538*4882a593Smuzhiyun {
3539*4882a593Smuzhiyun const char *next_str = str, *end_str = str + str_sec_size;
3540*4882a593Smuzhiyun const char **strs_idx = NULL, **tmp_strs_idx;
3541*4882a593Smuzhiyun int strs_cap = 0, strs_cnt = 0, next_str_idx = 0;
3542*4882a593Smuzhiyun unsigned int size_needed, offset;
3543*4882a593Smuzhiyun struct btf_header *ret_hdr;
3544*4882a593Smuzhiyun int i, type_sec_size, err = 0;
3545*4882a593Smuzhiyun uint32_t *ret_types;
3546*4882a593Smuzhiyun void *raw_btf = NULL;
3547*4882a593Smuzhiyun
3548*4882a593Smuzhiyun type_sec_size = get_raw_sec_size(raw_types);
3549*4882a593Smuzhiyun if (CHECK(type_sec_size < 0, "Cannot get nr_raw_types"))
3550*4882a593Smuzhiyun return NULL;
3551*4882a593Smuzhiyun
3552*4882a593Smuzhiyun size_needed = sizeof(*hdr) + type_sec_size + str_sec_size;
3553*4882a593Smuzhiyun raw_btf = malloc(size_needed);
3554*4882a593Smuzhiyun if (CHECK(!raw_btf, "Cannot allocate memory for raw_btf"))
3555*4882a593Smuzhiyun return NULL;
3556*4882a593Smuzhiyun
3557*4882a593Smuzhiyun /* Copy header */
3558*4882a593Smuzhiyun memcpy(raw_btf, hdr, sizeof(*hdr));
3559*4882a593Smuzhiyun offset = sizeof(*hdr);
3560*4882a593Smuzhiyun
3561*4882a593Smuzhiyun /* Index strings */
3562*4882a593Smuzhiyun while ((next_str = get_next_str(next_str, end_str))) {
3563*4882a593Smuzhiyun if (strs_cnt == strs_cap) {
3564*4882a593Smuzhiyun strs_cap += max(16, strs_cap / 2);
3565*4882a593Smuzhiyun tmp_strs_idx = realloc(strs_idx,
3566*4882a593Smuzhiyun sizeof(*strs_idx) * strs_cap);
3567*4882a593Smuzhiyun if (CHECK(!tmp_strs_idx,
3568*4882a593Smuzhiyun "Cannot allocate memory for strs_idx")) {
3569*4882a593Smuzhiyun err = -1;
3570*4882a593Smuzhiyun goto done;
3571*4882a593Smuzhiyun }
3572*4882a593Smuzhiyun strs_idx = tmp_strs_idx;
3573*4882a593Smuzhiyun }
3574*4882a593Smuzhiyun strs_idx[strs_cnt++] = next_str;
3575*4882a593Smuzhiyun next_str += strlen(next_str);
3576*4882a593Smuzhiyun }
3577*4882a593Smuzhiyun
3578*4882a593Smuzhiyun /* Copy type section */
3579*4882a593Smuzhiyun ret_types = raw_btf + offset;
3580*4882a593Smuzhiyun for (i = 0; i < type_sec_size / sizeof(raw_types[0]); i++) {
3581*4882a593Smuzhiyun if (raw_types[i] == NAME_TBD) {
3582*4882a593Smuzhiyun if (CHECK(next_str_idx == strs_cnt,
3583*4882a593Smuzhiyun "Error in getting next_str #%d",
3584*4882a593Smuzhiyun next_str_idx)) {
3585*4882a593Smuzhiyun err = -1;
3586*4882a593Smuzhiyun goto done;
3587*4882a593Smuzhiyun }
3588*4882a593Smuzhiyun ret_types[i] = strs_idx[next_str_idx++] - str;
3589*4882a593Smuzhiyun } else if (IS_NAME_NTH(raw_types[i])) {
3590*4882a593Smuzhiyun int idx = GET_NAME_NTH_IDX(raw_types[i]);
3591*4882a593Smuzhiyun
3592*4882a593Smuzhiyun if (CHECK(idx <= 0 || idx > strs_cnt,
3593*4882a593Smuzhiyun "Error getting string #%d, strs_cnt:%d",
3594*4882a593Smuzhiyun idx, strs_cnt)) {
3595*4882a593Smuzhiyun err = -1;
3596*4882a593Smuzhiyun goto done;
3597*4882a593Smuzhiyun }
3598*4882a593Smuzhiyun ret_types[i] = strs_idx[idx-1] - str;
3599*4882a593Smuzhiyun } else {
3600*4882a593Smuzhiyun ret_types[i] = raw_types[i];
3601*4882a593Smuzhiyun }
3602*4882a593Smuzhiyun }
3603*4882a593Smuzhiyun offset += type_sec_size;
3604*4882a593Smuzhiyun
3605*4882a593Smuzhiyun /* Copy string section */
3606*4882a593Smuzhiyun memcpy(raw_btf + offset, str, str_sec_size);
3607*4882a593Smuzhiyun
3608*4882a593Smuzhiyun ret_hdr = (struct btf_header *)raw_btf;
3609*4882a593Smuzhiyun ret_hdr->type_len = type_sec_size;
3610*4882a593Smuzhiyun ret_hdr->str_off = type_sec_size;
3611*4882a593Smuzhiyun ret_hdr->str_len = str_sec_size;
3612*4882a593Smuzhiyun
3613*4882a593Smuzhiyun *btf_size = size_needed;
3614*4882a593Smuzhiyun if (ret_next_str)
3615*4882a593Smuzhiyun *ret_next_str =
3616*4882a593Smuzhiyun next_str_idx < strs_cnt ? strs_idx[next_str_idx] : NULL;
3617*4882a593Smuzhiyun
3618*4882a593Smuzhiyun done:
3619*4882a593Smuzhiyun if (err) {
3620*4882a593Smuzhiyun if (raw_btf)
3621*4882a593Smuzhiyun free(raw_btf);
3622*4882a593Smuzhiyun if (strs_idx)
3623*4882a593Smuzhiyun free(strs_idx);
3624*4882a593Smuzhiyun return NULL;
3625*4882a593Smuzhiyun }
3626*4882a593Smuzhiyun return raw_btf;
3627*4882a593Smuzhiyun }
3628*4882a593Smuzhiyun
do_test_raw(unsigned int test_num)3629*4882a593Smuzhiyun static void do_test_raw(unsigned int test_num)
3630*4882a593Smuzhiyun {
3631*4882a593Smuzhiyun struct btf_raw_test *test = &raw_tests[test_num - 1];
3632*4882a593Smuzhiyun struct bpf_create_map_attr create_attr = {};
3633*4882a593Smuzhiyun int map_fd = -1, btf_fd = -1;
3634*4882a593Smuzhiyun unsigned int raw_btf_size;
3635*4882a593Smuzhiyun struct btf_header *hdr;
3636*4882a593Smuzhiyun void *raw_btf;
3637*4882a593Smuzhiyun int err;
3638*4882a593Smuzhiyun
3639*4882a593Smuzhiyun if (!test__start_subtest(test->descr))
3640*4882a593Smuzhiyun return;
3641*4882a593Smuzhiyun
3642*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl,
3643*4882a593Smuzhiyun test->raw_types,
3644*4882a593Smuzhiyun test->str_sec,
3645*4882a593Smuzhiyun test->str_sec_size,
3646*4882a593Smuzhiyun &raw_btf_size, NULL);
3647*4882a593Smuzhiyun if (!raw_btf)
3648*4882a593Smuzhiyun return;
3649*4882a593Smuzhiyun
3650*4882a593Smuzhiyun hdr = raw_btf;
3651*4882a593Smuzhiyun
3652*4882a593Smuzhiyun hdr->hdr_len = (int)hdr->hdr_len + test->hdr_len_delta;
3653*4882a593Smuzhiyun hdr->type_off = (int)hdr->type_off + test->type_off_delta;
3654*4882a593Smuzhiyun hdr->str_off = (int)hdr->str_off + test->str_off_delta;
3655*4882a593Smuzhiyun hdr->str_len = (int)hdr->str_len + test->str_len_delta;
3656*4882a593Smuzhiyun
3657*4882a593Smuzhiyun *btf_log_buf = '\0';
3658*4882a593Smuzhiyun btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
3659*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
3660*4882a593Smuzhiyun always_log);
3661*4882a593Smuzhiyun free(raw_btf);
3662*4882a593Smuzhiyun
3663*4882a593Smuzhiyun err = ((btf_fd == -1) != test->btf_load_err);
3664*4882a593Smuzhiyun if (CHECK(err, "btf_fd:%d test->btf_load_err:%u",
3665*4882a593Smuzhiyun btf_fd, test->btf_load_err) ||
3666*4882a593Smuzhiyun CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
3667*4882a593Smuzhiyun "expected err_str:%s", test->err_str)) {
3668*4882a593Smuzhiyun err = -1;
3669*4882a593Smuzhiyun goto done;
3670*4882a593Smuzhiyun }
3671*4882a593Smuzhiyun
3672*4882a593Smuzhiyun if (err || btf_fd == -1)
3673*4882a593Smuzhiyun goto done;
3674*4882a593Smuzhiyun
3675*4882a593Smuzhiyun create_attr.name = test->map_name;
3676*4882a593Smuzhiyun create_attr.map_type = test->map_type;
3677*4882a593Smuzhiyun create_attr.key_size = test->key_size;
3678*4882a593Smuzhiyun create_attr.value_size = test->value_size;
3679*4882a593Smuzhiyun create_attr.max_entries = test->max_entries;
3680*4882a593Smuzhiyun create_attr.btf_fd = btf_fd;
3681*4882a593Smuzhiyun create_attr.btf_key_type_id = test->key_type_id;
3682*4882a593Smuzhiyun create_attr.btf_value_type_id = test->value_type_id;
3683*4882a593Smuzhiyun
3684*4882a593Smuzhiyun map_fd = bpf_create_map_xattr(&create_attr);
3685*4882a593Smuzhiyun
3686*4882a593Smuzhiyun err = ((map_fd == -1) != test->map_create_err);
3687*4882a593Smuzhiyun CHECK(err, "map_fd:%d test->map_create_err:%u",
3688*4882a593Smuzhiyun map_fd, test->map_create_err);
3689*4882a593Smuzhiyun
3690*4882a593Smuzhiyun done:
3691*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
3692*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
3693*4882a593Smuzhiyun if (btf_fd != -1)
3694*4882a593Smuzhiyun close(btf_fd);
3695*4882a593Smuzhiyun if (map_fd != -1)
3696*4882a593Smuzhiyun close(map_fd);
3697*4882a593Smuzhiyun }
3698*4882a593Smuzhiyun
3699*4882a593Smuzhiyun struct btf_get_info_test {
3700*4882a593Smuzhiyun const char *descr;
3701*4882a593Smuzhiyun const char *str_sec;
3702*4882a593Smuzhiyun __u32 raw_types[MAX_NR_RAW_U32];
3703*4882a593Smuzhiyun __u32 str_sec_size;
3704*4882a593Smuzhiyun int btf_size_delta;
3705*4882a593Smuzhiyun int (*special_test)(unsigned int test_num);
3706*4882a593Smuzhiyun };
3707*4882a593Smuzhiyun
3708*4882a593Smuzhiyun static int test_big_btf_info(unsigned int test_num);
3709*4882a593Smuzhiyun static int test_btf_id(unsigned int test_num);
3710*4882a593Smuzhiyun
3711*4882a593Smuzhiyun const struct btf_get_info_test get_info_tests[] = {
3712*4882a593Smuzhiyun {
3713*4882a593Smuzhiyun .descr = "== raw_btf_size+1",
3714*4882a593Smuzhiyun .raw_types = {
3715*4882a593Smuzhiyun /* int */ /* [1] */
3716*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
3717*4882a593Smuzhiyun BTF_END_RAW,
3718*4882a593Smuzhiyun },
3719*4882a593Smuzhiyun .str_sec = "",
3720*4882a593Smuzhiyun .str_sec_size = sizeof(""),
3721*4882a593Smuzhiyun .btf_size_delta = 1,
3722*4882a593Smuzhiyun },
3723*4882a593Smuzhiyun {
3724*4882a593Smuzhiyun .descr = "== raw_btf_size-3",
3725*4882a593Smuzhiyun .raw_types = {
3726*4882a593Smuzhiyun /* int */ /* [1] */
3727*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
3728*4882a593Smuzhiyun BTF_END_RAW,
3729*4882a593Smuzhiyun },
3730*4882a593Smuzhiyun .str_sec = "",
3731*4882a593Smuzhiyun .str_sec_size = sizeof(""),
3732*4882a593Smuzhiyun .btf_size_delta = -3,
3733*4882a593Smuzhiyun },
3734*4882a593Smuzhiyun {
3735*4882a593Smuzhiyun .descr = "Large bpf_btf_info",
3736*4882a593Smuzhiyun .raw_types = {
3737*4882a593Smuzhiyun /* int */ /* [1] */
3738*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
3739*4882a593Smuzhiyun BTF_END_RAW,
3740*4882a593Smuzhiyun },
3741*4882a593Smuzhiyun .str_sec = "",
3742*4882a593Smuzhiyun .str_sec_size = sizeof(""),
3743*4882a593Smuzhiyun .special_test = test_big_btf_info,
3744*4882a593Smuzhiyun },
3745*4882a593Smuzhiyun {
3746*4882a593Smuzhiyun .descr = "BTF ID",
3747*4882a593Smuzhiyun .raw_types = {
3748*4882a593Smuzhiyun /* int */ /* [1] */
3749*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
3750*4882a593Smuzhiyun /* unsigned int */ /* [2] */
3751*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),
3752*4882a593Smuzhiyun BTF_END_RAW,
3753*4882a593Smuzhiyun },
3754*4882a593Smuzhiyun .str_sec = "",
3755*4882a593Smuzhiyun .str_sec_size = sizeof(""),
3756*4882a593Smuzhiyun .special_test = test_btf_id,
3757*4882a593Smuzhiyun },
3758*4882a593Smuzhiyun };
3759*4882a593Smuzhiyun
test_big_btf_info(unsigned int test_num)3760*4882a593Smuzhiyun static int test_big_btf_info(unsigned int test_num)
3761*4882a593Smuzhiyun {
3762*4882a593Smuzhiyun const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
3763*4882a593Smuzhiyun uint8_t *raw_btf = NULL, *user_btf = NULL;
3764*4882a593Smuzhiyun unsigned int raw_btf_size;
3765*4882a593Smuzhiyun struct {
3766*4882a593Smuzhiyun struct bpf_btf_info info;
3767*4882a593Smuzhiyun uint64_t garbage;
3768*4882a593Smuzhiyun } info_garbage;
3769*4882a593Smuzhiyun struct bpf_btf_info *info;
3770*4882a593Smuzhiyun int btf_fd = -1, err;
3771*4882a593Smuzhiyun uint32_t info_len;
3772*4882a593Smuzhiyun
3773*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl,
3774*4882a593Smuzhiyun test->raw_types,
3775*4882a593Smuzhiyun test->str_sec,
3776*4882a593Smuzhiyun test->str_sec_size,
3777*4882a593Smuzhiyun &raw_btf_size, NULL);
3778*4882a593Smuzhiyun
3779*4882a593Smuzhiyun if (!raw_btf)
3780*4882a593Smuzhiyun return -1;
3781*4882a593Smuzhiyun
3782*4882a593Smuzhiyun *btf_log_buf = '\0';
3783*4882a593Smuzhiyun
3784*4882a593Smuzhiyun user_btf = malloc(raw_btf_size);
3785*4882a593Smuzhiyun if (CHECK(!user_btf, "!user_btf")) {
3786*4882a593Smuzhiyun err = -1;
3787*4882a593Smuzhiyun goto done;
3788*4882a593Smuzhiyun }
3789*4882a593Smuzhiyun
3790*4882a593Smuzhiyun btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
3791*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
3792*4882a593Smuzhiyun always_log);
3793*4882a593Smuzhiyun if (CHECK(btf_fd == -1, "errno:%d", errno)) {
3794*4882a593Smuzhiyun err = -1;
3795*4882a593Smuzhiyun goto done;
3796*4882a593Smuzhiyun }
3797*4882a593Smuzhiyun
3798*4882a593Smuzhiyun /*
3799*4882a593Smuzhiyun * GET_INFO should error out if the userspace info
3800*4882a593Smuzhiyun * has non zero tailing bytes.
3801*4882a593Smuzhiyun */
3802*4882a593Smuzhiyun info = &info_garbage.info;
3803*4882a593Smuzhiyun memset(info, 0, sizeof(*info));
3804*4882a593Smuzhiyun info_garbage.garbage = 0xdeadbeef;
3805*4882a593Smuzhiyun info_len = sizeof(info_garbage);
3806*4882a593Smuzhiyun info->btf = ptr_to_u64(user_btf);
3807*4882a593Smuzhiyun info->btf_size = raw_btf_size;
3808*4882a593Smuzhiyun
3809*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len);
3810*4882a593Smuzhiyun if (CHECK(!err, "!err")) {
3811*4882a593Smuzhiyun err = -1;
3812*4882a593Smuzhiyun goto done;
3813*4882a593Smuzhiyun }
3814*4882a593Smuzhiyun
3815*4882a593Smuzhiyun /*
3816*4882a593Smuzhiyun * GET_INFO should succeed even info_len is larger than
3817*4882a593Smuzhiyun * the kernel supported as long as tailing bytes are zero.
3818*4882a593Smuzhiyun * The kernel supported info len should also be returned
3819*4882a593Smuzhiyun * to userspace.
3820*4882a593Smuzhiyun */
3821*4882a593Smuzhiyun info_garbage.garbage = 0;
3822*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len);
3823*4882a593Smuzhiyun if (CHECK(err || info_len != sizeof(*info),
3824*4882a593Smuzhiyun "err:%d errno:%d info_len:%u sizeof(*info):%zu",
3825*4882a593Smuzhiyun err, errno, info_len, sizeof(*info))) {
3826*4882a593Smuzhiyun err = -1;
3827*4882a593Smuzhiyun goto done;
3828*4882a593Smuzhiyun }
3829*4882a593Smuzhiyun
3830*4882a593Smuzhiyun fprintf(stderr, "OK");
3831*4882a593Smuzhiyun
3832*4882a593Smuzhiyun done:
3833*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
3834*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
3835*4882a593Smuzhiyun
3836*4882a593Smuzhiyun free(raw_btf);
3837*4882a593Smuzhiyun free(user_btf);
3838*4882a593Smuzhiyun
3839*4882a593Smuzhiyun if (btf_fd != -1)
3840*4882a593Smuzhiyun close(btf_fd);
3841*4882a593Smuzhiyun
3842*4882a593Smuzhiyun return err;
3843*4882a593Smuzhiyun }
3844*4882a593Smuzhiyun
test_btf_id(unsigned int test_num)3845*4882a593Smuzhiyun static int test_btf_id(unsigned int test_num)
3846*4882a593Smuzhiyun {
3847*4882a593Smuzhiyun const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
3848*4882a593Smuzhiyun struct bpf_create_map_attr create_attr = {};
3849*4882a593Smuzhiyun uint8_t *raw_btf = NULL, *user_btf[2] = {};
3850*4882a593Smuzhiyun int btf_fd[2] = {-1, -1}, map_fd = -1;
3851*4882a593Smuzhiyun struct bpf_map_info map_info = {};
3852*4882a593Smuzhiyun struct bpf_btf_info info[2] = {};
3853*4882a593Smuzhiyun unsigned int raw_btf_size;
3854*4882a593Smuzhiyun uint32_t info_len;
3855*4882a593Smuzhiyun int err, i, ret;
3856*4882a593Smuzhiyun
3857*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl,
3858*4882a593Smuzhiyun test->raw_types,
3859*4882a593Smuzhiyun test->str_sec,
3860*4882a593Smuzhiyun test->str_sec_size,
3861*4882a593Smuzhiyun &raw_btf_size, NULL);
3862*4882a593Smuzhiyun
3863*4882a593Smuzhiyun if (!raw_btf)
3864*4882a593Smuzhiyun return -1;
3865*4882a593Smuzhiyun
3866*4882a593Smuzhiyun *btf_log_buf = '\0';
3867*4882a593Smuzhiyun
3868*4882a593Smuzhiyun for (i = 0; i < 2; i++) {
3869*4882a593Smuzhiyun user_btf[i] = malloc(raw_btf_size);
3870*4882a593Smuzhiyun if (CHECK(!user_btf[i], "!user_btf[%d]", i)) {
3871*4882a593Smuzhiyun err = -1;
3872*4882a593Smuzhiyun goto done;
3873*4882a593Smuzhiyun }
3874*4882a593Smuzhiyun info[i].btf = ptr_to_u64(user_btf[i]);
3875*4882a593Smuzhiyun info[i].btf_size = raw_btf_size;
3876*4882a593Smuzhiyun }
3877*4882a593Smuzhiyun
3878*4882a593Smuzhiyun btf_fd[0] = bpf_load_btf(raw_btf, raw_btf_size,
3879*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
3880*4882a593Smuzhiyun always_log);
3881*4882a593Smuzhiyun if (CHECK(btf_fd[0] == -1, "errno:%d", errno)) {
3882*4882a593Smuzhiyun err = -1;
3883*4882a593Smuzhiyun goto done;
3884*4882a593Smuzhiyun }
3885*4882a593Smuzhiyun
3886*4882a593Smuzhiyun /* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */
3887*4882a593Smuzhiyun info_len = sizeof(info[0]);
3888*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(btf_fd[0], &info[0], &info_len);
3889*4882a593Smuzhiyun if (CHECK(err, "errno:%d", errno)) {
3890*4882a593Smuzhiyun err = -1;
3891*4882a593Smuzhiyun goto done;
3892*4882a593Smuzhiyun }
3893*4882a593Smuzhiyun
3894*4882a593Smuzhiyun btf_fd[1] = bpf_btf_get_fd_by_id(info[0].id);
3895*4882a593Smuzhiyun if (CHECK(btf_fd[1] == -1, "errno:%d", errno)) {
3896*4882a593Smuzhiyun err = -1;
3897*4882a593Smuzhiyun goto done;
3898*4882a593Smuzhiyun }
3899*4882a593Smuzhiyun
3900*4882a593Smuzhiyun ret = 0;
3901*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(btf_fd[1], &info[1], &info_len);
3902*4882a593Smuzhiyun if (CHECK(err || info[0].id != info[1].id ||
3903*4882a593Smuzhiyun info[0].btf_size != info[1].btf_size ||
3904*4882a593Smuzhiyun (ret = memcmp(user_btf[0], user_btf[1], info[0].btf_size)),
3905*4882a593Smuzhiyun "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d",
3906*4882a593Smuzhiyun err, errno, info[0].id, info[1].id,
3907*4882a593Smuzhiyun info[0].btf_size, info[1].btf_size, ret)) {
3908*4882a593Smuzhiyun err = -1;
3909*4882a593Smuzhiyun goto done;
3910*4882a593Smuzhiyun }
3911*4882a593Smuzhiyun
3912*4882a593Smuzhiyun /* Test btf members in struct bpf_map_info */
3913*4882a593Smuzhiyun create_attr.name = "test_btf_id";
3914*4882a593Smuzhiyun create_attr.map_type = BPF_MAP_TYPE_ARRAY;
3915*4882a593Smuzhiyun create_attr.key_size = sizeof(int);
3916*4882a593Smuzhiyun create_attr.value_size = sizeof(unsigned int);
3917*4882a593Smuzhiyun create_attr.max_entries = 4;
3918*4882a593Smuzhiyun create_attr.btf_fd = btf_fd[0];
3919*4882a593Smuzhiyun create_attr.btf_key_type_id = 1;
3920*4882a593Smuzhiyun create_attr.btf_value_type_id = 2;
3921*4882a593Smuzhiyun
3922*4882a593Smuzhiyun map_fd = bpf_create_map_xattr(&create_attr);
3923*4882a593Smuzhiyun if (CHECK(map_fd == -1, "errno:%d", errno)) {
3924*4882a593Smuzhiyun err = -1;
3925*4882a593Smuzhiyun goto done;
3926*4882a593Smuzhiyun }
3927*4882a593Smuzhiyun
3928*4882a593Smuzhiyun info_len = sizeof(map_info);
3929*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(map_fd, &map_info, &info_len);
3930*4882a593Smuzhiyun if (CHECK(err || map_info.btf_id != info[0].id ||
3931*4882a593Smuzhiyun map_info.btf_key_type_id != 1 || map_info.btf_value_type_id != 2,
3932*4882a593Smuzhiyun "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u",
3933*4882a593Smuzhiyun err, errno, info[0].id, map_info.btf_id, map_info.btf_key_type_id,
3934*4882a593Smuzhiyun map_info.btf_value_type_id)) {
3935*4882a593Smuzhiyun err = -1;
3936*4882a593Smuzhiyun goto done;
3937*4882a593Smuzhiyun }
3938*4882a593Smuzhiyun
3939*4882a593Smuzhiyun for (i = 0; i < 2; i++) {
3940*4882a593Smuzhiyun close(btf_fd[i]);
3941*4882a593Smuzhiyun btf_fd[i] = -1;
3942*4882a593Smuzhiyun }
3943*4882a593Smuzhiyun
3944*4882a593Smuzhiyun /* Test BTF ID is removed from the kernel */
3945*4882a593Smuzhiyun btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id);
3946*4882a593Smuzhiyun if (CHECK(btf_fd[0] == -1, "errno:%d", errno)) {
3947*4882a593Smuzhiyun err = -1;
3948*4882a593Smuzhiyun goto done;
3949*4882a593Smuzhiyun }
3950*4882a593Smuzhiyun close(btf_fd[0]);
3951*4882a593Smuzhiyun btf_fd[0] = -1;
3952*4882a593Smuzhiyun
3953*4882a593Smuzhiyun /* The map holds the last ref to BTF and its btf_id */
3954*4882a593Smuzhiyun close(map_fd);
3955*4882a593Smuzhiyun map_fd = -1;
3956*4882a593Smuzhiyun btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id);
3957*4882a593Smuzhiyun if (CHECK(btf_fd[0] != -1, "BTF lingers")) {
3958*4882a593Smuzhiyun err = -1;
3959*4882a593Smuzhiyun goto done;
3960*4882a593Smuzhiyun }
3961*4882a593Smuzhiyun
3962*4882a593Smuzhiyun fprintf(stderr, "OK");
3963*4882a593Smuzhiyun
3964*4882a593Smuzhiyun done:
3965*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
3966*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
3967*4882a593Smuzhiyun
3968*4882a593Smuzhiyun free(raw_btf);
3969*4882a593Smuzhiyun if (map_fd != -1)
3970*4882a593Smuzhiyun close(map_fd);
3971*4882a593Smuzhiyun for (i = 0; i < 2; i++) {
3972*4882a593Smuzhiyun free(user_btf[i]);
3973*4882a593Smuzhiyun if (btf_fd[i] != -1)
3974*4882a593Smuzhiyun close(btf_fd[i]);
3975*4882a593Smuzhiyun }
3976*4882a593Smuzhiyun
3977*4882a593Smuzhiyun return err;
3978*4882a593Smuzhiyun }
3979*4882a593Smuzhiyun
do_test_get_info(unsigned int test_num)3980*4882a593Smuzhiyun static void do_test_get_info(unsigned int test_num)
3981*4882a593Smuzhiyun {
3982*4882a593Smuzhiyun const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
3983*4882a593Smuzhiyun unsigned int raw_btf_size, user_btf_size, expected_nbytes;
3984*4882a593Smuzhiyun uint8_t *raw_btf = NULL, *user_btf = NULL;
3985*4882a593Smuzhiyun struct bpf_btf_info info = {};
3986*4882a593Smuzhiyun int btf_fd = -1, err, ret;
3987*4882a593Smuzhiyun uint32_t info_len;
3988*4882a593Smuzhiyun
3989*4882a593Smuzhiyun if (!test__start_subtest(test->descr))
3990*4882a593Smuzhiyun return;
3991*4882a593Smuzhiyun
3992*4882a593Smuzhiyun if (test->special_test) {
3993*4882a593Smuzhiyun err = test->special_test(test_num);
3994*4882a593Smuzhiyun if (CHECK(err, "failed: %d\n", err))
3995*4882a593Smuzhiyun return;
3996*4882a593Smuzhiyun }
3997*4882a593Smuzhiyun
3998*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl,
3999*4882a593Smuzhiyun test->raw_types,
4000*4882a593Smuzhiyun test->str_sec,
4001*4882a593Smuzhiyun test->str_sec_size,
4002*4882a593Smuzhiyun &raw_btf_size, NULL);
4003*4882a593Smuzhiyun
4004*4882a593Smuzhiyun if (!raw_btf)
4005*4882a593Smuzhiyun return;
4006*4882a593Smuzhiyun
4007*4882a593Smuzhiyun *btf_log_buf = '\0';
4008*4882a593Smuzhiyun
4009*4882a593Smuzhiyun user_btf = malloc(raw_btf_size);
4010*4882a593Smuzhiyun if (CHECK(!user_btf, "!user_btf")) {
4011*4882a593Smuzhiyun err = -1;
4012*4882a593Smuzhiyun goto done;
4013*4882a593Smuzhiyun }
4014*4882a593Smuzhiyun
4015*4882a593Smuzhiyun btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
4016*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
4017*4882a593Smuzhiyun always_log);
4018*4882a593Smuzhiyun if (CHECK(btf_fd == -1, "errno:%d", errno)) {
4019*4882a593Smuzhiyun err = -1;
4020*4882a593Smuzhiyun goto done;
4021*4882a593Smuzhiyun }
4022*4882a593Smuzhiyun
4023*4882a593Smuzhiyun user_btf_size = (int)raw_btf_size + test->btf_size_delta;
4024*4882a593Smuzhiyun expected_nbytes = min(raw_btf_size, user_btf_size);
4025*4882a593Smuzhiyun if (raw_btf_size > expected_nbytes)
4026*4882a593Smuzhiyun memset(user_btf + expected_nbytes, 0xff,
4027*4882a593Smuzhiyun raw_btf_size - expected_nbytes);
4028*4882a593Smuzhiyun
4029*4882a593Smuzhiyun info_len = sizeof(info);
4030*4882a593Smuzhiyun info.btf = ptr_to_u64(user_btf);
4031*4882a593Smuzhiyun info.btf_size = user_btf_size;
4032*4882a593Smuzhiyun
4033*4882a593Smuzhiyun ret = 0;
4034*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(btf_fd, &info, &info_len);
4035*4882a593Smuzhiyun if (CHECK(err || !info.id || info_len != sizeof(info) ||
4036*4882a593Smuzhiyun info.btf_size != raw_btf_size ||
4037*4882a593Smuzhiyun (ret = memcmp(raw_btf, user_btf, expected_nbytes)),
4038*4882a593Smuzhiyun "err:%d errno:%d info.id:%u info_len:%u sizeof(info):%zu raw_btf_size:%u info.btf_size:%u expected_nbytes:%u memcmp:%d",
4039*4882a593Smuzhiyun err, errno, info.id, info_len, sizeof(info),
4040*4882a593Smuzhiyun raw_btf_size, info.btf_size, expected_nbytes, ret)) {
4041*4882a593Smuzhiyun err = -1;
4042*4882a593Smuzhiyun goto done;
4043*4882a593Smuzhiyun }
4044*4882a593Smuzhiyun
4045*4882a593Smuzhiyun while (expected_nbytes < raw_btf_size) {
4046*4882a593Smuzhiyun fprintf(stderr, "%u...", expected_nbytes);
4047*4882a593Smuzhiyun if (CHECK(user_btf[expected_nbytes++] != 0xff,
4048*4882a593Smuzhiyun "user_btf[%u]:%x != 0xff", expected_nbytes - 1,
4049*4882a593Smuzhiyun user_btf[expected_nbytes - 1])) {
4050*4882a593Smuzhiyun err = -1;
4051*4882a593Smuzhiyun goto done;
4052*4882a593Smuzhiyun }
4053*4882a593Smuzhiyun }
4054*4882a593Smuzhiyun
4055*4882a593Smuzhiyun fprintf(stderr, "OK");
4056*4882a593Smuzhiyun
4057*4882a593Smuzhiyun done:
4058*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
4059*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
4060*4882a593Smuzhiyun
4061*4882a593Smuzhiyun free(raw_btf);
4062*4882a593Smuzhiyun free(user_btf);
4063*4882a593Smuzhiyun
4064*4882a593Smuzhiyun if (btf_fd != -1)
4065*4882a593Smuzhiyun close(btf_fd);
4066*4882a593Smuzhiyun }
4067*4882a593Smuzhiyun
4068*4882a593Smuzhiyun struct btf_file_test {
4069*4882a593Smuzhiyun const char *file;
4070*4882a593Smuzhiyun bool btf_kv_notfound;
4071*4882a593Smuzhiyun };
4072*4882a593Smuzhiyun
4073*4882a593Smuzhiyun static struct btf_file_test file_tests[] = {
4074*4882a593Smuzhiyun { .file = "test_btf_haskv.o", },
4075*4882a593Smuzhiyun { .file = "test_btf_newkv.o", },
4076*4882a593Smuzhiyun { .file = "test_btf_nokv.o", .btf_kv_notfound = true, },
4077*4882a593Smuzhiyun };
4078*4882a593Smuzhiyun
do_test_file(unsigned int test_num)4079*4882a593Smuzhiyun static void do_test_file(unsigned int test_num)
4080*4882a593Smuzhiyun {
4081*4882a593Smuzhiyun const struct btf_file_test *test = &file_tests[test_num - 1];
4082*4882a593Smuzhiyun const char *expected_fnames[] = {"_dummy_tracepoint",
4083*4882a593Smuzhiyun "test_long_fname_1",
4084*4882a593Smuzhiyun "test_long_fname_2"};
4085*4882a593Smuzhiyun struct btf_ext *btf_ext = NULL;
4086*4882a593Smuzhiyun struct bpf_prog_info info = {};
4087*4882a593Smuzhiyun struct bpf_object *obj = NULL;
4088*4882a593Smuzhiyun struct bpf_func_info *finfo;
4089*4882a593Smuzhiyun struct bpf_program *prog;
4090*4882a593Smuzhiyun __u32 info_len, rec_size;
4091*4882a593Smuzhiyun bool has_btf_ext = false;
4092*4882a593Smuzhiyun struct btf *btf = NULL;
4093*4882a593Smuzhiyun void *func_info = NULL;
4094*4882a593Smuzhiyun struct bpf_map *map;
4095*4882a593Smuzhiyun int i, err, prog_fd;
4096*4882a593Smuzhiyun
4097*4882a593Smuzhiyun if (!test__start_subtest(test->file))
4098*4882a593Smuzhiyun return;
4099*4882a593Smuzhiyun
4100*4882a593Smuzhiyun btf = btf__parse_elf(test->file, &btf_ext);
4101*4882a593Smuzhiyun if (IS_ERR(btf)) {
4102*4882a593Smuzhiyun if (PTR_ERR(btf) == -ENOENT) {
4103*4882a593Smuzhiyun printf("%s:SKIP: No ELF %s found", __func__, BTF_ELF_SEC);
4104*4882a593Smuzhiyun test__skip();
4105*4882a593Smuzhiyun return;
4106*4882a593Smuzhiyun }
4107*4882a593Smuzhiyun return;
4108*4882a593Smuzhiyun }
4109*4882a593Smuzhiyun btf__free(btf);
4110*4882a593Smuzhiyun
4111*4882a593Smuzhiyun has_btf_ext = btf_ext != NULL;
4112*4882a593Smuzhiyun btf_ext__free(btf_ext);
4113*4882a593Smuzhiyun
4114*4882a593Smuzhiyun obj = bpf_object__open(test->file);
4115*4882a593Smuzhiyun if (CHECK(IS_ERR(obj), "obj: %ld", PTR_ERR(obj)))
4116*4882a593Smuzhiyun return;
4117*4882a593Smuzhiyun
4118*4882a593Smuzhiyun prog = bpf_program__next(NULL, obj);
4119*4882a593Smuzhiyun if (CHECK(!prog, "Cannot find bpf_prog")) {
4120*4882a593Smuzhiyun err = -1;
4121*4882a593Smuzhiyun goto done;
4122*4882a593Smuzhiyun }
4123*4882a593Smuzhiyun
4124*4882a593Smuzhiyun bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT);
4125*4882a593Smuzhiyun err = bpf_object__load(obj);
4126*4882a593Smuzhiyun if (CHECK(err < 0, "bpf_object__load: %d", err))
4127*4882a593Smuzhiyun goto done;
4128*4882a593Smuzhiyun prog_fd = bpf_program__fd(prog);
4129*4882a593Smuzhiyun
4130*4882a593Smuzhiyun map = bpf_object__find_map_by_name(obj, "btf_map");
4131*4882a593Smuzhiyun if (CHECK(!map, "btf_map not found")) {
4132*4882a593Smuzhiyun err = -1;
4133*4882a593Smuzhiyun goto done;
4134*4882a593Smuzhiyun }
4135*4882a593Smuzhiyun
4136*4882a593Smuzhiyun err = (bpf_map__btf_key_type_id(map) == 0 || bpf_map__btf_value_type_id(map) == 0)
4137*4882a593Smuzhiyun != test->btf_kv_notfound;
4138*4882a593Smuzhiyun if (CHECK(err, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u",
4139*4882a593Smuzhiyun bpf_map__btf_key_type_id(map), bpf_map__btf_value_type_id(map),
4140*4882a593Smuzhiyun test->btf_kv_notfound))
4141*4882a593Smuzhiyun goto done;
4142*4882a593Smuzhiyun
4143*4882a593Smuzhiyun if (!has_btf_ext)
4144*4882a593Smuzhiyun goto skip;
4145*4882a593Smuzhiyun
4146*4882a593Smuzhiyun /* get necessary program info */
4147*4882a593Smuzhiyun info_len = sizeof(struct bpf_prog_info);
4148*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
4149*4882a593Smuzhiyun
4150*4882a593Smuzhiyun if (CHECK(err == -1, "invalid get info (1st) errno:%d", errno)) {
4151*4882a593Smuzhiyun fprintf(stderr, "%s\n", btf_log_buf);
4152*4882a593Smuzhiyun err = -1;
4153*4882a593Smuzhiyun goto done;
4154*4882a593Smuzhiyun }
4155*4882a593Smuzhiyun if (CHECK(info.nr_func_info != 3,
4156*4882a593Smuzhiyun "incorrect info.nr_func_info (1st) %d",
4157*4882a593Smuzhiyun info.nr_func_info)) {
4158*4882a593Smuzhiyun err = -1;
4159*4882a593Smuzhiyun goto done;
4160*4882a593Smuzhiyun }
4161*4882a593Smuzhiyun rec_size = info.func_info_rec_size;
4162*4882a593Smuzhiyun if (CHECK(rec_size != sizeof(struct bpf_func_info),
4163*4882a593Smuzhiyun "incorrect info.func_info_rec_size (1st) %d\n", rec_size)) {
4164*4882a593Smuzhiyun err = -1;
4165*4882a593Smuzhiyun goto done;
4166*4882a593Smuzhiyun }
4167*4882a593Smuzhiyun
4168*4882a593Smuzhiyun func_info = malloc(info.nr_func_info * rec_size);
4169*4882a593Smuzhiyun if (CHECK(!func_info, "out of memory")) {
4170*4882a593Smuzhiyun err = -1;
4171*4882a593Smuzhiyun goto done;
4172*4882a593Smuzhiyun }
4173*4882a593Smuzhiyun
4174*4882a593Smuzhiyun /* reset info to only retrieve func_info related data */
4175*4882a593Smuzhiyun memset(&info, 0, sizeof(info));
4176*4882a593Smuzhiyun info.nr_func_info = 3;
4177*4882a593Smuzhiyun info.func_info_rec_size = rec_size;
4178*4882a593Smuzhiyun info.func_info = ptr_to_u64(func_info);
4179*4882a593Smuzhiyun
4180*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
4181*4882a593Smuzhiyun
4182*4882a593Smuzhiyun if (CHECK(err == -1, "invalid get info (2nd) errno:%d", errno)) {
4183*4882a593Smuzhiyun fprintf(stderr, "%s\n", btf_log_buf);
4184*4882a593Smuzhiyun err = -1;
4185*4882a593Smuzhiyun goto done;
4186*4882a593Smuzhiyun }
4187*4882a593Smuzhiyun if (CHECK(info.nr_func_info != 3,
4188*4882a593Smuzhiyun "incorrect info.nr_func_info (2nd) %d",
4189*4882a593Smuzhiyun info.nr_func_info)) {
4190*4882a593Smuzhiyun err = -1;
4191*4882a593Smuzhiyun goto done;
4192*4882a593Smuzhiyun }
4193*4882a593Smuzhiyun if (CHECK(info.func_info_rec_size != rec_size,
4194*4882a593Smuzhiyun "incorrect info.func_info_rec_size (2nd) %d",
4195*4882a593Smuzhiyun info.func_info_rec_size)) {
4196*4882a593Smuzhiyun err = -1;
4197*4882a593Smuzhiyun goto done;
4198*4882a593Smuzhiyun }
4199*4882a593Smuzhiyun
4200*4882a593Smuzhiyun err = btf__get_from_id(info.btf_id, &btf);
4201*4882a593Smuzhiyun if (CHECK(err, "cannot get btf from kernel, err: %d", err))
4202*4882a593Smuzhiyun goto done;
4203*4882a593Smuzhiyun
4204*4882a593Smuzhiyun /* check three functions */
4205*4882a593Smuzhiyun finfo = func_info;
4206*4882a593Smuzhiyun for (i = 0; i < 3; i++) {
4207*4882a593Smuzhiyun const struct btf_type *t;
4208*4882a593Smuzhiyun const char *fname;
4209*4882a593Smuzhiyun
4210*4882a593Smuzhiyun t = btf__type_by_id(btf, finfo->type_id);
4211*4882a593Smuzhiyun if (CHECK(!t, "btf__type_by_id failure: id %u",
4212*4882a593Smuzhiyun finfo->type_id)) {
4213*4882a593Smuzhiyun err = -1;
4214*4882a593Smuzhiyun goto done;
4215*4882a593Smuzhiyun }
4216*4882a593Smuzhiyun
4217*4882a593Smuzhiyun fname = btf__name_by_offset(btf, t->name_off);
4218*4882a593Smuzhiyun err = strcmp(fname, expected_fnames[i]);
4219*4882a593Smuzhiyun /* for the second and third functions in .text section,
4220*4882a593Smuzhiyun * the compiler may order them either way.
4221*4882a593Smuzhiyun */
4222*4882a593Smuzhiyun if (i && err)
4223*4882a593Smuzhiyun err = strcmp(fname, expected_fnames[3 - i]);
4224*4882a593Smuzhiyun if (CHECK(err, "incorrect fname %s", fname ? : "")) {
4225*4882a593Smuzhiyun err = -1;
4226*4882a593Smuzhiyun goto done;
4227*4882a593Smuzhiyun }
4228*4882a593Smuzhiyun
4229*4882a593Smuzhiyun finfo = (void *)finfo + rec_size;
4230*4882a593Smuzhiyun }
4231*4882a593Smuzhiyun
4232*4882a593Smuzhiyun skip:
4233*4882a593Smuzhiyun fprintf(stderr, "OK");
4234*4882a593Smuzhiyun
4235*4882a593Smuzhiyun done:
4236*4882a593Smuzhiyun free(func_info);
4237*4882a593Smuzhiyun bpf_object__close(obj);
4238*4882a593Smuzhiyun }
4239*4882a593Smuzhiyun
4240*4882a593Smuzhiyun const char *pprint_enum_str[] = {
4241*4882a593Smuzhiyun "ENUM_ZERO",
4242*4882a593Smuzhiyun "ENUM_ONE",
4243*4882a593Smuzhiyun "ENUM_TWO",
4244*4882a593Smuzhiyun "ENUM_THREE",
4245*4882a593Smuzhiyun };
4246*4882a593Smuzhiyun
4247*4882a593Smuzhiyun struct pprint_mapv {
4248*4882a593Smuzhiyun uint32_t ui32;
4249*4882a593Smuzhiyun uint16_t ui16;
4250*4882a593Smuzhiyun /* 2 bytes hole */
4251*4882a593Smuzhiyun int32_t si32;
4252*4882a593Smuzhiyun uint32_t unused_bits2a:2,
4253*4882a593Smuzhiyun bits28:28,
4254*4882a593Smuzhiyun unused_bits2b:2;
4255*4882a593Smuzhiyun union {
4256*4882a593Smuzhiyun uint64_t ui64;
4257*4882a593Smuzhiyun uint8_t ui8a[8];
4258*4882a593Smuzhiyun };
4259*4882a593Smuzhiyun enum {
4260*4882a593Smuzhiyun ENUM_ZERO,
4261*4882a593Smuzhiyun ENUM_ONE,
4262*4882a593Smuzhiyun ENUM_TWO,
4263*4882a593Smuzhiyun ENUM_THREE,
4264*4882a593Smuzhiyun } aenum;
4265*4882a593Smuzhiyun uint32_t ui32b;
4266*4882a593Smuzhiyun uint32_t bits2c:2;
4267*4882a593Smuzhiyun uint8_t si8_4[2][2];
4268*4882a593Smuzhiyun };
4269*4882a593Smuzhiyun
4270*4882a593Smuzhiyun #ifdef __SIZEOF_INT128__
4271*4882a593Smuzhiyun struct pprint_mapv_int128 {
4272*4882a593Smuzhiyun __int128 si128a;
4273*4882a593Smuzhiyun __int128 si128b;
4274*4882a593Smuzhiyun unsigned __int128 bits3:3;
4275*4882a593Smuzhiyun unsigned __int128 bits80:80;
4276*4882a593Smuzhiyun unsigned __int128 ui128;
4277*4882a593Smuzhiyun };
4278*4882a593Smuzhiyun #endif
4279*4882a593Smuzhiyun
4280*4882a593Smuzhiyun static struct btf_raw_test pprint_test_template[] = {
4281*4882a593Smuzhiyun {
4282*4882a593Smuzhiyun .raw_types = {
4283*4882a593Smuzhiyun /* unsighed char */ /* [1] */
4284*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4285*4882a593Smuzhiyun /* unsigned short */ /* [2] */
4286*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4287*4882a593Smuzhiyun /* unsigned int */ /* [3] */
4288*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4289*4882a593Smuzhiyun /* int */ /* [4] */
4290*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4291*4882a593Smuzhiyun /* unsigned long long */ /* [5] */
4292*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4293*4882a593Smuzhiyun /* 2 bits */ /* [6] */
4294*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 2, 2),
4295*4882a593Smuzhiyun /* 28 bits */ /* [7] */
4296*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 28, 4),
4297*4882a593Smuzhiyun /* uint8_t[8] */ /* [8] */
4298*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(9, 1, 8),
4299*4882a593Smuzhiyun /* typedef unsigned char uint8_t */ /* [9] */
4300*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1),
4301*4882a593Smuzhiyun /* typedef unsigned short uint16_t */ /* [10] */
4302*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2),
4303*4882a593Smuzhiyun /* typedef unsigned int uint32_t */ /* [11] */
4304*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 3),
4305*4882a593Smuzhiyun /* typedef int int32_t */ /* [12] */
4306*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4),
4307*4882a593Smuzhiyun /* typedef unsigned long long uint64_t *//* [13] */
4308*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 5),
4309*4882a593Smuzhiyun /* union (anon) */ /* [14] */
4310*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4311*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4312*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */
4313*4882a593Smuzhiyun /* enum (anon) */ /* [15] */
4314*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4315*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
4316*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
4317*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 2),
4318*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 3),
4319*4882a593Smuzhiyun /* struct pprint_mapv */ /* [16] */
4320*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 11), 40),
4321*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, 0), /* uint32_t ui32 */
4322*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 10, 32), /* uint16_t ui16 */
4323*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 12, 64), /* int32_t si32 */
4324*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, 96), /* unused_bits2a */
4325*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 7, 98), /* bits28 */
4326*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, 126), /* unused_bits2b */
4327*4882a593Smuzhiyun BTF_MEMBER_ENC(0, 14, 128), /* union (anon) */
4328*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 15, 192), /* aenum */
4329*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, 224), /* uint32_t ui32b */
4330*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, 256), /* bits2c */
4331*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */
4332*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */
4333*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */
4334*4882a593Smuzhiyun BTF_END_RAW,
4335*4882a593Smuzhiyun },
4336*4882a593Smuzhiyun BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0si8_4"),
4337*4882a593Smuzhiyun .key_size = sizeof(unsigned int),
4338*4882a593Smuzhiyun .value_size = sizeof(struct pprint_mapv),
4339*4882a593Smuzhiyun .key_type_id = 3, /* unsigned int */
4340*4882a593Smuzhiyun .value_type_id = 16, /* struct pprint_mapv */
4341*4882a593Smuzhiyun .max_entries = 128,
4342*4882a593Smuzhiyun },
4343*4882a593Smuzhiyun
4344*4882a593Smuzhiyun {
4345*4882a593Smuzhiyun /* this type will have the same type as the
4346*4882a593Smuzhiyun * first .raw_types definition, but struct type will
4347*4882a593Smuzhiyun * be encoded with kind_flag set.
4348*4882a593Smuzhiyun */
4349*4882a593Smuzhiyun .raw_types = {
4350*4882a593Smuzhiyun /* unsighed char */ /* [1] */
4351*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4352*4882a593Smuzhiyun /* unsigned short */ /* [2] */
4353*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4354*4882a593Smuzhiyun /* unsigned int */ /* [3] */
4355*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4356*4882a593Smuzhiyun /* int */ /* [4] */
4357*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4358*4882a593Smuzhiyun /* unsigned long long */ /* [5] */
4359*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4360*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */
4361*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */
4362*4882a593Smuzhiyun /* uint8_t[8] */ /* [8] */
4363*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(9, 1, 8),
4364*4882a593Smuzhiyun /* typedef unsigned char uint8_t */ /* [9] */
4365*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1),
4366*4882a593Smuzhiyun /* typedef unsigned short uint16_t */ /* [10] */
4367*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2),
4368*4882a593Smuzhiyun /* typedef unsigned int uint32_t */ /* [11] */
4369*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 3),
4370*4882a593Smuzhiyun /* typedef int int32_t */ /* [12] */
4371*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4),
4372*4882a593Smuzhiyun /* typedef unsigned long long uint64_t *//* [13] */
4373*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 5),
4374*4882a593Smuzhiyun /* union (anon) */ /* [14] */
4375*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4376*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4377*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */
4378*4882a593Smuzhiyun /* enum (anon) */ /* [15] */
4379*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4380*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
4381*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
4382*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 2),
4383*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 3),
4384*4882a593Smuzhiyun /* struct pprint_mapv */ /* [16] */
4385*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
4386*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
4387*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
4388*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
4389*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */
4390*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */
4391*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)), /* unused_bits2b */
4392*4882a593Smuzhiyun BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
4393*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
4394*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
4395*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
4396*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */
4397*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */
4398*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */
4399*4882a593Smuzhiyun BTF_END_RAW,
4400*4882a593Smuzhiyun },
4401*4882a593Smuzhiyun BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0si8_4"),
4402*4882a593Smuzhiyun .key_size = sizeof(unsigned int),
4403*4882a593Smuzhiyun .value_size = sizeof(struct pprint_mapv),
4404*4882a593Smuzhiyun .key_type_id = 3, /* unsigned int */
4405*4882a593Smuzhiyun .value_type_id = 16, /* struct pprint_mapv */
4406*4882a593Smuzhiyun .max_entries = 128,
4407*4882a593Smuzhiyun },
4408*4882a593Smuzhiyun
4409*4882a593Smuzhiyun {
4410*4882a593Smuzhiyun /* this type will have the same layout as the
4411*4882a593Smuzhiyun * first .raw_types definition. The struct type will
4412*4882a593Smuzhiyun * be encoded with kind_flag set, bitfield members
4413*4882a593Smuzhiyun * are added typedef/const/volatile, and bitfield members
4414*4882a593Smuzhiyun * will have both int and enum types.
4415*4882a593Smuzhiyun */
4416*4882a593Smuzhiyun .raw_types = {
4417*4882a593Smuzhiyun /* unsighed char */ /* [1] */
4418*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4419*4882a593Smuzhiyun /* unsigned short */ /* [2] */
4420*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4421*4882a593Smuzhiyun /* unsigned int */ /* [3] */
4422*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4423*4882a593Smuzhiyun /* int */ /* [4] */
4424*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4425*4882a593Smuzhiyun /* unsigned long long */ /* [5] */
4426*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4427*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */
4428*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */
4429*4882a593Smuzhiyun /* uint8_t[8] */ /* [8] */
4430*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(9, 1, 8),
4431*4882a593Smuzhiyun /* typedef unsigned char uint8_t */ /* [9] */
4432*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1),
4433*4882a593Smuzhiyun /* typedef unsigned short uint16_t */ /* [10] */
4434*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2),
4435*4882a593Smuzhiyun /* typedef unsigned int uint32_t */ /* [11] */
4436*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 3),
4437*4882a593Smuzhiyun /* typedef int int32_t */ /* [12] */
4438*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 4),
4439*4882a593Smuzhiyun /* typedef unsigned long long uint64_t *//* [13] */
4440*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 5),
4441*4882a593Smuzhiyun /* union (anon) */ /* [14] */
4442*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4443*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4444*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */
4445*4882a593Smuzhiyun /* enum (anon) */ /* [15] */
4446*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4447*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
4448*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
4449*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 2),
4450*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 3),
4451*4882a593Smuzhiyun /* struct pprint_mapv */ /* [16] */
4452*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
4453*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
4454*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
4455*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
4456*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */
4457*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */
4458*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */
4459*4882a593Smuzhiyun BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
4460*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
4461*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
4462*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
4463*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 20, BTF_MEMBER_OFFSET(0, 264)), /* si8_4 */
4464*4882a593Smuzhiyun /* typedef unsigned int ___int */ /* [17] */
4465*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 18),
4466*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6), /* [18] */
4467*4882a593Smuzhiyun BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15), /* [19] */
4468*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(21, 1, 2), /* [20] */
4469*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [21] */
4470*4882a593Smuzhiyun BTF_END_RAW,
4471*4882a593Smuzhiyun },
4472*4882a593Smuzhiyun BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0___int\0si8_4"),
4473*4882a593Smuzhiyun .key_size = sizeof(unsigned int),
4474*4882a593Smuzhiyun .value_size = sizeof(struct pprint_mapv),
4475*4882a593Smuzhiyun .key_type_id = 3, /* unsigned int */
4476*4882a593Smuzhiyun .value_type_id = 16, /* struct pprint_mapv */
4477*4882a593Smuzhiyun .max_entries = 128,
4478*4882a593Smuzhiyun },
4479*4882a593Smuzhiyun
4480*4882a593Smuzhiyun #ifdef __SIZEOF_INT128__
4481*4882a593Smuzhiyun {
4482*4882a593Smuzhiyun /* test int128 */
4483*4882a593Smuzhiyun .raw_types = {
4484*4882a593Smuzhiyun /* unsigned int */ /* [1] */
4485*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4486*4882a593Smuzhiyun /* __int128 */ /* [2] */
4487*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 128, 16),
4488*4882a593Smuzhiyun /* unsigned __int128 */ /* [3] */
4489*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 128, 16),
4490*4882a593Smuzhiyun /* struct pprint_mapv_int128 */ /* [4] */
4491*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 5), 64),
4492*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), /* si128a */
4493*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 128)), /* si128b */
4494*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(3, 256)), /* bits3 */
4495*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(80, 259)), /* bits80 */
4496*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(0, 384)), /* ui128 */
4497*4882a593Smuzhiyun BTF_END_RAW,
4498*4882a593Smuzhiyun },
4499*4882a593Smuzhiyun BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"),
4500*4882a593Smuzhiyun .key_size = sizeof(unsigned int),
4501*4882a593Smuzhiyun .value_size = sizeof(struct pprint_mapv_int128),
4502*4882a593Smuzhiyun .key_type_id = 1,
4503*4882a593Smuzhiyun .value_type_id = 4,
4504*4882a593Smuzhiyun .max_entries = 128,
4505*4882a593Smuzhiyun .mapv_kind = PPRINT_MAPV_KIND_INT128,
4506*4882a593Smuzhiyun },
4507*4882a593Smuzhiyun #endif
4508*4882a593Smuzhiyun
4509*4882a593Smuzhiyun };
4510*4882a593Smuzhiyun
4511*4882a593Smuzhiyun static struct btf_pprint_test_meta {
4512*4882a593Smuzhiyun const char *descr;
4513*4882a593Smuzhiyun enum bpf_map_type map_type;
4514*4882a593Smuzhiyun const char *map_name;
4515*4882a593Smuzhiyun bool ordered_map;
4516*4882a593Smuzhiyun bool lossless_map;
4517*4882a593Smuzhiyun bool percpu_map;
4518*4882a593Smuzhiyun } pprint_tests_meta[] = {
4519*4882a593Smuzhiyun {
4520*4882a593Smuzhiyun .descr = "BTF pretty print array",
4521*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_ARRAY,
4522*4882a593Smuzhiyun .map_name = "pprint_test_array",
4523*4882a593Smuzhiyun .ordered_map = true,
4524*4882a593Smuzhiyun .lossless_map = true,
4525*4882a593Smuzhiyun .percpu_map = false,
4526*4882a593Smuzhiyun },
4527*4882a593Smuzhiyun
4528*4882a593Smuzhiyun {
4529*4882a593Smuzhiyun .descr = "BTF pretty print hash",
4530*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_HASH,
4531*4882a593Smuzhiyun .map_name = "pprint_test_hash",
4532*4882a593Smuzhiyun .ordered_map = false,
4533*4882a593Smuzhiyun .lossless_map = true,
4534*4882a593Smuzhiyun .percpu_map = false,
4535*4882a593Smuzhiyun },
4536*4882a593Smuzhiyun
4537*4882a593Smuzhiyun {
4538*4882a593Smuzhiyun .descr = "BTF pretty print lru hash",
4539*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_LRU_HASH,
4540*4882a593Smuzhiyun .map_name = "pprint_test_lru_hash",
4541*4882a593Smuzhiyun .ordered_map = false,
4542*4882a593Smuzhiyun .lossless_map = false,
4543*4882a593Smuzhiyun .percpu_map = false,
4544*4882a593Smuzhiyun },
4545*4882a593Smuzhiyun
4546*4882a593Smuzhiyun {
4547*4882a593Smuzhiyun .descr = "BTF pretty print percpu array",
4548*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_PERCPU_ARRAY,
4549*4882a593Smuzhiyun .map_name = "pprint_test_percpu_array",
4550*4882a593Smuzhiyun .ordered_map = true,
4551*4882a593Smuzhiyun .lossless_map = true,
4552*4882a593Smuzhiyun .percpu_map = true,
4553*4882a593Smuzhiyun },
4554*4882a593Smuzhiyun
4555*4882a593Smuzhiyun {
4556*4882a593Smuzhiyun .descr = "BTF pretty print percpu hash",
4557*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_PERCPU_HASH,
4558*4882a593Smuzhiyun .map_name = "pprint_test_percpu_hash",
4559*4882a593Smuzhiyun .ordered_map = false,
4560*4882a593Smuzhiyun .lossless_map = true,
4561*4882a593Smuzhiyun .percpu_map = true,
4562*4882a593Smuzhiyun },
4563*4882a593Smuzhiyun
4564*4882a593Smuzhiyun {
4565*4882a593Smuzhiyun .descr = "BTF pretty print lru percpu hash",
4566*4882a593Smuzhiyun .map_type = BPF_MAP_TYPE_LRU_PERCPU_HASH,
4567*4882a593Smuzhiyun .map_name = "pprint_test_lru_percpu_hash",
4568*4882a593Smuzhiyun .ordered_map = false,
4569*4882a593Smuzhiyun .lossless_map = false,
4570*4882a593Smuzhiyun .percpu_map = true,
4571*4882a593Smuzhiyun },
4572*4882a593Smuzhiyun
4573*4882a593Smuzhiyun };
4574*4882a593Smuzhiyun
get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)4575*4882a593Smuzhiyun static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)
4576*4882a593Smuzhiyun {
4577*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_BASIC)
4578*4882a593Smuzhiyun return sizeof(struct pprint_mapv);
4579*4882a593Smuzhiyun
4580*4882a593Smuzhiyun #ifdef __SIZEOF_INT128__
4581*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_INT128)
4582*4882a593Smuzhiyun return sizeof(struct pprint_mapv_int128);
4583*4882a593Smuzhiyun #endif
4584*4882a593Smuzhiyun
4585*4882a593Smuzhiyun assert(0);
4586*4882a593Smuzhiyun }
4587*4882a593Smuzhiyun
set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,void * mapv,uint32_t i,int num_cpus,int rounded_value_size)4588*4882a593Smuzhiyun static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,
4589*4882a593Smuzhiyun void *mapv, uint32_t i,
4590*4882a593Smuzhiyun int num_cpus, int rounded_value_size)
4591*4882a593Smuzhiyun {
4592*4882a593Smuzhiyun int cpu;
4593*4882a593Smuzhiyun
4594*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
4595*4882a593Smuzhiyun struct pprint_mapv *v = mapv;
4596*4882a593Smuzhiyun
4597*4882a593Smuzhiyun for (cpu = 0; cpu < num_cpus; cpu++) {
4598*4882a593Smuzhiyun v->ui32 = i + cpu;
4599*4882a593Smuzhiyun v->si32 = -i;
4600*4882a593Smuzhiyun v->unused_bits2a = 3;
4601*4882a593Smuzhiyun v->bits28 = i;
4602*4882a593Smuzhiyun v->unused_bits2b = 3;
4603*4882a593Smuzhiyun v->ui64 = i;
4604*4882a593Smuzhiyun v->aenum = i & 0x03;
4605*4882a593Smuzhiyun v->ui32b = 4;
4606*4882a593Smuzhiyun v->bits2c = 1;
4607*4882a593Smuzhiyun v->si8_4[0][0] = (cpu + i) & 0xff;
4608*4882a593Smuzhiyun v->si8_4[0][1] = (cpu + i + 1) & 0xff;
4609*4882a593Smuzhiyun v->si8_4[1][0] = (cpu + i + 2) & 0xff;
4610*4882a593Smuzhiyun v->si8_4[1][1] = (cpu + i + 3) & 0xff;
4611*4882a593Smuzhiyun v = (void *)v + rounded_value_size;
4612*4882a593Smuzhiyun }
4613*4882a593Smuzhiyun }
4614*4882a593Smuzhiyun
4615*4882a593Smuzhiyun #ifdef __SIZEOF_INT128__
4616*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
4617*4882a593Smuzhiyun struct pprint_mapv_int128 *v = mapv;
4618*4882a593Smuzhiyun
4619*4882a593Smuzhiyun for (cpu = 0; cpu < num_cpus; cpu++) {
4620*4882a593Smuzhiyun v->si128a = i;
4621*4882a593Smuzhiyun v->si128b = -i;
4622*4882a593Smuzhiyun v->bits3 = i & 0x07;
4623*4882a593Smuzhiyun v->bits80 = (((unsigned __int128)1) << 64) + i;
4624*4882a593Smuzhiyun v->ui128 = (((unsigned __int128)2) << 64) + i;
4625*4882a593Smuzhiyun v = (void *)v + rounded_value_size;
4626*4882a593Smuzhiyun }
4627*4882a593Smuzhiyun }
4628*4882a593Smuzhiyun #endif
4629*4882a593Smuzhiyun }
4630*4882a593Smuzhiyun
get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,char * expected_line,ssize_t line_size,bool percpu_map,unsigned int next_key,int cpu,void * mapv)4631*4882a593Smuzhiyun ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,
4632*4882a593Smuzhiyun char *expected_line, ssize_t line_size,
4633*4882a593Smuzhiyun bool percpu_map, unsigned int next_key,
4634*4882a593Smuzhiyun int cpu, void *mapv)
4635*4882a593Smuzhiyun {
4636*4882a593Smuzhiyun ssize_t nexpected_line = -1;
4637*4882a593Smuzhiyun
4638*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
4639*4882a593Smuzhiyun struct pprint_mapv *v = mapv;
4640*4882a593Smuzhiyun
4641*4882a593Smuzhiyun nexpected_line = snprintf(expected_line, line_size,
4642*4882a593Smuzhiyun "%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
4643*4882a593Smuzhiyun "{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
4644*4882a593Smuzhiyun "%u,0x%x,[[%d,%d],[%d,%d]]}\n",
4645*4882a593Smuzhiyun percpu_map ? "\tcpu" : "",
4646*4882a593Smuzhiyun percpu_map ? cpu : next_key,
4647*4882a593Smuzhiyun v->ui32, v->si32,
4648*4882a593Smuzhiyun v->unused_bits2a,
4649*4882a593Smuzhiyun v->bits28,
4650*4882a593Smuzhiyun v->unused_bits2b,
4651*4882a593Smuzhiyun (__u64)v->ui64,
4652*4882a593Smuzhiyun v->ui8a[0], v->ui8a[1],
4653*4882a593Smuzhiyun v->ui8a[2], v->ui8a[3],
4654*4882a593Smuzhiyun v->ui8a[4], v->ui8a[5],
4655*4882a593Smuzhiyun v->ui8a[6], v->ui8a[7],
4656*4882a593Smuzhiyun pprint_enum_str[v->aenum],
4657*4882a593Smuzhiyun v->ui32b,
4658*4882a593Smuzhiyun v->bits2c,
4659*4882a593Smuzhiyun v->si8_4[0][0], v->si8_4[0][1],
4660*4882a593Smuzhiyun v->si8_4[1][0], v->si8_4[1][1]);
4661*4882a593Smuzhiyun }
4662*4882a593Smuzhiyun
4663*4882a593Smuzhiyun #ifdef __SIZEOF_INT128__
4664*4882a593Smuzhiyun if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
4665*4882a593Smuzhiyun struct pprint_mapv_int128 *v = mapv;
4666*4882a593Smuzhiyun
4667*4882a593Smuzhiyun nexpected_line = snprintf(expected_line, line_size,
4668*4882a593Smuzhiyun "%s%u: {0x%lx,0x%lx,0x%lx,"
4669*4882a593Smuzhiyun "0x%lx%016lx,0x%lx%016lx}\n",
4670*4882a593Smuzhiyun percpu_map ? "\tcpu" : "",
4671*4882a593Smuzhiyun percpu_map ? cpu : next_key,
4672*4882a593Smuzhiyun (uint64_t)v->si128a,
4673*4882a593Smuzhiyun (uint64_t)v->si128b,
4674*4882a593Smuzhiyun (uint64_t)v->bits3,
4675*4882a593Smuzhiyun (uint64_t)(v->bits80 >> 64),
4676*4882a593Smuzhiyun (uint64_t)v->bits80,
4677*4882a593Smuzhiyun (uint64_t)(v->ui128 >> 64),
4678*4882a593Smuzhiyun (uint64_t)v->ui128);
4679*4882a593Smuzhiyun }
4680*4882a593Smuzhiyun #endif
4681*4882a593Smuzhiyun
4682*4882a593Smuzhiyun return nexpected_line;
4683*4882a593Smuzhiyun }
4684*4882a593Smuzhiyun
check_line(const char * expected_line,int nexpected_line,int expected_line_len,const char * line)4685*4882a593Smuzhiyun static int check_line(const char *expected_line, int nexpected_line,
4686*4882a593Smuzhiyun int expected_line_len, const char *line)
4687*4882a593Smuzhiyun {
4688*4882a593Smuzhiyun if (CHECK(nexpected_line == expected_line_len,
4689*4882a593Smuzhiyun "expected_line is too long"))
4690*4882a593Smuzhiyun return -1;
4691*4882a593Smuzhiyun
4692*4882a593Smuzhiyun if (strcmp(expected_line, line)) {
4693*4882a593Smuzhiyun fprintf(stderr, "unexpected pprint output\n");
4694*4882a593Smuzhiyun fprintf(stderr, "expected: %s", expected_line);
4695*4882a593Smuzhiyun fprintf(stderr, " read: %s", line);
4696*4882a593Smuzhiyun return -1;
4697*4882a593Smuzhiyun }
4698*4882a593Smuzhiyun
4699*4882a593Smuzhiyun return 0;
4700*4882a593Smuzhiyun }
4701*4882a593Smuzhiyun
4702*4882a593Smuzhiyun
do_test_pprint(int test_num)4703*4882a593Smuzhiyun static void do_test_pprint(int test_num)
4704*4882a593Smuzhiyun {
4705*4882a593Smuzhiyun const struct btf_raw_test *test = &pprint_test_template[test_num];
4706*4882a593Smuzhiyun enum pprint_mapv_kind_t mapv_kind = test->mapv_kind;
4707*4882a593Smuzhiyun struct bpf_create_map_attr create_attr = {};
4708*4882a593Smuzhiyun bool ordered_map, lossless_map, percpu_map;
4709*4882a593Smuzhiyun int err, ret, num_cpus, rounded_value_size;
4710*4882a593Smuzhiyun unsigned int key, nr_read_elems;
4711*4882a593Smuzhiyun int map_fd = -1, btf_fd = -1;
4712*4882a593Smuzhiyun unsigned int raw_btf_size;
4713*4882a593Smuzhiyun char expected_line[255];
4714*4882a593Smuzhiyun FILE *pin_file = NULL;
4715*4882a593Smuzhiyun char pin_path[255];
4716*4882a593Smuzhiyun size_t line_len = 0;
4717*4882a593Smuzhiyun char *line = NULL;
4718*4882a593Smuzhiyun void *mapv = NULL;
4719*4882a593Smuzhiyun uint8_t *raw_btf;
4720*4882a593Smuzhiyun ssize_t nread;
4721*4882a593Smuzhiyun
4722*4882a593Smuzhiyun if (!test__start_subtest(test->descr))
4723*4882a593Smuzhiyun return;
4724*4882a593Smuzhiyun
4725*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
4726*4882a593Smuzhiyun test->str_sec, test->str_sec_size,
4727*4882a593Smuzhiyun &raw_btf_size, NULL);
4728*4882a593Smuzhiyun
4729*4882a593Smuzhiyun if (!raw_btf)
4730*4882a593Smuzhiyun return;
4731*4882a593Smuzhiyun
4732*4882a593Smuzhiyun *btf_log_buf = '\0';
4733*4882a593Smuzhiyun btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
4734*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
4735*4882a593Smuzhiyun always_log);
4736*4882a593Smuzhiyun free(raw_btf);
4737*4882a593Smuzhiyun
4738*4882a593Smuzhiyun if (CHECK(btf_fd == -1, "errno:%d", errno)) {
4739*4882a593Smuzhiyun err = -1;
4740*4882a593Smuzhiyun goto done;
4741*4882a593Smuzhiyun }
4742*4882a593Smuzhiyun
4743*4882a593Smuzhiyun create_attr.name = test->map_name;
4744*4882a593Smuzhiyun create_attr.map_type = test->map_type;
4745*4882a593Smuzhiyun create_attr.key_size = test->key_size;
4746*4882a593Smuzhiyun create_attr.value_size = test->value_size;
4747*4882a593Smuzhiyun create_attr.max_entries = test->max_entries;
4748*4882a593Smuzhiyun create_attr.btf_fd = btf_fd;
4749*4882a593Smuzhiyun create_attr.btf_key_type_id = test->key_type_id;
4750*4882a593Smuzhiyun create_attr.btf_value_type_id = test->value_type_id;
4751*4882a593Smuzhiyun
4752*4882a593Smuzhiyun map_fd = bpf_create_map_xattr(&create_attr);
4753*4882a593Smuzhiyun if (CHECK(map_fd == -1, "errno:%d", errno)) {
4754*4882a593Smuzhiyun err = -1;
4755*4882a593Smuzhiyun goto done;
4756*4882a593Smuzhiyun }
4757*4882a593Smuzhiyun
4758*4882a593Smuzhiyun ret = snprintf(pin_path, sizeof(pin_path), "%s/%s",
4759*4882a593Smuzhiyun "/sys/fs/bpf", test->map_name);
4760*4882a593Smuzhiyun
4761*4882a593Smuzhiyun if (CHECK(ret >= sizeof(pin_path), "pin_path %s/%s is too long",
4762*4882a593Smuzhiyun "/sys/fs/bpf", test->map_name)) {
4763*4882a593Smuzhiyun err = -1;
4764*4882a593Smuzhiyun goto done;
4765*4882a593Smuzhiyun }
4766*4882a593Smuzhiyun
4767*4882a593Smuzhiyun err = bpf_obj_pin(map_fd, pin_path);
4768*4882a593Smuzhiyun if (CHECK(err, "bpf_obj_pin(%s): errno:%d.", pin_path, errno))
4769*4882a593Smuzhiyun goto done;
4770*4882a593Smuzhiyun
4771*4882a593Smuzhiyun percpu_map = test->percpu_map;
4772*4882a593Smuzhiyun num_cpus = percpu_map ? bpf_num_possible_cpus() : 1;
4773*4882a593Smuzhiyun rounded_value_size = round_up(get_pprint_mapv_size(mapv_kind), 8);
4774*4882a593Smuzhiyun mapv = calloc(num_cpus, rounded_value_size);
4775*4882a593Smuzhiyun if (CHECK(!mapv, "mapv allocation failure")) {
4776*4882a593Smuzhiyun err = -1;
4777*4882a593Smuzhiyun goto done;
4778*4882a593Smuzhiyun }
4779*4882a593Smuzhiyun
4780*4882a593Smuzhiyun for (key = 0; key < test->max_entries; key++) {
4781*4882a593Smuzhiyun set_pprint_mapv(mapv_kind, mapv, key, num_cpus, rounded_value_size);
4782*4882a593Smuzhiyun bpf_map_update_elem(map_fd, &key, mapv, 0);
4783*4882a593Smuzhiyun }
4784*4882a593Smuzhiyun
4785*4882a593Smuzhiyun pin_file = fopen(pin_path, "r");
4786*4882a593Smuzhiyun if (CHECK(!pin_file, "fopen(%s): errno:%d", pin_path, errno)) {
4787*4882a593Smuzhiyun err = -1;
4788*4882a593Smuzhiyun goto done;
4789*4882a593Smuzhiyun }
4790*4882a593Smuzhiyun
4791*4882a593Smuzhiyun /* Skip lines start with '#' */
4792*4882a593Smuzhiyun while ((nread = getline(&line, &line_len, pin_file)) > 0 &&
4793*4882a593Smuzhiyun *line == '#')
4794*4882a593Smuzhiyun ;
4795*4882a593Smuzhiyun
4796*4882a593Smuzhiyun if (CHECK(nread <= 0, "Unexpected EOF")) {
4797*4882a593Smuzhiyun err = -1;
4798*4882a593Smuzhiyun goto done;
4799*4882a593Smuzhiyun }
4800*4882a593Smuzhiyun
4801*4882a593Smuzhiyun nr_read_elems = 0;
4802*4882a593Smuzhiyun ordered_map = test->ordered_map;
4803*4882a593Smuzhiyun lossless_map = test->lossless_map;
4804*4882a593Smuzhiyun do {
4805*4882a593Smuzhiyun ssize_t nexpected_line;
4806*4882a593Smuzhiyun unsigned int next_key;
4807*4882a593Smuzhiyun void *cmapv;
4808*4882a593Smuzhiyun int cpu;
4809*4882a593Smuzhiyun
4810*4882a593Smuzhiyun next_key = ordered_map ? nr_read_elems : atoi(line);
4811*4882a593Smuzhiyun set_pprint_mapv(mapv_kind, mapv, next_key, num_cpus, rounded_value_size);
4812*4882a593Smuzhiyun cmapv = mapv;
4813*4882a593Smuzhiyun
4814*4882a593Smuzhiyun for (cpu = 0; cpu < num_cpus; cpu++) {
4815*4882a593Smuzhiyun if (percpu_map) {
4816*4882a593Smuzhiyun /* for percpu map, the format looks like:
4817*4882a593Smuzhiyun * <key>: {
4818*4882a593Smuzhiyun * cpu0: <value_on_cpu0>
4819*4882a593Smuzhiyun * cpu1: <value_on_cpu1>
4820*4882a593Smuzhiyun * ...
4821*4882a593Smuzhiyun * cpun: <value_on_cpun>
4822*4882a593Smuzhiyun * }
4823*4882a593Smuzhiyun *
4824*4882a593Smuzhiyun * let us verify the line containing the key here.
4825*4882a593Smuzhiyun */
4826*4882a593Smuzhiyun if (cpu == 0) {
4827*4882a593Smuzhiyun nexpected_line = snprintf(expected_line,
4828*4882a593Smuzhiyun sizeof(expected_line),
4829*4882a593Smuzhiyun "%u: {\n",
4830*4882a593Smuzhiyun next_key);
4831*4882a593Smuzhiyun
4832*4882a593Smuzhiyun err = check_line(expected_line, nexpected_line,
4833*4882a593Smuzhiyun sizeof(expected_line), line);
4834*4882a593Smuzhiyun if (err == -1)
4835*4882a593Smuzhiyun goto done;
4836*4882a593Smuzhiyun }
4837*4882a593Smuzhiyun
4838*4882a593Smuzhiyun /* read value@cpu */
4839*4882a593Smuzhiyun nread = getline(&line, &line_len, pin_file);
4840*4882a593Smuzhiyun if (nread < 0)
4841*4882a593Smuzhiyun break;
4842*4882a593Smuzhiyun }
4843*4882a593Smuzhiyun
4844*4882a593Smuzhiyun nexpected_line = get_pprint_expected_line(mapv_kind, expected_line,
4845*4882a593Smuzhiyun sizeof(expected_line),
4846*4882a593Smuzhiyun percpu_map, next_key,
4847*4882a593Smuzhiyun cpu, cmapv);
4848*4882a593Smuzhiyun err = check_line(expected_line, nexpected_line,
4849*4882a593Smuzhiyun sizeof(expected_line), line);
4850*4882a593Smuzhiyun if (err == -1)
4851*4882a593Smuzhiyun goto done;
4852*4882a593Smuzhiyun
4853*4882a593Smuzhiyun cmapv = cmapv + rounded_value_size;
4854*4882a593Smuzhiyun }
4855*4882a593Smuzhiyun
4856*4882a593Smuzhiyun if (percpu_map) {
4857*4882a593Smuzhiyun /* skip the last bracket for the percpu map */
4858*4882a593Smuzhiyun nread = getline(&line, &line_len, pin_file);
4859*4882a593Smuzhiyun if (nread < 0)
4860*4882a593Smuzhiyun break;
4861*4882a593Smuzhiyun }
4862*4882a593Smuzhiyun
4863*4882a593Smuzhiyun nread = getline(&line, &line_len, pin_file);
4864*4882a593Smuzhiyun } while (++nr_read_elems < test->max_entries && nread > 0);
4865*4882a593Smuzhiyun
4866*4882a593Smuzhiyun if (lossless_map &&
4867*4882a593Smuzhiyun CHECK(nr_read_elems < test->max_entries,
4868*4882a593Smuzhiyun "Unexpected EOF. nr_read_elems:%u test->max_entries:%u",
4869*4882a593Smuzhiyun nr_read_elems, test->max_entries)) {
4870*4882a593Smuzhiyun err = -1;
4871*4882a593Smuzhiyun goto done;
4872*4882a593Smuzhiyun }
4873*4882a593Smuzhiyun
4874*4882a593Smuzhiyun if (CHECK(nread > 0, "Unexpected extra pprint output: %s", line)) {
4875*4882a593Smuzhiyun err = -1;
4876*4882a593Smuzhiyun goto done;
4877*4882a593Smuzhiyun }
4878*4882a593Smuzhiyun
4879*4882a593Smuzhiyun err = 0;
4880*4882a593Smuzhiyun
4881*4882a593Smuzhiyun done:
4882*4882a593Smuzhiyun if (mapv)
4883*4882a593Smuzhiyun free(mapv);
4884*4882a593Smuzhiyun if (!err)
4885*4882a593Smuzhiyun fprintf(stderr, "OK");
4886*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
4887*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
4888*4882a593Smuzhiyun if (btf_fd != -1)
4889*4882a593Smuzhiyun close(btf_fd);
4890*4882a593Smuzhiyun if (map_fd != -1)
4891*4882a593Smuzhiyun close(map_fd);
4892*4882a593Smuzhiyun if (pin_file)
4893*4882a593Smuzhiyun fclose(pin_file);
4894*4882a593Smuzhiyun unlink(pin_path);
4895*4882a593Smuzhiyun free(line);
4896*4882a593Smuzhiyun }
4897*4882a593Smuzhiyun
test_pprint(void)4898*4882a593Smuzhiyun static void test_pprint(void)
4899*4882a593Smuzhiyun {
4900*4882a593Smuzhiyun unsigned int i;
4901*4882a593Smuzhiyun
4902*4882a593Smuzhiyun /* test various maps with the first test template */
4903*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(pprint_tests_meta); i++) {
4904*4882a593Smuzhiyun pprint_test_template[0].descr = pprint_tests_meta[i].descr;
4905*4882a593Smuzhiyun pprint_test_template[0].map_type = pprint_tests_meta[i].map_type;
4906*4882a593Smuzhiyun pprint_test_template[0].map_name = pprint_tests_meta[i].map_name;
4907*4882a593Smuzhiyun pprint_test_template[0].ordered_map = pprint_tests_meta[i].ordered_map;
4908*4882a593Smuzhiyun pprint_test_template[0].lossless_map = pprint_tests_meta[i].lossless_map;
4909*4882a593Smuzhiyun pprint_test_template[0].percpu_map = pprint_tests_meta[i].percpu_map;
4910*4882a593Smuzhiyun
4911*4882a593Smuzhiyun do_test_pprint(0);
4912*4882a593Smuzhiyun }
4913*4882a593Smuzhiyun
4914*4882a593Smuzhiyun /* test rest test templates with the first map */
4915*4882a593Smuzhiyun for (i = 1; i < ARRAY_SIZE(pprint_test_template); i++) {
4916*4882a593Smuzhiyun pprint_test_template[i].descr = pprint_tests_meta[0].descr;
4917*4882a593Smuzhiyun pprint_test_template[i].map_type = pprint_tests_meta[0].map_type;
4918*4882a593Smuzhiyun pprint_test_template[i].map_name = pprint_tests_meta[0].map_name;
4919*4882a593Smuzhiyun pprint_test_template[i].ordered_map = pprint_tests_meta[0].ordered_map;
4920*4882a593Smuzhiyun pprint_test_template[i].lossless_map = pprint_tests_meta[0].lossless_map;
4921*4882a593Smuzhiyun pprint_test_template[i].percpu_map = pprint_tests_meta[0].percpu_map;
4922*4882a593Smuzhiyun do_test_pprint(i);
4923*4882a593Smuzhiyun }
4924*4882a593Smuzhiyun }
4925*4882a593Smuzhiyun
4926*4882a593Smuzhiyun #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \
4927*4882a593Smuzhiyun (insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff))
4928*4882a593Smuzhiyun
4929*4882a593Smuzhiyun static struct prog_info_raw_test {
4930*4882a593Smuzhiyun const char *descr;
4931*4882a593Smuzhiyun const char *str_sec;
4932*4882a593Smuzhiyun const char *err_str;
4933*4882a593Smuzhiyun __u32 raw_types[MAX_NR_RAW_U32];
4934*4882a593Smuzhiyun __u32 str_sec_size;
4935*4882a593Smuzhiyun struct bpf_insn insns[MAX_INSNS];
4936*4882a593Smuzhiyun __u32 prog_type;
4937*4882a593Smuzhiyun __u32 func_info[MAX_SUBPROGS][2];
4938*4882a593Smuzhiyun __u32 func_info_rec_size;
4939*4882a593Smuzhiyun __u32 func_info_cnt;
4940*4882a593Smuzhiyun __u32 line_info[MAX_NR_RAW_U32];
4941*4882a593Smuzhiyun __u32 line_info_rec_size;
4942*4882a593Smuzhiyun __u32 nr_jited_ksyms;
4943*4882a593Smuzhiyun bool expected_prog_load_failure;
4944*4882a593Smuzhiyun __u32 dead_code_cnt;
4945*4882a593Smuzhiyun __u32 dead_code_mask;
4946*4882a593Smuzhiyun __u32 dead_func_cnt;
4947*4882a593Smuzhiyun __u32 dead_func_mask;
4948*4882a593Smuzhiyun } info_raw_tests[] = {
4949*4882a593Smuzhiyun {
4950*4882a593Smuzhiyun .descr = "func_type (main func + one sub)",
4951*4882a593Smuzhiyun .raw_types = {
4952*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
4953*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */
4954*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
4955*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
4956*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
4957*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
4958*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
4959*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
4960*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */
4961*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */
4962*4882a593Smuzhiyun BTF_END_RAW,
4963*4882a593Smuzhiyun },
4964*4882a593Smuzhiyun .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
4965*4882a593Smuzhiyun .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
4966*4882a593Smuzhiyun .insns = {
4967*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
4968*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
4969*4882a593Smuzhiyun BPF_EXIT_INSN(),
4970*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2),
4971*4882a593Smuzhiyun BPF_EXIT_INSN(),
4972*4882a593Smuzhiyun },
4973*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
4974*4882a593Smuzhiyun .func_info = { {0, 5}, {3, 6} },
4975*4882a593Smuzhiyun .func_info_rec_size = 8,
4976*4882a593Smuzhiyun .func_info_cnt = 2,
4977*4882a593Smuzhiyun .line_info = { BTF_END_RAW },
4978*4882a593Smuzhiyun },
4979*4882a593Smuzhiyun
4980*4882a593Smuzhiyun {
4981*4882a593Smuzhiyun .descr = "func_type (Incorrect func_info_rec_size)",
4982*4882a593Smuzhiyun .raw_types = {
4983*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
4984*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */
4985*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
4986*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
4987*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
4988*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
4989*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
4990*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
4991*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */
4992*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */
4993*4882a593Smuzhiyun BTF_END_RAW,
4994*4882a593Smuzhiyun },
4995*4882a593Smuzhiyun .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
4996*4882a593Smuzhiyun .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
4997*4882a593Smuzhiyun .insns = {
4998*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
4999*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5000*4882a593Smuzhiyun BPF_EXIT_INSN(),
5001*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2),
5002*4882a593Smuzhiyun BPF_EXIT_INSN(),
5003*4882a593Smuzhiyun },
5004*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5005*4882a593Smuzhiyun .func_info = { {0, 5}, {3, 6} },
5006*4882a593Smuzhiyun .func_info_rec_size = 4,
5007*4882a593Smuzhiyun .func_info_cnt = 2,
5008*4882a593Smuzhiyun .line_info = { BTF_END_RAW },
5009*4882a593Smuzhiyun .expected_prog_load_failure = true,
5010*4882a593Smuzhiyun },
5011*4882a593Smuzhiyun
5012*4882a593Smuzhiyun {
5013*4882a593Smuzhiyun .descr = "func_type (Incorrect func_info_cnt)",
5014*4882a593Smuzhiyun .raw_types = {
5015*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5016*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */
5017*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5018*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5019*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5020*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5021*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5022*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5023*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */
5024*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */
5025*4882a593Smuzhiyun BTF_END_RAW,
5026*4882a593Smuzhiyun },
5027*4882a593Smuzhiyun .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5028*4882a593Smuzhiyun .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5029*4882a593Smuzhiyun .insns = {
5030*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5031*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5032*4882a593Smuzhiyun BPF_EXIT_INSN(),
5033*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2),
5034*4882a593Smuzhiyun BPF_EXIT_INSN(),
5035*4882a593Smuzhiyun },
5036*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5037*4882a593Smuzhiyun .func_info = { {0, 5}, {3, 6} },
5038*4882a593Smuzhiyun .func_info_rec_size = 8,
5039*4882a593Smuzhiyun .func_info_cnt = 1,
5040*4882a593Smuzhiyun .line_info = { BTF_END_RAW },
5041*4882a593Smuzhiyun .expected_prog_load_failure = true,
5042*4882a593Smuzhiyun },
5043*4882a593Smuzhiyun
5044*4882a593Smuzhiyun {
5045*4882a593Smuzhiyun .descr = "func_type (Incorrect bpf_func_info.insn_off)",
5046*4882a593Smuzhiyun .raw_types = {
5047*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5048*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */
5049*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5050*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5051*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5052*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5053*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5054*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5055*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */
5056*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */
5057*4882a593Smuzhiyun BTF_END_RAW,
5058*4882a593Smuzhiyun },
5059*4882a593Smuzhiyun .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5060*4882a593Smuzhiyun .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5061*4882a593Smuzhiyun .insns = {
5062*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5063*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5064*4882a593Smuzhiyun BPF_EXIT_INSN(),
5065*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2),
5066*4882a593Smuzhiyun BPF_EXIT_INSN(),
5067*4882a593Smuzhiyun },
5068*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5069*4882a593Smuzhiyun .func_info = { {0, 5}, {2, 6} },
5070*4882a593Smuzhiyun .func_info_rec_size = 8,
5071*4882a593Smuzhiyun .func_info_cnt = 2,
5072*4882a593Smuzhiyun .line_info = { BTF_END_RAW },
5073*4882a593Smuzhiyun .expected_prog_load_failure = true,
5074*4882a593Smuzhiyun },
5075*4882a593Smuzhiyun
5076*4882a593Smuzhiyun {
5077*4882a593Smuzhiyun .descr = "line_info (No subprog)",
5078*4882a593Smuzhiyun .raw_types = {
5079*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5080*4882a593Smuzhiyun BTF_END_RAW,
5081*4882a593Smuzhiyun },
5082*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5083*4882a593Smuzhiyun .insns = {
5084*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5085*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5086*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5087*4882a593Smuzhiyun BPF_EXIT_INSN(),
5088*4882a593Smuzhiyun },
5089*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5090*4882a593Smuzhiyun .func_info_cnt = 0,
5091*4882a593Smuzhiyun .line_info = {
5092*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5093*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5094*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5095*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5096*4882a593Smuzhiyun BTF_END_RAW,
5097*4882a593Smuzhiyun },
5098*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5099*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5100*4882a593Smuzhiyun },
5101*4882a593Smuzhiyun
5102*4882a593Smuzhiyun {
5103*4882a593Smuzhiyun .descr = "line_info (No subprog. insn_off >= prog->len)",
5104*4882a593Smuzhiyun .raw_types = {
5105*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5106*4882a593Smuzhiyun BTF_END_RAW,
5107*4882a593Smuzhiyun },
5108*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5109*4882a593Smuzhiyun .insns = {
5110*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5111*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5112*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5113*4882a593Smuzhiyun BPF_EXIT_INSN(),
5114*4882a593Smuzhiyun },
5115*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5116*4882a593Smuzhiyun .func_info_cnt = 0,
5117*4882a593Smuzhiyun .line_info = {
5118*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5119*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5120*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5121*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5122*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, 0, 5, 6),
5123*4882a593Smuzhiyun BTF_END_RAW,
5124*4882a593Smuzhiyun },
5125*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5126*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5127*4882a593Smuzhiyun .err_str = "line_info[4].insn_off",
5128*4882a593Smuzhiyun .expected_prog_load_failure = true,
5129*4882a593Smuzhiyun },
5130*4882a593Smuzhiyun
5131*4882a593Smuzhiyun {
5132*4882a593Smuzhiyun .descr = "line_info (Zero bpf insn code)",
5133*4882a593Smuzhiyun .raw_types = {
5134*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5135*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), /* [2] */
5136*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [3] */
5137*4882a593Smuzhiyun BTF_END_RAW,
5138*4882a593Smuzhiyun },
5139*4882a593Smuzhiyun BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"),
5140*4882a593Smuzhiyun .insns = {
5141*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1),
5142*4882a593Smuzhiyun BPF_EXIT_INSN(),
5143*4882a593Smuzhiyun },
5144*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5145*4882a593Smuzhiyun .func_info_cnt = 0,
5146*4882a593Smuzhiyun .line_info = {
5147*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5148*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, 0, 2, 9),
5149*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5150*4882a593Smuzhiyun BTF_END_RAW,
5151*4882a593Smuzhiyun },
5152*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5153*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5154*4882a593Smuzhiyun .err_str = "Invalid insn code at line_info[1]",
5155*4882a593Smuzhiyun .expected_prog_load_failure = true,
5156*4882a593Smuzhiyun },
5157*4882a593Smuzhiyun
5158*4882a593Smuzhiyun {
5159*4882a593Smuzhiyun .descr = "line_info (No subprog. zero tailing line_info",
5160*4882a593Smuzhiyun .raw_types = {
5161*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5162*4882a593Smuzhiyun BTF_END_RAW,
5163*4882a593Smuzhiyun },
5164*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5165*4882a593Smuzhiyun .insns = {
5166*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5167*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5168*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5169*4882a593Smuzhiyun BPF_EXIT_INSN(),
5170*4882a593Smuzhiyun },
5171*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5172*4882a593Smuzhiyun .func_info_cnt = 0,
5173*4882a593Smuzhiyun .line_info = {
5174*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5175*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5176*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5177*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 0,
5178*4882a593Smuzhiyun BTF_END_RAW,
5179*4882a593Smuzhiyun },
5180*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5181*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5182*4882a593Smuzhiyun },
5183*4882a593Smuzhiyun
5184*4882a593Smuzhiyun {
5185*4882a593Smuzhiyun .descr = "line_info (No subprog. nonzero tailing line_info)",
5186*4882a593Smuzhiyun .raw_types = {
5187*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5188*4882a593Smuzhiyun BTF_END_RAW,
5189*4882a593Smuzhiyun },
5190*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5191*4882a593Smuzhiyun .insns = {
5192*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5193*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5194*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5195*4882a593Smuzhiyun BPF_EXIT_INSN(),
5196*4882a593Smuzhiyun },
5197*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5198*4882a593Smuzhiyun .func_info_cnt = 0,
5199*4882a593Smuzhiyun .line_info = {
5200*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5201*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5202*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5203*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 1,
5204*4882a593Smuzhiyun BTF_END_RAW,
5205*4882a593Smuzhiyun },
5206*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5207*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5208*4882a593Smuzhiyun .err_str = "nonzero tailing record in line_info",
5209*4882a593Smuzhiyun .expected_prog_load_failure = true,
5210*4882a593Smuzhiyun },
5211*4882a593Smuzhiyun
5212*4882a593Smuzhiyun {
5213*4882a593Smuzhiyun .descr = "line_info (subprog)",
5214*4882a593Smuzhiyun .raw_types = {
5215*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5216*4882a593Smuzhiyun BTF_END_RAW,
5217*4882a593Smuzhiyun },
5218*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5219*4882a593Smuzhiyun .insns = {
5220*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5221*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5222*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5223*4882a593Smuzhiyun BPF_CALL_REL(1),
5224*4882a593Smuzhiyun BPF_EXIT_INSN(),
5225*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5226*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5227*4882a593Smuzhiyun BPF_EXIT_INSN(),
5228*4882a593Smuzhiyun },
5229*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5230*4882a593Smuzhiyun .func_info_cnt = 0,
5231*4882a593Smuzhiyun .line_info = {
5232*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5233*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5234*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5235*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5236*4882a593Smuzhiyun BTF_END_RAW,
5237*4882a593Smuzhiyun },
5238*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5239*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5240*4882a593Smuzhiyun },
5241*4882a593Smuzhiyun
5242*4882a593Smuzhiyun {
5243*4882a593Smuzhiyun .descr = "line_info (subprog + func_info)",
5244*4882a593Smuzhiyun .raw_types = {
5245*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5246*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5247*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5248*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5249*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5250*4882a593Smuzhiyun BTF_END_RAW,
5251*4882a593Smuzhiyun },
5252*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5253*4882a593Smuzhiyun .insns = {
5254*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5255*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5256*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5257*4882a593Smuzhiyun BPF_CALL_REL(1),
5258*4882a593Smuzhiyun BPF_EXIT_INSN(),
5259*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5260*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5261*4882a593Smuzhiyun BPF_EXIT_INSN(),
5262*4882a593Smuzhiyun },
5263*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5264*4882a593Smuzhiyun .func_info_cnt = 2,
5265*4882a593Smuzhiyun .func_info_rec_size = 8,
5266*4882a593Smuzhiyun .func_info = { {0, 4}, {5, 3} },
5267*4882a593Smuzhiyun .line_info = {
5268*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5269*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5270*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5271*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5272*4882a593Smuzhiyun BTF_END_RAW,
5273*4882a593Smuzhiyun },
5274*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5275*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5276*4882a593Smuzhiyun },
5277*4882a593Smuzhiyun
5278*4882a593Smuzhiyun {
5279*4882a593Smuzhiyun .descr = "line_info (subprog. missing 1st func line info)",
5280*4882a593Smuzhiyun .raw_types = {
5281*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5282*4882a593Smuzhiyun BTF_END_RAW,
5283*4882a593Smuzhiyun },
5284*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5285*4882a593Smuzhiyun .insns = {
5286*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5287*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5288*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5289*4882a593Smuzhiyun BPF_CALL_REL(1),
5290*4882a593Smuzhiyun BPF_EXIT_INSN(),
5291*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5292*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5293*4882a593Smuzhiyun BPF_EXIT_INSN(),
5294*4882a593Smuzhiyun },
5295*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5296*4882a593Smuzhiyun .func_info_cnt = 0,
5297*4882a593Smuzhiyun .line_info = {
5298*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 1, 10),
5299*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5300*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5301*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5302*4882a593Smuzhiyun BTF_END_RAW,
5303*4882a593Smuzhiyun },
5304*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5305*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5306*4882a593Smuzhiyun .err_str = "missing bpf_line_info for func#0",
5307*4882a593Smuzhiyun .expected_prog_load_failure = true,
5308*4882a593Smuzhiyun },
5309*4882a593Smuzhiyun
5310*4882a593Smuzhiyun {
5311*4882a593Smuzhiyun .descr = "line_info (subprog. missing 2nd func line info)",
5312*4882a593Smuzhiyun .raw_types = {
5313*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5314*4882a593Smuzhiyun BTF_END_RAW,
5315*4882a593Smuzhiyun },
5316*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5317*4882a593Smuzhiyun .insns = {
5318*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5319*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5320*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5321*4882a593Smuzhiyun BPF_CALL_REL(1),
5322*4882a593Smuzhiyun BPF_EXIT_INSN(),
5323*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5324*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5325*4882a593Smuzhiyun BPF_EXIT_INSN(),
5326*4882a593Smuzhiyun },
5327*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5328*4882a593Smuzhiyun .func_info_cnt = 0,
5329*4882a593Smuzhiyun .line_info = {
5330*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5331*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5332*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 3, 8),
5333*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5334*4882a593Smuzhiyun BTF_END_RAW,
5335*4882a593Smuzhiyun },
5336*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5337*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5338*4882a593Smuzhiyun .err_str = "missing bpf_line_info for func#1",
5339*4882a593Smuzhiyun .expected_prog_load_failure = true,
5340*4882a593Smuzhiyun },
5341*4882a593Smuzhiyun
5342*4882a593Smuzhiyun {
5343*4882a593Smuzhiyun .descr = "line_info (subprog. unordered insn offset)",
5344*4882a593Smuzhiyun .raw_types = {
5345*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5346*4882a593Smuzhiyun BTF_END_RAW,
5347*4882a593Smuzhiyun },
5348*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5349*4882a593Smuzhiyun .insns = {
5350*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5351*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5352*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5353*4882a593Smuzhiyun BPF_CALL_REL(1),
5354*4882a593Smuzhiyun BPF_EXIT_INSN(),
5355*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5356*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5357*4882a593Smuzhiyun BPF_EXIT_INSN(),
5358*4882a593Smuzhiyun },
5359*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5360*4882a593Smuzhiyun .func_info_cnt = 0,
5361*4882a593Smuzhiyun .line_info = {
5362*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5363*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 2, 9),
5364*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5365*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5366*4882a593Smuzhiyun BTF_END_RAW,
5367*4882a593Smuzhiyun },
5368*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5369*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5370*4882a593Smuzhiyun .err_str = "Invalid line_info[2].insn_off",
5371*4882a593Smuzhiyun .expected_prog_load_failure = true,
5372*4882a593Smuzhiyun },
5373*4882a593Smuzhiyun
5374*4882a593Smuzhiyun {
5375*4882a593Smuzhiyun .descr = "line_info (dead start)",
5376*4882a593Smuzhiyun .raw_types = {
5377*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5378*4882a593Smuzhiyun BTF_END_RAW,
5379*4882a593Smuzhiyun },
5380*4882a593Smuzhiyun BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5381*4882a593Smuzhiyun .insns = {
5382*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5383*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5384*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5385*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5386*4882a593Smuzhiyun BPF_EXIT_INSN(),
5387*4882a593Smuzhiyun },
5388*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5389*4882a593Smuzhiyun .func_info_cnt = 0,
5390*4882a593Smuzhiyun .line_info = {
5391*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5392*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5393*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5394*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5395*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 6),
5396*4882a593Smuzhiyun BTF_END_RAW,
5397*4882a593Smuzhiyun },
5398*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5399*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5400*4882a593Smuzhiyun .dead_code_cnt = 1,
5401*4882a593Smuzhiyun .dead_code_mask = 0x01,
5402*4882a593Smuzhiyun },
5403*4882a593Smuzhiyun
5404*4882a593Smuzhiyun {
5405*4882a593Smuzhiyun .descr = "line_info (dead end)",
5406*4882a593Smuzhiyun .raw_types = {
5407*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5408*4882a593Smuzhiyun BTF_END_RAW,
5409*4882a593Smuzhiyun },
5410*4882a593Smuzhiyun BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"),
5411*4882a593Smuzhiyun .insns = {
5412*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1),
5413*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 2),
5414*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5415*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
5416*4882a593Smuzhiyun BPF_EXIT_INSN(),
5417*4882a593Smuzhiyun BPF_EXIT_INSN(),
5418*4882a593Smuzhiyun },
5419*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5420*4882a593Smuzhiyun .func_info_cnt = 0,
5421*4882a593Smuzhiyun .line_info = {
5422*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 12),
5423*4882a593Smuzhiyun BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 11),
5424*4882a593Smuzhiyun BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 10),
5425*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 9),
5426*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 8),
5427*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 6, 7),
5428*4882a593Smuzhiyun BTF_END_RAW,
5429*4882a593Smuzhiyun },
5430*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5431*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5432*4882a593Smuzhiyun .dead_code_cnt = 2,
5433*4882a593Smuzhiyun .dead_code_mask = 0x28,
5434*4882a593Smuzhiyun },
5435*4882a593Smuzhiyun
5436*4882a593Smuzhiyun {
5437*4882a593Smuzhiyun .descr = "line_info (dead code + subprog + func_info)",
5438*4882a593Smuzhiyun .raw_types = {
5439*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5440*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5441*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5442*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5443*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5444*4882a593Smuzhiyun BTF_END_RAW,
5445*4882a593Smuzhiyun },
5446*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */"
5447*4882a593Smuzhiyun "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5448*4882a593Smuzhiyun "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5449*4882a593Smuzhiyun "\0return func(a);\0b+=1;\0return b;"),
5450*4882a593Smuzhiyun .insns = {
5451*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5452*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5453*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5454*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 8),
5455*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5456*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5457*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5458*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5459*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5460*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5461*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5462*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5463*4882a593Smuzhiyun BPF_CALL_REL(1),
5464*4882a593Smuzhiyun BPF_EXIT_INSN(),
5465*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5466*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5467*4882a593Smuzhiyun BPF_EXIT_INSN(),
5468*4882a593Smuzhiyun },
5469*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5470*4882a593Smuzhiyun .func_info_cnt = 2,
5471*4882a593Smuzhiyun .func_info_rec_size = 8,
5472*4882a593Smuzhiyun .func_info = { {0, 4}, {14, 3} },
5473*4882a593Smuzhiyun .line_info = {
5474*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5475*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5476*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5477*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5478*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5479*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5480*4882a593Smuzhiyun BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5481*4882a593Smuzhiyun BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5482*4882a593Smuzhiyun BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
5483*4882a593Smuzhiyun BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
5484*4882a593Smuzhiyun BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
5485*4882a593Smuzhiyun BPF_LINE_INFO_ENC(14, 0, NAME_TBD, 3, 8),
5486*4882a593Smuzhiyun BPF_LINE_INFO_ENC(16, 0, NAME_TBD, 4, 7),
5487*4882a593Smuzhiyun BTF_END_RAW,
5488*4882a593Smuzhiyun },
5489*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5490*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5491*4882a593Smuzhiyun .dead_code_cnt = 9,
5492*4882a593Smuzhiyun .dead_code_mask = 0x3fe,
5493*4882a593Smuzhiyun },
5494*4882a593Smuzhiyun
5495*4882a593Smuzhiyun {
5496*4882a593Smuzhiyun .descr = "line_info (dead subprog)",
5497*4882a593Smuzhiyun .raw_types = {
5498*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5499*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5500*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5501*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5502*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5503*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */
5504*4882a593Smuzhiyun BTF_END_RAW,
5505*4882a593Smuzhiyun },
5506*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
5507*4882a593Smuzhiyun "\0return 0;\0return 0;\0/* dead */\0/* dead */"
5508*4882a593Smuzhiyun "\0/* dead */\0return bla + 1;\0return bla + 1;"
5509*4882a593Smuzhiyun "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
5510*4882a593Smuzhiyun .insns = {
5511*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5512*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5513*4882a593Smuzhiyun BPF_CALL_REL(3),
5514*4882a593Smuzhiyun BPF_CALL_REL(5),
5515*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5516*4882a593Smuzhiyun BPF_EXIT_INSN(),
5517*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5518*4882a593Smuzhiyun BPF_CALL_REL(1),
5519*4882a593Smuzhiyun BPF_EXIT_INSN(),
5520*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, 2),
5521*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5522*4882a593Smuzhiyun BPF_EXIT_INSN(),
5523*4882a593Smuzhiyun },
5524*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5525*4882a593Smuzhiyun .func_info_cnt = 3,
5526*4882a593Smuzhiyun .func_info_rec_size = 8,
5527*4882a593Smuzhiyun .func_info = { {0, 4}, {6, 3}, {9, 5} },
5528*4882a593Smuzhiyun .line_info = {
5529*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5530*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5531*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5532*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5533*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5534*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5535*4882a593Smuzhiyun BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5536*4882a593Smuzhiyun BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5537*4882a593Smuzhiyun BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
5538*4882a593Smuzhiyun BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
5539*4882a593Smuzhiyun BTF_END_RAW,
5540*4882a593Smuzhiyun },
5541*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5542*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5543*4882a593Smuzhiyun .dead_code_cnt = 3,
5544*4882a593Smuzhiyun .dead_code_mask = 0x70,
5545*4882a593Smuzhiyun .dead_func_cnt = 1,
5546*4882a593Smuzhiyun .dead_func_mask = 0x2,
5547*4882a593Smuzhiyun },
5548*4882a593Smuzhiyun
5549*4882a593Smuzhiyun {
5550*4882a593Smuzhiyun .descr = "line_info (dead last subprog)",
5551*4882a593Smuzhiyun .raw_types = {
5552*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5553*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5554*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5555*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5556*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */
5557*4882a593Smuzhiyun BTF_END_RAW,
5558*4882a593Smuzhiyun },
5559*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */"
5560*4882a593Smuzhiyun "\0return 0;\0/* dead */\0/* dead */"),
5561*4882a593Smuzhiyun .insns = {
5562*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5563*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5564*4882a593Smuzhiyun BPF_CALL_REL(2),
5565*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5566*4882a593Smuzhiyun BPF_EXIT_INSN(),
5567*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5568*4882a593Smuzhiyun BPF_EXIT_INSN(),
5569*4882a593Smuzhiyun },
5570*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5571*4882a593Smuzhiyun .func_info_cnt = 2,
5572*4882a593Smuzhiyun .func_info_rec_size = 8,
5573*4882a593Smuzhiyun .func_info = { {0, 4}, {5, 3} },
5574*4882a593Smuzhiyun .line_info = {
5575*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5576*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5577*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5578*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5579*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5580*4882a593Smuzhiyun BTF_END_RAW,
5581*4882a593Smuzhiyun },
5582*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5583*4882a593Smuzhiyun .nr_jited_ksyms = 1,
5584*4882a593Smuzhiyun .dead_code_cnt = 2,
5585*4882a593Smuzhiyun .dead_code_mask = 0x18,
5586*4882a593Smuzhiyun .dead_func_cnt = 1,
5587*4882a593Smuzhiyun .dead_func_mask = 0x2,
5588*4882a593Smuzhiyun },
5589*4882a593Smuzhiyun
5590*4882a593Smuzhiyun {
5591*4882a593Smuzhiyun .descr = "line_info (dead subprog + dead start)",
5592*4882a593Smuzhiyun .raw_types = {
5593*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5594*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5595*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5596*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5597*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5598*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */
5599*4882a593Smuzhiyun BTF_END_RAW,
5600*4882a593Smuzhiyun },
5601*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */"
5602*4882a593Smuzhiyun "\0return 0;\0return 0;\0return 0;"
5603*4882a593Smuzhiyun "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5604*4882a593Smuzhiyun "\0return b + 1;\0return b + 1;\0return b + 1;"),
5605*4882a593Smuzhiyun .insns = {
5606*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5607*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5608*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5609*4882a593Smuzhiyun BPF_CALL_REL(3),
5610*4882a593Smuzhiyun BPF_CALL_REL(5),
5611*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5612*4882a593Smuzhiyun BPF_EXIT_INSN(),
5613*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5614*4882a593Smuzhiyun BPF_CALL_REL(1),
5615*4882a593Smuzhiyun BPF_EXIT_INSN(),
5616*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5617*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, 2),
5618*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5619*4882a593Smuzhiyun BPF_EXIT_INSN(),
5620*4882a593Smuzhiyun },
5621*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5622*4882a593Smuzhiyun .func_info_cnt = 3,
5623*4882a593Smuzhiyun .func_info_rec_size = 8,
5624*4882a593Smuzhiyun .func_info = { {0, 4}, {7, 3}, {10, 5} },
5625*4882a593Smuzhiyun .line_info = {
5626*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5627*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5628*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5629*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5630*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5631*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5632*4882a593Smuzhiyun BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5633*4882a593Smuzhiyun BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5634*4882a593Smuzhiyun BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
5635*4882a593Smuzhiyun BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
5636*4882a593Smuzhiyun BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
5637*4882a593Smuzhiyun BPF_LINE_INFO_ENC(13, 0, NAME_TBD, 2, 9),
5638*4882a593Smuzhiyun BTF_END_RAW,
5639*4882a593Smuzhiyun },
5640*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5641*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5642*4882a593Smuzhiyun .dead_code_cnt = 5,
5643*4882a593Smuzhiyun .dead_code_mask = 0x1e2,
5644*4882a593Smuzhiyun .dead_func_cnt = 1,
5645*4882a593Smuzhiyun .dead_func_mask = 0x2,
5646*4882a593Smuzhiyun },
5647*4882a593Smuzhiyun
5648*4882a593Smuzhiyun {
5649*4882a593Smuzhiyun .descr = "line_info (dead subprog + dead start w/ move)",
5650*4882a593Smuzhiyun .raw_types = {
5651*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5652*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5653*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5654*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5655*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5656*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */
5657*4882a593Smuzhiyun BTF_END_RAW,
5658*4882a593Smuzhiyun },
5659*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
5660*4882a593Smuzhiyun "\0return 0;\0return 0;\0/* dead */\0/* dead */"
5661*4882a593Smuzhiyun "\0/* dead */\0return bla + 1;\0return bla + 1;"
5662*4882a593Smuzhiyun "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
5663*4882a593Smuzhiyun .insns = {
5664*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1),
5665*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5666*4882a593Smuzhiyun BPF_CALL_REL(3),
5667*4882a593Smuzhiyun BPF_CALL_REL(5),
5668*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5669*4882a593Smuzhiyun BPF_EXIT_INSN(),
5670*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5671*4882a593Smuzhiyun BPF_CALL_REL(1),
5672*4882a593Smuzhiyun BPF_EXIT_INSN(),
5673*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5674*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, 2),
5675*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5676*4882a593Smuzhiyun BPF_EXIT_INSN(),
5677*4882a593Smuzhiyun },
5678*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5679*4882a593Smuzhiyun .func_info_cnt = 3,
5680*4882a593Smuzhiyun .func_info_rec_size = 8,
5681*4882a593Smuzhiyun .func_info = { {0, 4}, {6, 3}, {9, 5} },
5682*4882a593Smuzhiyun .line_info = {
5683*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5684*4882a593Smuzhiyun BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5685*4882a593Smuzhiyun BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5686*4882a593Smuzhiyun BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5687*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5688*4882a593Smuzhiyun BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5689*4882a593Smuzhiyun BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5690*4882a593Smuzhiyun BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5691*4882a593Smuzhiyun BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 1, 10),
5692*4882a593Smuzhiyun BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
5693*4882a593Smuzhiyun BTF_END_RAW,
5694*4882a593Smuzhiyun },
5695*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5696*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5697*4882a593Smuzhiyun .dead_code_cnt = 3,
5698*4882a593Smuzhiyun .dead_code_mask = 0x70,
5699*4882a593Smuzhiyun .dead_func_cnt = 1,
5700*4882a593Smuzhiyun .dead_func_mask = 0x2,
5701*4882a593Smuzhiyun },
5702*4882a593Smuzhiyun
5703*4882a593Smuzhiyun {
5704*4882a593Smuzhiyun .descr = "line_info (dead end + subprog start w/ no linfo)",
5705*4882a593Smuzhiyun .raw_types = {
5706*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
5707*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5708*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5709*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */
5710*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */
5711*4882a593Smuzhiyun BTF_END_RAW,
5712*4882a593Smuzhiyun },
5713*4882a593Smuzhiyun BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"),
5714*4882a593Smuzhiyun .insns = {
5715*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5716*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 1, 3),
5717*4882a593Smuzhiyun BPF_CALL_REL(3),
5718*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0),
5719*4882a593Smuzhiyun BPF_EXIT_INSN(),
5720*4882a593Smuzhiyun BPF_EXIT_INSN(),
5721*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5722*4882a593Smuzhiyun BPF_EXIT_INSN(),
5723*4882a593Smuzhiyun },
5724*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_TRACEPOINT,
5725*4882a593Smuzhiyun .func_info_cnt = 2,
5726*4882a593Smuzhiyun .func_info_rec_size = 8,
5727*4882a593Smuzhiyun .func_info = { {0, 3}, {6, 4}, },
5728*4882a593Smuzhiyun .line_info = {
5729*4882a593Smuzhiyun BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5730*4882a593Smuzhiyun BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5731*4882a593Smuzhiyun BTF_END_RAW,
5732*4882a593Smuzhiyun },
5733*4882a593Smuzhiyun .line_info_rec_size = sizeof(struct bpf_line_info),
5734*4882a593Smuzhiyun .nr_jited_ksyms = 2,
5735*4882a593Smuzhiyun },
5736*4882a593Smuzhiyun
5737*4882a593Smuzhiyun };
5738*4882a593Smuzhiyun
probe_prog_length(const struct bpf_insn * fp)5739*4882a593Smuzhiyun static size_t probe_prog_length(const struct bpf_insn *fp)
5740*4882a593Smuzhiyun {
5741*4882a593Smuzhiyun size_t len;
5742*4882a593Smuzhiyun
5743*4882a593Smuzhiyun for (len = MAX_INSNS - 1; len > 0; --len)
5744*4882a593Smuzhiyun if (fp[len].code != 0 || fp[len].imm != 0)
5745*4882a593Smuzhiyun break;
5746*4882a593Smuzhiyun return len + 1;
5747*4882a593Smuzhiyun }
5748*4882a593Smuzhiyun
patch_name_tbd(const __u32 * raw_u32,const char * str,__u32 str_off,unsigned int str_sec_size,unsigned int * ret_size)5749*4882a593Smuzhiyun static __u32 *patch_name_tbd(const __u32 *raw_u32,
5750*4882a593Smuzhiyun const char *str, __u32 str_off,
5751*4882a593Smuzhiyun unsigned int str_sec_size,
5752*4882a593Smuzhiyun unsigned int *ret_size)
5753*4882a593Smuzhiyun {
5754*4882a593Smuzhiyun int i, raw_u32_size = get_raw_sec_size(raw_u32);
5755*4882a593Smuzhiyun const char *end_str = str + str_sec_size;
5756*4882a593Smuzhiyun const char *next_str = str + str_off;
5757*4882a593Smuzhiyun __u32 *new_u32 = NULL;
5758*4882a593Smuzhiyun
5759*4882a593Smuzhiyun if (raw_u32_size == -1)
5760*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
5761*4882a593Smuzhiyun
5762*4882a593Smuzhiyun if (!raw_u32_size) {
5763*4882a593Smuzhiyun *ret_size = 0;
5764*4882a593Smuzhiyun return NULL;
5765*4882a593Smuzhiyun }
5766*4882a593Smuzhiyun
5767*4882a593Smuzhiyun new_u32 = malloc(raw_u32_size);
5768*4882a593Smuzhiyun if (!new_u32)
5769*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
5770*4882a593Smuzhiyun
5771*4882a593Smuzhiyun for (i = 0; i < raw_u32_size / sizeof(raw_u32[0]); i++) {
5772*4882a593Smuzhiyun if (raw_u32[i] == NAME_TBD) {
5773*4882a593Smuzhiyun next_str = get_next_str(next_str, end_str);
5774*4882a593Smuzhiyun if (CHECK(!next_str, "Error in getting next_str\n")) {
5775*4882a593Smuzhiyun free(new_u32);
5776*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
5777*4882a593Smuzhiyun }
5778*4882a593Smuzhiyun new_u32[i] = next_str - str;
5779*4882a593Smuzhiyun next_str += strlen(next_str);
5780*4882a593Smuzhiyun } else {
5781*4882a593Smuzhiyun new_u32[i] = raw_u32[i];
5782*4882a593Smuzhiyun }
5783*4882a593Smuzhiyun }
5784*4882a593Smuzhiyun
5785*4882a593Smuzhiyun *ret_size = raw_u32_size;
5786*4882a593Smuzhiyun return new_u32;
5787*4882a593Smuzhiyun }
5788*4882a593Smuzhiyun
test_get_finfo(const struct prog_info_raw_test * test,int prog_fd)5789*4882a593Smuzhiyun static int test_get_finfo(const struct prog_info_raw_test *test,
5790*4882a593Smuzhiyun int prog_fd)
5791*4882a593Smuzhiyun {
5792*4882a593Smuzhiyun struct bpf_prog_info info = {};
5793*4882a593Smuzhiyun struct bpf_func_info *finfo;
5794*4882a593Smuzhiyun __u32 info_len, rec_size, i;
5795*4882a593Smuzhiyun void *func_info = NULL;
5796*4882a593Smuzhiyun __u32 nr_func_info;
5797*4882a593Smuzhiyun int err;
5798*4882a593Smuzhiyun
5799*4882a593Smuzhiyun /* get necessary lens */
5800*4882a593Smuzhiyun info_len = sizeof(struct bpf_prog_info);
5801*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
5802*4882a593Smuzhiyun if (CHECK(err == -1, "invalid get info (1st) errno:%d", errno)) {
5803*4882a593Smuzhiyun fprintf(stderr, "%s\n", btf_log_buf);
5804*4882a593Smuzhiyun return -1;
5805*4882a593Smuzhiyun }
5806*4882a593Smuzhiyun nr_func_info = test->func_info_cnt - test->dead_func_cnt;
5807*4882a593Smuzhiyun if (CHECK(info.nr_func_info != nr_func_info,
5808*4882a593Smuzhiyun "incorrect info.nr_func_info (1st) %d",
5809*4882a593Smuzhiyun info.nr_func_info)) {
5810*4882a593Smuzhiyun return -1;
5811*4882a593Smuzhiyun }
5812*4882a593Smuzhiyun
5813*4882a593Smuzhiyun rec_size = info.func_info_rec_size;
5814*4882a593Smuzhiyun if (CHECK(rec_size != sizeof(struct bpf_func_info),
5815*4882a593Smuzhiyun "incorrect info.func_info_rec_size (1st) %d", rec_size)) {
5816*4882a593Smuzhiyun return -1;
5817*4882a593Smuzhiyun }
5818*4882a593Smuzhiyun
5819*4882a593Smuzhiyun if (!info.nr_func_info)
5820*4882a593Smuzhiyun return 0;
5821*4882a593Smuzhiyun
5822*4882a593Smuzhiyun func_info = malloc(info.nr_func_info * rec_size);
5823*4882a593Smuzhiyun if (CHECK(!func_info, "out of memory"))
5824*4882a593Smuzhiyun return -1;
5825*4882a593Smuzhiyun
5826*4882a593Smuzhiyun /* reset info to only retrieve func_info related data */
5827*4882a593Smuzhiyun memset(&info, 0, sizeof(info));
5828*4882a593Smuzhiyun info.nr_func_info = nr_func_info;
5829*4882a593Smuzhiyun info.func_info_rec_size = rec_size;
5830*4882a593Smuzhiyun info.func_info = ptr_to_u64(func_info);
5831*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
5832*4882a593Smuzhiyun if (CHECK(err == -1, "invalid get info (2nd) errno:%d", errno)) {
5833*4882a593Smuzhiyun fprintf(stderr, "%s\n", btf_log_buf);
5834*4882a593Smuzhiyun err = -1;
5835*4882a593Smuzhiyun goto done;
5836*4882a593Smuzhiyun }
5837*4882a593Smuzhiyun if (CHECK(info.nr_func_info != nr_func_info,
5838*4882a593Smuzhiyun "incorrect info.nr_func_info (2nd) %d",
5839*4882a593Smuzhiyun info.nr_func_info)) {
5840*4882a593Smuzhiyun err = -1;
5841*4882a593Smuzhiyun goto done;
5842*4882a593Smuzhiyun }
5843*4882a593Smuzhiyun if (CHECK(info.func_info_rec_size != rec_size,
5844*4882a593Smuzhiyun "incorrect info.func_info_rec_size (2nd) %d",
5845*4882a593Smuzhiyun info.func_info_rec_size)) {
5846*4882a593Smuzhiyun err = -1;
5847*4882a593Smuzhiyun goto done;
5848*4882a593Smuzhiyun }
5849*4882a593Smuzhiyun
5850*4882a593Smuzhiyun finfo = func_info;
5851*4882a593Smuzhiyun for (i = 0; i < nr_func_info; i++) {
5852*4882a593Smuzhiyun if (test->dead_func_mask & (1 << i))
5853*4882a593Smuzhiyun continue;
5854*4882a593Smuzhiyun if (CHECK(finfo->type_id != test->func_info[i][1],
5855*4882a593Smuzhiyun "incorrect func_type %u expected %u",
5856*4882a593Smuzhiyun finfo->type_id, test->func_info[i][1])) {
5857*4882a593Smuzhiyun err = -1;
5858*4882a593Smuzhiyun goto done;
5859*4882a593Smuzhiyun }
5860*4882a593Smuzhiyun finfo = (void *)finfo + rec_size;
5861*4882a593Smuzhiyun }
5862*4882a593Smuzhiyun
5863*4882a593Smuzhiyun err = 0;
5864*4882a593Smuzhiyun
5865*4882a593Smuzhiyun done:
5866*4882a593Smuzhiyun free(func_info);
5867*4882a593Smuzhiyun return err;
5868*4882a593Smuzhiyun }
5869*4882a593Smuzhiyun
test_get_linfo(const struct prog_info_raw_test * test,const void * patched_linfo,__u32 cnt,int prog_fd)5870*4882a593Smuzhiyun static int test_get_linfo(const struct prog_info_raw_test *test,
5871*4882a593Smuzhiyun const void *patched_linfo,
5872*4882a593Smuzhiyun __u32 cnt, int prog_fd)
5873*4882a593Smuzhiyun {
5874*4882a593Smuzhiyun __u32 i, info_len, nr_jited_ksyms, nr_jited_func_lens;
5875*4882a593Smuzhiyun __u64 *jited_linfo = NULL, *jited_ksyms = NULL;
5876*4882a593Smuzhiyun __u32 rec_size, jited_rec_size, jited_cnt;
5877*4882a593Smuzhiyun struct bpf_line_info *linfo = NULL;
5878*4882a593Smuzhiyun __u32 cur_func_len, ksyms_found;
5879*4882a593Smuzhiyun struct bpf_prog_info info = {};
5880*4882a593Smuzhiyun __u32 *jited_func_lens = NULL;
5881*4882a593Smuzhiyun __u64 cur_func_ksyms;
5882*4882a593Smuzhiyun __u32 dead_insns;
5883*4882a593Smuzhiyun int err;
5884*4882a593Smuzhiyun
5885*4882a593Smuzhiyun jited_cnt = cnt;
5886*4882a593Smuzhiyun rec_size = sizeof(*linfo);
5887*4882a593Smuzhiyun jited_rec_size = sizeof(*jited_linfo);
5888*4882a593Smuzhiyun if (test->nr_jited_ksyms)
5889*4882a593Smuzhiyun nr_jited_ksyms = test->nr_jited_ksyms;
5890*4882a593Smuzhiyun else
5891*4882a593Smuzhiyun nr_jited_ksyms = test->func_info_cnt - test->dead_func_cnt;
5892*4882a593Smuzhiyun nr_jited_func_lens = nr_jited_ksyms;
5893*4882a593Smuzhiyun
5894*4882a593Smuzhiyun info_len = sizeof(struct bpf_prog_info);
5895*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
5896*4882a593Smuzhiyun if (CHECK(err == -1, "err:%d errno:%d", err, errno)) {
5897*4882a593Smuzhiyun err = -1;
5898*4882a593Smuzhiyun goto done;
5899*4882a593Smuzhiyun }
5900*4882a593Smuzhiyun
5901*4882a593Smuzhiyun if (!info.jited_prog_len) {
5902*4882a593Smuzhiyun /* prog is not jited */
5903*4882a593Smuzhiyun jited_cnt = 0;
5904*4882a593Smuzhiyun nr_jited_ksyms = 1;
5905*4882a593Smuzhiyun nr_jited_func_lens = 1;
5906*4882a593Smuzhiyun }
5907*4882a593Smuzhiyun
5908*4882a593Smuzhiyun if (CHECK(info.nr_line_info != cnt ||
5909*4882a593Smuzhiyun info.nr_jited_line_info != jited_cnt ||
5910*4882a593Smuzhiyun info.nr_jited_ksyms != nr_jited_ksyms ||
5911*4882a593Smuzhiyun info.nr_jited_func_lens != nr_jited_func_lens ||
5912*4882a593Smuzhiyun (!info.nr_line_info && info.nr_jited_line_info),
5913*4882a593Smuzhiyun "info: nr_line_info:%u(expected:%u) nr_jited_line_info:%u(expected:%u) nr_jited_ksyms:%u(expected:%u) nr_jited_func_lens:%u(expected:%u)",
5914*4882a593Smuzhiyun info.nr_line_info, cnt,
5915*4882a593Smuzhiyun info.nr_jited_line_info, jited_cnt,
5916*4882a593Smuzhiyun info.nr_jited_ksyms, nr_jited_ksyms,
5917*4882a593Smuzhiyun info.nr_jited_func_lens, nr_jited_func_lens)) {
5918*4882a593Smuzhiyun err = -1;
5919*4882a593Smuzhiyun goto done;
5920*4882a593Smuzhiyun }
5921*4882a593Smuzhiyun
5922*4882a593Smuzhiyun if (CHECK(info.line_info_rec_size != sizeof(struct bpf_line_info) ||
5923*4882a593Smuzhiyun info.jited_line_info_rec_size != sizeof(__u64),
5924*4882a593Smuzhiyun "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)",
5925*4882a593Smuzhiyun info.line_info_rec_size, rec_size,
5926*4882a593Smuzhiyun info.jited_line_info_rec_size, jited_rec_size)) {
5927*4882a593Smuzhiyun err = -1;
5928*4882a593Smuzhiyun goto done;
5929*4882a593Smuzhiyun }
5930*4882a593Smuzhiyun
5931*4882a593Smuzhiyun if (!cnt)
5932*4882a593Smuzhiyun return 0;
5933*4882a593Smuzhiyun
5934*4882a593Smuzhiyun rec_size = info.line_info_rec_size;
5935*4882a593Smuzhiyun jited_rec_size = info.jited_line_info_rec_size;
5936*4882a593Smuzhiyun
5937*4882a593Smuzhiyun memset(&info, 0, sizeof(info));
5938*4882a593Smuzhiyun
5939*4882a593Smuzhiyun linfo = calloc(cnt, rec_size);
5940*4882a593Smuzhiyun if (CHECK(!linfo, "!linfo")) {
5941*4882a593Smuzhiyun err = -1;
5942*4882a593Smuzhiyun goto done;
5943*4882a593Smuzhiyun }
5944*4882a593Smuzhiyun info.nr_line_info = cnt;
5945*4882a593Smuzhiyun info.line_info_rec_size = rec_size;
5946*4882a593Smuzhiyun info.line_info = ptr_to_u64(linfo);
5947*4882a593Smuzhiyun
5948*4882a593Smuzhiyun if (jited_cnt) {
5949*4882a593Smuzhiyun jited_linfo = calloc(jited_cnt, jited_rec_size);
5950*4882a593Smuzhiyun jited_ksyms = calloc(nr_jited_ksyms, sizeof(*jited_ksyms));
5951*4882a593Smuzhiyun jited_func_lens = calloc(nr_jited_func_lens,
5952*4882a593Smuzhiyun sizeof(*jited_func_lens));
5953*4882a593Smuzhiyun if (CHECK(!jited_linfo || !jited_ksyms || !jited_func_lens,
5954*4882a593Smuzhiyun "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p",
5955*4882a593Smuzhiyun jited_linfo, jited_ksyms, jited_func_lens)) {
5956*4882a593Smuzhiyun err = -1;
5957*4882a593Smuzhiyun goto done;
5958*4882a593Smuzhiyun }
5959*4882a593Smuzhiyun
5960*4882a593Smuzhiyun info.nr_jited_line_info = jited_cnt;
5961*4882a593Smuzhiyun info.jited_line_info_rec_size = jited_rec_size;
5962*4882a593Smuzhiyun info.jited_line_info = ptr_to_u64(jited_linfo);
5963*4882a593Smuzhiyun info.nr_jited_ksyms = nr_jited_ksyms;
5964*4882a593Smuzhiyun info.jited_ksyms = ptr_to_u64(jited_ksyms);
5965*4882a593Smuzhiyun info.nr_jited_func_lens = nr_jited_func_lens;
5966*4882a593Smuzhiyun info.jited_func_lens = ptr_to_u64(jited_func_lens);
5967*4882a593Smuzhiyun }
5968*4882a593Smuzhiyun
5969*4882a593Smuzhiyun err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
5970*4882a593Smuzhiyun
5971*4882a593Smuzhiyun /*
5972*4882a593Smuzhiyun * Only recheck the info.*line_info* fields.
5973*4882a593Smuzhiyun * Other fields are not the concern of this test.
5974*4882a593Smuzhiyun */
5975*4882a593Smuzhiyun if (CHECK(err == -1 ||
5976*4882a593Smuzhiyun info.nr_line_info != cnt ||
5977*4882a593Smuzhiyun (jited_cnt && !info.jited_line_info) ||
5978*4882a593Smuzhiyun info.nr_jited_line_info != jited_cnt ||
5979*4882a593Smuzhiyun info.line_info_rec_size != rec_size ||
5980*4882a593Smuzhiyun info.jited_line_info_rec_size != jited_rec_size,
5981*4882a593Smuzhiyun "err:%d errno:%d info: nr_line_info:%u(expected:%u) nr_jited_line_info:%u(expected:%u) line_info_rec_size:%u(expected:%u) jited_linfo_rec_size:%u(expected:%u) line_info:%p jited_line_info:%p",
5982*4882a593Smuzhiyun err, errno,
5983*4882a593Smuzhiyun info.nr_line_info, cnt,
5984*4882a593Smuzhiyun info.nr_jited_line_info, jited_cnt,
5985*4882a593Smuzhiyun info.line_info_rec_size, rec_size,
5986*4882a593Smuzhiyun info.jited_line_info_rec_size, jited_rec_size,
5987*4882a593Smuzhiyun (void *)(long)info.line_info,
5988*4882a593Smuzhiyun (void *)(long)info.jited_line_info)) {
5989*4882a593Smuzhiyun err = -1;
5990*4882a593Smuzhiyun goto done;
5991*4882a593Smuzhiyun }
5992*4882a593Smuzhiyun
5993*4882a593Smuzhiyun dead_insns = 0;
5994*4882a593Smuzhiyun while (test->dead_code_mask & (1 << dead_insns))
5995*4882a593Smuzhiyun dead_insns++;
5996*4882a593Smuzhiyun
5997*4882a593Smuzhiyun CHECK(linfo[0].insn_off, "linfo[0].insn_off:%u",
5998*4882a593Smuzhiyun linfo[0].insn_off);
5999*4882a593Smuzhiyun for (i = 1; i < cnt; i++) {
6000*4882a593Smuzhiyun const struct bpf_line_info *expected_linfo;
6001*4882a593Smuzhiyun
6002*4882a593Smuzhiyun while (test->dead_code_mask & (1 << (i + dead_insns)))
6003*4882a593Smuzhiyun dead_insns++;
6004*4882a593Smuzhiyun
6005*4882a593Smuzhiyun expected_linfo = patched_linfo +
6006*4882a593Smuzhiyun ((i + dead_insns) * test->line_info_rec_size);
6007*4882a593Smuzhiyun if (CHECK(linfo[i].insn_off <= linfo[i - 1].insn_off,
6008*4882a593Smuzhiyun "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u",
6009*4882a593Smuzhiyun i, linfo[i].insn_off,
6010*4882a593Smuzhiyun i - 1, linfo[i - 1].insn_off)) {
6011*4882a593Smuzhiyun err = -1;
6012*4882a593Smuzhiyun goto done;
6013*4882a593Smuzhiyun }
6014*4882a593Smuzhiyun if (CHECK(linfo[i].file_name_off != expected_linfo->file_name_off ||
6015*4882a593Smuzhiyun linfo[i].line_off != expected_linfo->line_off ||
6016*4882a593Smuzhiyun linfo[i].line_col != expected_linfo->line_col,
6017*4882a593Smuzhiyun "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i,
6018*4882a593Smuzhiyun linfo[i].file_name_off,
6019*4882a593Smuzhiyun linfo[i].line_off,
6020*4882a593Smuzhiyun linfo[i].line_col,
6021*4882a593Smuzhiyun expected_linfo->file_name_off,
6022*4882a593Smuzhiyun expected_linfo->line_off,
6023*4882a593Smuzhiyun expected_linfo->line_col)) {
6024*4882a593Smuzhiyun err = -1;
6025*4882a593Smuzhiyun goto done;
6026*4882a593Smuzhiyun }
6027*4882a593Smuzhiyun }
6028*4882a593Smuzhiyun
6029*4882a593Smuzhiyun if (!jited_cnt) {
6030*4882a593Smuzhiyun fprintf(stderr, "not jited. skipping jited_line_info check. ");
6031*4882a593Smuzhiyun err = 0;
6032*4882a593Smuzhiyun goto done;
6033*4882a593Smuzhiyun }
6034*4882a593Smuzhiyun
6035*4882a593Smuzhiyun if (CHECK(jited_linfo[0] != jited_ksyms[0],
6036*4882a593Smuzhiyun "jited_linfo[0]:%lx != jited_ksyms[0]:%lx",
6037*4882a593Smuzhiyun (long)(jited_linfo[0]), (long)(jited_ksyms[0]))) {
6038*4882a593Smuzhiyun err = -1;
6039*4882a593Smuzhiyun goto done;
6040*4882a593Smuzhiyun }
6041*4882a593Smuzhiyun
6042*4882a593Smuzhiyun ksyms_found = 1;
6043*4882a593Smuzhiyun cur_func_len = jited_func_lens[0];
6044*4882a593Smuzhiyun cur_func_ksyms = jited_ksyms[0];
6045*4882a593Smuzhiyun for (i = 1; i < jited_cnt; i++) {
6046*4882a593Smuzhiyun if (ksyms_found < nr_jited_ksyms &&
6047*4882a593Smuzhiyun jited_linfo[i] == jited_ksyms[ksyms_found]) {
6048*4882a593Smuzhiyun cur_func_ksyms = jited_ksyms[ksyms_found];
6049*4882a593Smuzhiyun cur_func_len = jited_ksyms[ksyms_found];
6050*4882a593Smuzhiyun ksyms_found++;
6051*4882a593Smuzhiyun continue;
6052*4882a593Smuzhiyun }
6053*4882a593Smuzhiyun
6054*4882a593Smuzhiyun if (CHECK(jited_linfo[i] <= jited_linfo[i - 1],
6055*4882a593Smuzhiyun "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx",
6056*4882a593Smuzhiyun i, (long)jited_linfo[i],
6057*4882a593Smuzhiyun i - 1, (long)(jited_linfo[i - 1]))) {
6058*4882a593Smuzhiyun err = -1;
6059*4882a593Smuzhiyun goto done;
6060*4882a593Smuzhiyun }
6061*4882a593Smuzhiyun
6062*4882a593Smuzhiyun if (CHECK(jited_linfo[i] - cur_func_ksyms > cur_func_len,
6063*4882a593Smuzhiyun "jited_linfo[%u]:%lx - %lx > %u",
6064*4882a593Smuzhiyun i, (long)jited_linfo[i], (long)cur_func_ksyms,
6065*4882a593Smuzhiyun cur_func_len)) {
6066*4882a593Smuzhiyun err = -1;
6067*4882a593Smuzhiyun goto done;
6068*4882a593Smuzhiyun }
6069*4882a593Smuzhiyun }
6070*4882a593Smuzhiyun
6071*4882a593Smuzhiyun if (CHECK(ksyms_found != nr_jited_ksyms,
6072*4882a593Smuzhiyun "ksyms_found:%u != nr_jited_ksyms:%u",
6073*4882a593Smuzhiyun ksyms_found, nr_jited_ksyms)) {
6074*4882a593Smuzhiyun err = -1;
6075*4882a593Smuzhiyun goto done;
6076*4882a593Smuzhiyun }
6077*4882a593Smuzhiyun
6078*4882a593Smuzhiyun err = 0;
6079*4882a593Smuzhiyun
6080*4882a593Smuzhiyun done:
6081*4882a593Smuzhiyun free(linfo);
6082*4882a593Smuzhiyun free(jited_linfo);
6083*4882a593Smuzhiyun free(jited_ksyms);
6084*4882a593Smuzhiyun free(jited_func_lens);
6085*4882a593Smuzhiyun return err;
6086*4882a593Smuzhiyun }
6087*4882a593Smuzhiyun
do_test_info_raw(unsigned int test_num)6088*4882a593Smuzhiyun static void do_test_info_raw(unsigned int test_num)
6089*4882a593Smuzhiyun {
6090*4882a593Smuzhiyun const struct prog_info_raw_test *test = &info_raw_tests[test_num - 1];
6091*4882a593Smuzhiyun unsigned int raw_btf_size, linfo_str_off, linfo_size;
6092*4882a593Smuzhiyun int btf_fd = -1, prog_fd = -1, err = 0;
6093*4882a593Smuzhiyun void *raw_btf, *patched_linfo = NULL;
6094*4882a593Smuzhiyun const char *ret_next_str;
6095*4882a593Smuzhiyun union bpf_attr attr = {};
6096*4882a593Smuzhiyun
6097*4882a593Smuzhiyun if (!test__start_subtest(test->descr))
6098*4882a593Smuzhiyun return;
6099*4882a593Smuzhiyun
6100*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
6101*4882a593Smuzhiyun test->str_sec, test->str_sec_size,
6102*4882a593Smuzhiyun &raw_btf_size, &ret_next_str);
6103*4882a593Smuzhiyun if (!raw_btf)
6104*4882a593Smuzhiyun return;
6105*4882a593Smuzhiyun
6106*4882a593Smuzhiyun *btf_log_buf = '\0';
6107*4882a593Smuzhiyun btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
6108*4882a593Smuzhiyun btf_log_buf, BTF_LOG_BUF_SIZE,
6109*4882a593Smuzhiyun always_log);
6110*4882a593Smuzhiyun free(raw_btf);
6111*4882a593Smuzhiyun
6112*4882a593Smuzhiyun if (CHECK(btf_fd == -1, "invalid btf_fd errno:%d", errno)) {
6113*4882a593Smuzhiyun err = -1;
6114*4882a593Smuzhiyun goto done;
6115*4882a593Smuzhiyun }
6116*4882a593Smuzhiyun
6117*4882a593Smuzhiyun if (*btf_log_buf && always_log)
6118*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
6119*4882a593Smuzhiyun *btf_log_buf = '\0';
6120*4882a593Smuzhiyun
6121*4882a593Smuzhiyun linfo_str_off = ret_next_str - test->str_sec;
6122*4882a593Smuzhiyun patched_linfo = patch_name_tbd(test->line_info,
6123*4882a593Smuzhiyun test->str_sec, linfo_str_off,
6124*4882a593Smuzhiyun test->str_sec_size, &linfo_size);
6125*4882a593Smuzhiyun if (IS_ERR(patched_linfo)) {
6126*4882a593Smuzhiyun fprintf(stderr, "error in creating raw bpf_line_info");
6127*4882a593Smuzhiyun err = -1;
6128*4882a593Smuzhiyun goto done;
6129*4882a593Smuzhiyun }
6130*4882a593Smuzhiyun
6131*4882a593Smuzhiyun attr.prog_type = test->prog_type;
6132*4882a593Smuzhiyun attr.insns = ptr_to_u64(test->insns);
6133*4882a593Smuzhiyun attr.insn_cnt = probe_prog_length(test->insns);
6134*4882a593Smuzhiyun attr.license = ptr_to_u64("GPL");
6135*4882a593Smuzhiyun attr.prog_btf_fd = btf_fd;
6136*4882a593Smuzhiyun attr.func_info_rec_size = test->func_info_rec_size;
6137*4882a593Smuzhiyun attr.func_info_cnt = test->func_info_cnt;
6138*4882a593Smuzhiyun attr.func_info = ptr_to_u64(test->func_info);
6139*4882a593Smuzhiyun attr.log_buf = ptr_to_u64(btf_log_buf);
6140*4882a593Smuzhiyun attr.log_size = BTF_LOG_BUF_SIZE;
6141*4882a593Smuzhiyun attr.log_level = 1;
6142*4882a593Smuzhiyun if (linfo_size) {
6143*4882a593Smuzhiyun attr.line_info_rec_size = test->line_info_rec_size;
6144*4882a593Smuzhiyun attr.line_info = ptr_to_u64(patched_linfo);
6145*4882a593Smuzhiyun attr.line_info_cnt = linfo_size / attr.line_info_rec_size;
6146*4882a593Smuzhiyun }
6147*4882a593Smuzhiyun
6148*4882a593Smuzhiyun prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
6149*4882a593Smuzhiyun err = ((prog_fd == -1) != test->expected_prog_load_failure);
6150*4882a593Smuzhiyun if (CHECK(err, "prog_fd:%d expected_prog_load_failure:%u errno:%d",
6151*4882a593Smuzhiyun prog_fd, test->expected_prog_load_failure, errno) ||
6152*4882a593Smuzhiyun CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
6153*4882a593Smuzhiyun "expected err_str:%s", test->err_str)) {
6154*4882a593Smuzhiyun err = -1;
6155*4882a593Smuzhiyun goto done;
6156*4882a593Smuzhiyun }
6157*4882a593Smuzhiyun
6158*4882a593Smuzhiyun if (prog_fd == -1)
6159*4882a593Smuzhiyun goto done;
6160*4882a593Smuzhiyun
6161*4882a593Smuzhiyun err = test_get_finfo(test, prog_fd);
6162*4882a593Smuzhiyun if (err)
6163*4882a593Smuzhiyun goto done;
6164*4882a593Smuzhiyun
6165*4882a593Smuzhiyun err = test_get_linfo(test, patched_linfo,
6166*4882a593Smuzhiyun attr.line_info_cnt - test->dead_code_cnt,
6167*4882a593Smuzhiyun prog_fd);
6168*4882a593Smuzhiyun if (err)
6169*4882a593Smuzhiyun goto done;
6170*4882a593Smuzhiyun
6171*4882a593Smuzhiyun done:
6172*4882a593Smuzhiyun if (*btf_log_buf && (err || always_log))
6173*4882a593Smuzhiyun fprintf(stderr, "\n%s", btf_log_buf);
6174*4882a593Smuzhiyun
6175*4882a593Smuzhiyun if (btf_fd != -1)
6176*4882a593Smuzhiyun close(btf_fd);
6177*4882a593Smuzhiyun if (prog_fd != -1)
6178*4882a593Smuzhiyun close(prog_fd);
6179*4882a593Smuzhiyun
6180*4882a593Smuzhiyun if (!IS_ERR(patched_linfo))
6181*4882a593Smuzhiyun free(patched_linfo);
6182*4882a593Smuzhiyun }
6183*4882a593Smuzhiyun
6184*4882a593Smuzhiyun struct btf_raw_data {
6185*4882a593Smuzhiyun __u32 raw_types[MAX_NR_RAW_U32];
6186*4882a593Smuzhiyun const char *str_sec;
6187*4882a593Smuzhiyun __u32 str_sec_size;
6188*4882a593Smuzhiyun };
6189*4882a593Smuzhiyun
6190*4882a593Smuzhiyun struct btf_dedup_test {
6191*4882a593Smuzhiyun const char *descr;
6192*4882a593Smuzhiyun struct btf_raw_data input;
6193*4882a593Smuzhiyun struct btf_raw_data expect;
6194*4882a593Smuzhiyun struct btf_dedup_opts opts;
6195*4882a593Smuzhiyun };
6196*4882a593Smuzhiyun
6197*4882a593Smuzhiyun const struct btf_dedup_test dedup_tests[] = {
6198*4882a593Smuzhiyun
6199*4882a593Smuzhiyun {
6200*4882a593Smuzhiyun .descr = "dedup: unused strings filtering",
6201*4882a593Smuzhiyun .input = {
6202*4882a593Smuzhiyun .raw_types = {
6203*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 4),
6204*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 64, 8),
6205*4882a593Smuzhiyun BTF_END_RAW,
6206*4882a593Smuzhiyun },
6207*4882a593Smuzhiyun BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"),
6208*4882a593Smuzhiyun },
6209*4882a593Smuzhiyun .expect = {
6210*4882a593Smuzhiyun .raw_types = {
6211*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6212*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6213*4882a593Smuzhiyun BTF_END_RAW,
6214*4882a593Smuzhiyun },
6215*4882a593Smuzhiyun BTF_STR_SEC("\0int\0long"),
6216*4882a593Smuzhiyun },
6217*4882a593Smuzhiyun .opts = {
6218*4882a593Smuzhiyun .dont_resolve_fwds = false,
6219*4882a593Smuzhiyun },
6220*4882a593Smuzhiyun },
6221*4882a593Smuzhiyun {
6222*4882a593Smuzhiyun .descr = "dedup: strings deduplication",
6223*4882a593Smuzhiyun .input = {
6224*4882a593Smuzhiyun .raw_types = {
6225*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6226*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6227*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED, 0, 32, 4),
6228*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 64, 8),
6229*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4),
6230*4882a593Smuzhiyun BTF_END_RAW,
6231*4882a593Smuzhiyun },
6232*4882a593Smuzhiyun BTF_STR_SEC("\0int\0long int\0int\0long int\0int"),
6233*4882a593Smuzhiyun },
6234*4882a593Smuzhiyun .expect = {
6235*4882a593Smuzhiyun .raw_types = {
6236*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6237*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6238*4882a593Smuzhiyun BTF_END_RAW,
6239*4882a593Smuzhiyun },
6240*4882a593Smuzhiyun BTF_STR_SEC("\0int\0long int"),
6241*4882a593Smuzhiyun },
6242*4882a593Smuzhiyun .opts = {
6243*4882a593Smuzhiyun .dont_resolve_fwds = false,
6244*4882a593Smuzhiyun },
6245*4882a593Smuzhiyun },
6246*4882a593Smuzhiyun {
6247*4882a593Smuzhiyun .descr = "dedup: struct example #1",
6248*4882a593Smuzhiyun /*
6249*4882a593Smuzhiyun * struct s {
6250*4882a593Smuzhiyun * struct s *next;
6251*4882a593Smuzhiyun * const int *a;
6252*4882a593Smuzhiyun * int b[16];
6253*4882a593Smuzhiyun * int c;
6254*4882a593Smuzhiyun * }
6255*4882a593Smuzhiyun */
6256*4882a593Smuzhiyun .input = {
6257*4882a593Smuzhiyun .raw_types = {
6258*4882a593Smuzhiyun /* int */
6259*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [1] */
6260*4882a593Smuzhiyun /* int[16] */
6261*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */
6262*4882a593Smuzhiyun /* struct s { */
6263*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(2), 4, 84), /* [3] */
6264*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(3), 4, 0), /* struct s *next; */
6265*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(4), 5, 64), /* const int *a; */
6266*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(5), 2, 128), /* int b[16]; */
6267*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(6), 1, 640), /* int c; */
6268*4882a593Smuzhiyun /* ptr -> [3] struct s */
6269*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [4] */
6270*4882a593Smuzhiyun /* ptr -> [6] const int */
6271*4882a593Smuzhiyun BTF_PTR_ENC(6), /* [5] */
6272*4882a593Smuzhiyun /* const -> [1] int */
6273*4882a593Smuzhiyun BTF_CONST_ENC(1), /* [6] */
6274*4882a593Smuzhiyun
6275*4882a593Smuzhiyun /* full copy of the above */
6276*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [7] */
6277*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(7, 7, 16), /* [8] */
6278*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(2), 4, 84), /* [9] */
6279*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(3), 10, 0),
6280*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(4), 11, 64),
6281*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(5), 8, 128),
6282*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(6), 7, 640),
6283*4882a593Smuzhiyun BTF_PTR_ENC(9), /* [10] */
6284*4882a593Smuzhiyun BTF_PTR_ENC(12), /* [11] */
6285*4882a593Smuzhiyun BTF_CONST_ENC(7), /* [12] */
6286*4882a593Smuzhiyun BTF_END_RAW,
6287*4882a593Smuzhiyun },
6288*4882a593Smuzhiyun BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0"),
6289*4882a593Smuzhiyun },
6290*4882a593Smuzhiyun .expect = {
6291*4882a593Smuzhiyun .raw_types = {
6292*4882a593Smuzhiyun /* int */
6293*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 32, 4), /* [1] */
6294*4882a593Smuzhiyun /* int[16] */
6295*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */
6296*4882a593Smuzhiyun /* struct s { */
6297*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(6), 4, 84), /* [3] */
6298*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(5), 4, 0), /* struct s *next; */
6299*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(1), 5, 64), /* const int *a; */
6300*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(2), 2, 128), /* int b[16]; */
6301*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(3), 1, 640), /* int c; */
6302*4882a593Smuzhiyun /* ptr -> [3] struct s */
6303*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [4] */
6304*4882a593Smuzhiyun /* ptr -> [6] const int */
6305*4882a593Smuzhiyun BTF_PTR_ENC(6), /* [5] */
6306*4882a593Smuzhiyun /* const -> [1] int */
6307*4882a593Smuzhiyun BTF_CONST_ENC(1), /* [6] */
6308*4882a593Smuzhiyun BTF_END_RAW,
6309*4882a593Smuzhiyun },
6310*4882a593Smuzhiyun BTF_STR_SEC("\0a\0b\0c\0int\0next\0s"),
6311*4882a593Smuzhiyun },
6312*4882a593Smuzhiyun .opts = {
6313*4882a593Smuzhiyun .dont_resolve_fwds = false,
6314*4882a593Smuzhiyun },
6315*4882a593Smuzhiyun },
6316*4882a593Smuzhiyun {
6317*4882a593Smuzhiyun .descr = "dedup: struct <-> fwd resolution w/ hash collision",
6318*4882a593Smuzhiyun /*
6319*4882a593Smuzhiyun * // CU 1:
6320*4882a593Smuzhiyun * struct x;
6321*4882a593Smuzhiyun * struct s {
6322*4882a593Smuzhiyun * struct x *x;
6323*4882a593Smuzhiyun * };
6324*4882a593Smuzhiyun * // CU 2:
6325*4882a593Smuzhiyun * struct x {};
6326*4882a593Smuzhiyun * struct s {
6327*4882a593Smuzhiyun * struct x *x;
6328*4882a593Smuzhiyun * };
6329*4882a593Smuzhiyun */
6330*4882a593Smuzhiyun .input = {
6331*4882a593Smuzhiyun .raw_types = {
6332*4882a593Smuzhiyun /* CU 1 */
6333*4882a593Smuzhiyun BTF_FWD_ENC(NAME_TBD, 0 /* struct fwd */), /* [1] fwd x */
6334*4882a593Smuzhiyun BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6335*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [3] struct s */
6336*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 2, 0),
6337*4882a593Smuzhiyun /* CU 2 */
6338*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 0, 0), /* [4] struct x */
6339*4882a593Smuzhiyun BTF_PTR_ENC(4), /* [5] ptr -> [4] */
6340*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [6] struct s */
6341*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 5, 0),
6342*4882a593Smuzhiyun BTF_END_RAW,
6343*4882a593Smuzhiyun },
6344*4882a593Smuzhiyun BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"),
6345*4882a593Smuzhiyun },
6346*4882a593Smuzhiyun .expect = {
6347*4882a593Smuzhiyun .raw_types = {
6348*4882a593Smuzhiyun BTF_PTR_ENC(3), /* [1] ptr -> [3] */
6349*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [2] struct s */
6350*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6351*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(2), 0, 0), /* [3] struct x */
6352*4882a593Smuzhiyun BTF_END_RAW,
6353*4882a593Smuzhiyun },
6354*4882a593Smuzhiyun BTF_STR_SEC("\0s\0x"),
6355*4882a593Smuzhiyun },
6356*4882a593Smuzhiyun .opts = {
6357*4882a593Smuzhiyun .dont_resolve_fwds = false,
6358*4882a593Smuzhiyun .dedup_table_size = 1, /* force hash collisions */
6359*4882a593Smuzhiyun },
6360*4882a593Smuzhiyun },
6361*4882a593Smuzhiyun {
6362*4882a593Smuzhiyun .descr = "dedup: void equiv check",
6363*4882a593Smuzhiyun /*
6364*4882a593Smuzhiyun * // CU 1:
6365*4882a593Smuzhiyun * struct s {
6366*4882a593Smuzhiyun * struct {} *x;
6367*4882a593Smuzhiyun * };
6368*4882a593Smuzhiyun * // CU 2:
6369*4882a593Smuzhiyun * struct s {
6370*4882a593Smuzhiyun * int *x;
6371*4882a593Smuzhiyun * };
6372*4882a593Smuzhiyun */
6373*4882a593Smuzhiyun .input = {
6374*4882a593Smuzhiyun .raw_types = {
6375*4882a593Smuzhiyun /* CU 1 */
6376*4882a593Smuzhiyun BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */
6377*4882a593Smuzhiyun BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6378*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */
6379*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6380*4882a593Smuzhiyun /* CU 2 */
6381*4882a593Smuzhiyun BTF_PTR_ENC(0), /* [4] ptr -> void */
6382*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */
6383*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6384*4882a593Smuzhiyun BTF_END_RAW,
6385*4882a593Smuzhiyun },
6386*4882a593Smuzhiyun BTF_STR_SEC("\0s\0x"),
6387*4882a593Smuzhiyun },
6388*4882a593Smuzhiyun .expect = {
6389*4882a593Smuzhiyun .raw_types = {
6390*4882a593Smuzhiyun /* CU 1 */
6391*4882a593Smuzhiyun BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */
6392*4882a593Smuzhiyun BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6393*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */
6394*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6395*4882a593Smuzhiyun /* CU 2 */
6396*4882a593Smuzhiyun BTF_PTR_ENC(0), /* [4] ptr -> void */
6397*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */
6398*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6399*4882a593Smuzhiyun BTF_END_RAW,
6400*4882a593Smuzhiyun },
6401*4882a593Smuzhiyun BTF_STR_SEC("\0s\0x"),
6402*4882a593Smuzhiyun },
6403*4882a593Smuzhiyun .opts = {
6404*4882a593Smuzhiyun .dont_resolve_fwds = false,
6405*4882a593Smuzhiyun .dedup_table_size = 1, /* force hash collisions */
6406*4882a593Smuzhiyun },
6407*4882a593Smuzhiyun },
6408*4882a593Smuzhiyun {
6409*4882a593Smuzhiyun .descr = "dedup: all possible kinds (no duplicates)",
6410*4882a593Smuzhiyun .input = {
6411*4882a593Smuzhiyun .raw_types = {
6412*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */
6413*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */
6414*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
6415*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
6416*4882a593Smuzhiyun BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */
6417*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */
6418*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */
6419*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6420*4882a593Smuzhiyun BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */
6421*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6422*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */
6423*4882a593Smuzhiyun BTF_PTR_ENC(0), /* [8] ptr */
6424*4882a593Smuzhiyun BTF_CONST_ENC(8), /* [9] const */
6425*4882a593Smuzhiyun BTF_VOLATILE_ENC(8), /* [10] volatile */
6426*4882a593Smuzhiyun BTF_RESTRICT_ENC(8), /* [11] restrict */
6427*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */
6428*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6429*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),
6430*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */
6431*4882a593Smuzhiyun BTF_END_RAW,
6432*4882a593Smuzhiyun },
6433*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M"),
6434*4882a593Smuzhiyun },
6435*4882a593Smuzhiyun .expect = {
6436*4882a593Smuzhiyun .raw_types = {
6437*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */
6438*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */
6439*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 0),
6440*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_TBD, 1),
6441*4882a593Smuzhiyun BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */
6442*4882a593Smuzhiyun BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */
6443*4882a593Smuzhiyun BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */
6444*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6445*4882a593Smuzhiyun BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */
6446*4882a593Smuzhiyun BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6447*4882a593Smuzhiyun BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */
6448*4882a593Smuzhiyun BTF_PTR_ENC(0), /* [8] ptr */
6449*4882a593Smuzhiyun BTF_CONST_ENC(8), /* [9] const */
6450*4882a593Smuzhiyun BTF_VOLATILE_ENC(8), /* [10] volatile */
6451*4882a593Smuzhiyun BTF_RESTRICT_ENC(8), /* [11] restrict */
6452*4882a593Smuzhiyun BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */
6453*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6454*4882a593Smuzhiyun BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),
6455*4882a593Smuzhiyun BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */
6456*4882a593Smuzhiyun BTF_END_RAW,
6457*4882a593Smuzhiyun },
6458*4882a593Smuzhiyun BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M"),
6459*4882a593Smuzhiyun },
6460*4882a593Smuzhiyun .opts = {
6461*4882a593Smuzhiyun .dont_resolve_fwds = false,
6462*4882a593Smuzhiyun },
6463*4882a593Smuzhiyun },
6464*4882a593Smuzhiyun {
6465*4882a593Smuzhiyun .descr = "dedup: no int duplicates",
6466*4882a593Smuzhiyun .input = {
6467*4882a593Smuzhiyun .raw_types = {
6468*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
6469*4882a593Smuzhiyun /* different name */
6470*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
6471*4882a593Smuzhiyun /* different encoding */
6472*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
6473*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
6474*4882a593Smuzhiyun /* different bit offset */
6475*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
6476*4882a593Smuzhiyun /* different bit size */
6477*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
6478*4882a593Smuzhiyun /* different byte size */
6479*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6480*4882a593Smuzhiyun BTF_END_RAW,
6481*4882a593Smuzhiyun },
6482*4882a593Smuzhiyun BTF_STR_SEC("\0int\0some other int"),
6483*4882a593Smuzhiyun },
6484*4882a593Smuzhiyun .expect = {
6485*4882a593Smuzhiyun .raw_types = {
6486*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
6487*4882a593Smuzhiyun /* different name */
6488*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
6489*4882a593Smuzhiyun /* different encoding */
6490*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
6491*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
6492*4882a593Smuzhiyun /* different bit offset */
6493*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
6494*4882a593Smuzhiyun /* different bit size */
6495*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
6496*4882a593Smuzhiyun /* different byte size */
6497*4882a593Smuzhiyun BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6498*4882a593Smuzhiyun BTF_END_RAW,
6499*4882a593Smuzhiyun },
6500*4882a593Smuzhiyun BTF_STR_SEC("\0int\0some other int"),
6501*4882a593Smuzhiyun },
6502*4882a593Smuzhiyun .opts = {
6503*4882a593Smuzhiyun .dont_resolve_fwds = false,
6504*4882a593Smuzhiyun },
6505*4882a593Smuzhiyun },
6506*4882a593Smuzhiyun {
6507*4882a593Smuzhiyun .descr = "dedup: enum fwd resolution",
6508*4882a593Smuzhiyun .input = {
6509*4882a593Smuzhiyun .raw_types = {
6510*4882a593Smuzhiyun /* [1] fwd enum 'e1' before full enum */
6511*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
6512*4882a593Smuzhiyun /* [2] full enum 'e1' after fwd */
6513*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6514*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(2), 123),
6515*4882a593Smuzhiyun /* [3] full enum 'e2' before fwd */
6516*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6517*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(4), 456),
6518*4882a593Smuzhiyun /* [4] fwd enum 'e2' after full enum */
6519*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
6520*4882a593Smuzhiyun /* [5] incompatible fwd enum with different size */
6521*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1),
6522*4882a593Smuzhiyun /* [6] incompatible full enum with different value */
6523*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6524*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(2), 321),
6525*4882a593Smuzhiyun BTF_END_RAW,
6526*4882a593Smuzhiyun },
6527*4882a593Smuzhiyun BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6528*4882a593Smuzhiyun },
6529*4882a593Smuzhiyun .expect = {
6530*4882a593Smuzhiyun .raw_types = {
6531*4882a593Smuzhiyun /* [1] full enum 'e1' */
6532*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6533*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(2), 123),
6534*4882a593Smuzhiyun /* [2] full enum 'e2' */
6535*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6536*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(4), 456),
6537*4882a593Smuzhiyun /* [3] incompatible fwd enum with different size */
6538*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1),
6539*4882a593Smuzhiyun /* [4] incompatible full enum with different value */
6540*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6541*4882a593Smuzhiyun BTF_ENUM_ENC(NAME_NTH(2), 321),
6542*4882a593Smuzhiyun BTF_END_RAW,
6543*4882a593Smuzhiyun },
6544*4882a593Smuzhiyun BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6545*4882a593Smuzhiyun },
6546*4882a593Smuzhiyun .opts = {
6547*4882a593Smuzhiyun .dont_resolve_fwds = false,
6548*4882a593Smuzhiyun },
6549*4882a593Smuzhiyun },
6550*4882a593Smuzhiyun {
6551*4882a593Smuzhiyun .descr = "dedup: datasec and vars pass-through",
6552*4882a593Smuzhiyun .input = {
6553*4882a593Smuzhiyun .raw_types = {
6554*4882a593Smuzhiyun /* int */
6555*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
6556*4882a593Smuzhiyun /* static int t */
6557*4882a593Smuzhiyun BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */
6558*4882a593Smuzhiyun /* .bss section */ /* [3] */
6559*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6560*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
6561*4882a593Smuzhiyun /* int, referenced from [5] */
6562*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [4] */
6563*4882a593Smuzhiyun /* another static int t */
6564*4882a593Smuzhiyun BTF_VAR_ENC(NAME_NTH(2), 4, 0), /* [5] */
6565*4882a593Smuzhiyun /* another .bss section */ /* [6] */
6566*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6567*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(5, 0, 4),
6568*4882a593Smuzhiyun BTF_END_RAW,
6569*4882a593Smuzhiyun },
6570*4882a593Smuzhiyun BTF_STR_SEC("\0.bss\0t"),
6571*4882a593Smuzhiyun },
6572*4882a593Smuzhiyun .expect = {
6573*4882a593Smuzhiyun .raw_types = {
6574*4882a593Smuzhiyun /* int */
6575*4882a593Smuzhiyun BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
6576*4882a593Smuzhiyun /* static int t */
6577*4882a593Smuzhiyun BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */
6578*4882a593Smuzhiyun /* .bss section */ /* [3] */
6579*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6580*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(2, 0, 4),
6581*4882a593Smuzhiyun /* another static int t */
6582*4882a593Smuzhiyun BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [4] */
6583*4882a593Smuzhiyun /* another .bss section */ /* [5] */
6584*4882a593Smuzhiyun BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6585*4882a593Smuzhiyun BTF_VAR_SECINFO_ENC(4, 0, 4),
6586*4882a593Smuzhiyun BTF_END_RAW,
6587*4882a593Smuzhiyun },
6588*4882a593Smuzhiyun BTF_STR_SEC("\0.bss\0t"),
6589*4882a593Smuzhiyun },
6590*4882a593Smuzhiyun .opts = {
6591*4882a593Smuzhiyun .dont_resolve_fwds = false,
6592*4882a593Smuzhiyun .dedup_table_size = 1
6593*4882a593Smuzhiyun },
6594*4882a593Smuzhiyun },
6595*4882a593Smuzhiyun
6596*4882a593Smuzhiyun };
6597*4882a593Smuzhiyun
btf_type_size(const struct btf_type * t)6598*4882a593Smuzhiyun static int btf_type_size(const struct btf_type *t)
6599*4882a593Smuzhiyun {
6600*4882a593Smuzhiyun int base_size = sizeof(struct btf_type);
6601*4882a593Smuzhiyun __u16 vlen = BTF_INFO_VLEN(t->info);
6602*4882a593Smuzhiyun __u16 kind = BTF_INFO_KIND(t->info);
6603*4882a593Smuzhiyun
6604*4882a593Smuzhiyun switch (kind) {
6605*4882a593Smuzhiyun case BTF_KIND_FWD:
6606*4882a593Smuzhiyun case BTF_KIND_CONST:
6607*4882a593Smuzhiyun case BTF_KIND_VOLATILE:
6608*4882a593Smuzhiyun case BTF_KIND_RESTRICT:
6609*4882a593Smuzhiyun case BTF_KIND_PTR:
6610*4882a593Smuzhiyun case BTF_KIND_TYPEDEF:
6611*4882a593Smuzhiyun case BTF_KIND_FUNC:
6612*4882a593Smuzhiyun return base_size;
6613*4882a593Smuzhiyun case BTF_KIND_INT:
6614*4882a593Smuzhiyun return base_size + sizeof(__u32);
6615*4882a593Smuzhiyun case BTF_KIND_ENUM:
6616*4882a593Smuzhiyun return base_size + vlen * sizeof(struct btf_enum);
6617*4882a593Smuzhiyun case BTF_KIND_ARRAY:
6618*4882a593Smuzhiyun return base_size + sizeof(struct btf_array);
6619*4882a593Smuzhiyun case BTF_KIND_STRUCT:
6620*4882a593Smuzhiyun case BTF_KIND_UNION:
6621*4882a593Smuzhiyun return base_size + vlen * sizeof(struct btf_member);
6622*4882a593Smuzhiyun case BTF_KIND_FUNC_PROTO:
6623*4882a593Smuzhiyun return base_size + vlen * sizeof(struct btf_param);
6624*4882a593Smuzhiyun case BTF_KIND_VAR:
6625*4882a593Smuzhiyun return base_size + sizeof(struct btf_var);
6626*4882a593Smuzhiyun case BTF_KIND_DATASEC:
6627*4882a593Smuzhiyun return base_size + vlen * sizeof(struct btf_var_secinfo);
6628*4882a593Smuzhiyun default:
6629*4882a593Smuzhiyun fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind);
6630*4882a593Smuzhiyun return -EINVAL;
6631*4882a593Smuzhiyun }
6632*4882a593Smuzhiyun }
6633*4882a593Smuzhiyun
dump_btf_strings(const char * strs,__u32 len)6634*4882a593Smuzhiyun static void dump_btf_strings(const char *strs, __u32 len)
6635*4882a593Smuzhiyun {
6636*4882a593Smuzhiyun const char *cur = strs;
6637*4882a593Smuzhiyun int i = 0;
6638*4882a593Smuzhiyun
6639*4882a593Smuzhiyun while (cur < strs + len) {
6640*4882a593Smuzhiyun fprintf(stderr, "string #%d: '%s'\n", i, cur);
6641*4882a593Smuzhiyun cur += strlen(cur) + 1;
6642*4882a593Smuzhiyun i++;
6643*4882a593Smuzhiyun }
6644*4882a593Smuzhiyun }
6645*4882a593Smuzhiyun
do_test_dedup(unsigned int test_num)6646*4882a593Smuzhiyun static void do_test_dedup(unsigned int test_num)
6647*4882a593Smuzhiyun {
6648*4882a593Smuzhiyun const struct btf_dedup_test *test = &dedup_tests[test_num - 1];
6649*4882a593Smuzhiyun __u32 test_nr_types, expect_nr_types, test_btf_size, expect_btf_size;
6650*4882a593Smuzhiyun const struct btf_header *test_hdr, *expect_hdr;
6651*4882a593Smuzhiyun struct btf *test_btf = NULL, *expect_btf = NULL;
6652*4882a593Smuzhiyun const void *test_btf_data, *expect_btf_data;
6653*4882a593Smuzhiyun const char *ret_test_next_str, *ret_expect_next_str;
6654*4882a593Smuzhiyun const char *test_strs, *expect_strs;
6655*4882a593Smuzhiyun const char *test_str_cur, *test_str_end;
6656*4882a593Smuzhiyun const char *expect_str_cur, *expect_str_end;
6657*4882a593Smuzhiyun unsigned int raw_btf_size;
6658*4882a593Smuzhiyun void *raw_btf;
6659*4882a593Smuzhiyun int err = 0, i;
6660*4882a593Smuzhiyun
6661*4882a593Smuzhiyun if (!test__start_subtest(test->descr))
6662*4882a593Smuzhiyun return;
6663*4882a593Smuzhiyun
6664*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl, test->input.raw_types,
6665*4882a593Smuzhiyun test->input.str_sec, test->input.str_sec_size,
6666*4882a593Smuzhiyun &raw_btf_size, &ret_test_next_str);
6667*4882a593Smuzhiyun if (!raw_btf)
6668*4882a593Smuzhiyun return;
6669*4882a593Smuzhiyun
6670*4882a593Smuzhiyun test_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
6671*4882a593Smuzhiyun free(raw_btf);
6672*4882a593Smuzhiyun if (CHECK(IS_ERR(test_btf), "invalid test_btf errno:%ld",
6673*4882a593Smuzhiyun PTR_ERR(test_btf))) {
6674*4882a593Smuzhiyun err = -1;
6675*4882a593Smuzhiyun goto done;
6676*4882a593Smuzhiyun }
6677*4882a593Smuzhiyun
6678*4882a593Smuzhiyun raw_btf = btf_raw_create(&hdr_tmpl, test->expect.raw_types,
6679*4882a593Smuzhiyun test->expect.str_sec,
6680*4882a593Smuzhiyun test->expect.str_sec_size,
6681*4882a593Smuzhiyun &raw_btf_size, &ret_expect_next_str);
6682*4882a593Smuzhiyun if (!raw_btf)
6683*4882a593Smuzhiyun return;
6684*4882a593Smuzhiyun expect_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
6685*4882a593Smuzhiyun free(raw_btf);
6686*4882a593Smuzhiyun if (CHECK(IS_ERR(expect_btf), "invalid expect_btf errno:%ld",
6687*4882a593Smuzhiyun PTR_ERR(expect_btf))) {
6688*4882a593Smuzhiyun err = -1;
6689*4882a593Smuzhiyun goto done;
6690*4882a593Smuzhiyun }
6691*4882a593Smuzhiyun
6692*4882a593Smuzhiyun err = btf__dedup(test_btf, NULL, &test->opts);
6693*4882a593Smuzhiyun if (CHECK(err, "btf_dedup failed errno:%d", err)) {
6694*4882a593Smuzhiyun err = -1;
6695*4882a593Smuzhiyun goto done;
6696*4882a593Smuzhiyun }
6697*4882a593Smuzhiyun
6698*4882a593Smuzhiyun test_btf_data = btf__get_raw_data(test_btf, &test_btf_size);
6699*4882a593Smuzhiyun expect_btf_data = btf__get_raw_data(expect_btf, &expect_btf_size);
6700*4882a593Smuzhiyun if (CHECK(test_btf_size != expect_btf_size,
6701*4882a593Smuzhiyun "test_btf_size:%u != expect_btf_size:%u",
6702*4882a593Smuzhiyun test_btf_size, expect_btf_size)) {
6703*4882a593Smuzhiyun err = -1;
6704*4882a593Smuzhiyun goto done;
6705*4882a593Smuzhiyun }
6706*4882a593Smuzhiyun
6707*4882a593Smuzhiyun test_hdr = test_btf_data;
6708*4882a593Smuzhiyun test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off;
6709*4882a593Smuzhiyun expect_hdr = expect_btf_data;
6710*4882a593Smuzhiyun expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off;
6711*4882a593Smuzhiyun if (CHECK(test_hdr->str_len != expect_hdr->str_len,
6712*4882a593Smuzhiyun "test_hdr->str_len:%u != expect_hdr->str_len:%u",
6713*4882a593Smuzhiyun test_hdr->str_len, expect_hdr->str_len)) {
6714*4882a593Smuzhiyun fprintf(stderr, "\ntest strings:\n");
6715*4882a593Smuzhiyun dump_btf_strings(test_strs, test_hdr->str_len);
6716*4882a593Smuzhiyun fprintf(stderr, "\nexpected strings:\n");
6717*4882a593Smuzhiyun dump_btf_strings(expect_strs, expect_hdr->str_len);
6718*4882a593Smuzhiyun err = -1;
6719*4882a593Smuzhiyun goto done;
6720*4882a593Smuzhiyun }
6721*4882a593Smuzhiyun
6722*4882a593Smuzhiyun test_str_cur = test_strs;
6723*4882a593Smuzhiyun test_str_end = test_strs + test_hdr->str_len;
6724*4882a593Smuzhiyun expect_str_cur = expect_strs;
6725*4882a593Smuzhiyun expect_str_end = expect_strs + expect_hdr->str_len;
6726*4882a593Smuzhiyun while (test_str_cur < test_str_end && expect_str_cur < expect_str_end) {
6727*4882a593Smuzhiyun size_t test_len, expect_len;
6728*4882a593Smuzhiyun
6729*4882a593Smuzhiyun test_len = strlen(test_str_cur);
6730*4882a593Smuzhiyun expect_len = strlen(expect_str_cur);
6731*4882a593Smuzhiyun if (CHECK(test_len != expect_len,
6732*4882a593Smuzhiyun "test_len:%zu != expect_len:%zu "
6733*4882a593Smuzhiyun "(test_str:%s, expect_str:%s)",
6734*4882a593Smuzhiyun test_len, expect_len, test_str_cur, expect_str_cur)) {
6735*4882a593Smuzhiyun err = -1;
6736*4882a593Smuzhiyun goto done;
6737*4882a593Smuzhiyun }
6738*4882a593Smuzhiyun if (CHECK(strcmp(test_str_cur, expect_str_cur),
6739*4882a593Smuzhiyun "test_str:%s != expect_str:%s",
6740*4882a593Smuzhiyun test_str_cur, expect_str_cur)) {
6741*4882a593Smuzhiyun err = -1;
6742*4882a593Smuzhiyun goto done;
6743*4882a593Smuzhiyun }
6744*4882a593Smuzhiyun test_str_cur += test_len + 1;
6745*4882a593Smuzhiyun expect_str_cur += expect_len + 1;
6746*4882a593Smuzhiyun }
6747*4882a593Smuzhiyun if (CHECK(test_str_cur != test_str_end,
6748*4882a593Smuzhiyun "test_str_cur:%p != test_str_end:%p",
6749*4882a593Smuzhiyun test_str_cur, test_str_end)) {
6750*4882a593Smuzhiyun err = -1;
6751*4882a593Smuzhiyun goto done;
6752*4882a593Smuzhiyun }
6753*4882a593Smuzhiyun
6754*4882a593Smuzhiyun test_nr_types = btf__get_nr_types(test_btf);
6755*4882a593Smuzhiyun expect_nr_types = btf__get_nr_types(expect_btf);
6756*4882a593Smuzhiyun if (CHECK(test_nr_types != expect_nr_types,
6757*4882a593Smuzhiyun "test_nr_types:%u != expect_nr_types:%u",
6758*4882a593Smuzhiyun test_nr_types, expect_nr_types)) {
6759*4882a593Smuzhiyun err = -1;
6760*4882a593Smuzhiyun goto done;
6761*4882a593Smuzhiyun }
6762*4882a593Smuzhiyun
6763*4882a593Smuzhiyun for (i = 1; i <= test_nr_types; i++) {
6764*4882a593Smuzhiyun const struct btf_type *test_type, *expect_type;
6765*4882a593Smuzhiyun int test_size, expect_size;
6766*4882a593Smuzhiyun
6767*4882a593Smuzhiyun test_type = btf__type_by_id(test_btf, i);
6768*4882a593Smuzhiyun expect_type = btf__type_by_id(expect_btf, i);
6769*4882a593Smuzhiyun test_size = btf_type_size(test_type);
6770*4882a593Smuzhiyun expect_size = btf_type_size(expect_type);
6771*4882a593Smuzhiyun
6772*4882a593Smuzhiyun if (CHECK(test_size != expect_size,
6773*4882a593Smuzhiyun "type #%d: test_size:%d != expect_size:%u",
6774*4882a593Smuzhiyun i, test_size, expect_size)) {
6775*4882a593Smuzhiyun err = -1;
6776*4882a593Smuzhiyun goto done;
6777*4882a593Smuzhiyun }
6778*4882a593Smuzhiyun if (CHECK(memcmp((void *)test_type,
6779*4882a593Smuzhiyun (void *)expect_type,
6780*4882a593Smuzhiyun test_size),
6781*4882a593Smuzhiyun "type #%d: contents differ", i)) {
6782*4882a593Smuzhiyun err = -1;
6783*4882a593Smuzhiyun goto done;
6784*4882a593Smuzhiyun }
6785*4882a593Smuzhiyun }
6786*4882a593Smuzhiyun
6787*4882a593Smuzhiyun done:
6788*4882a593Smuzhiyun if (!IS_ERR(test_btf))
6789*4882a593Smuzhiyun btf__free(test_btf);
6790*4882a593Smuzhiyun if (!IS_ERR(expect_btf))
6791*4882a593Smuzhiyun btf__free(expect_btf);
6792*4882a593Smuzhiyun }
6793*4882a593Smuzhiyun
test_btf(void)6794*4882a593Smuzhiyun void test_btf(void)
6795*4882a593Smuzhiyun {
6796*4882a593Smuzhiyun int i;
6797*4882a593Smuzhiyun
6798*4882a593Smuzhiyun always_log = env.verbosity > VERBOSE_NONE;
6799*4882a593Smuzhiyun
6800*4882a593Smuzhiyun for (i = 1; i <= ARRAY_SIZE(raw_tests); i++)
6801*4882a593Smuzhiyun do_test_raw(i);
6802*4882a593Smuzhiyun for (i = 1; i <= ARRAY_SIZE(get_info_tests); i++)
6803*4882a593Smuzhiyun do_test_get_info(i);
6804*4882a593Smuzhiyun for (i = 1; i <= ARRAY_SIZE(file_tests); i++)
6805*4882a593Smuzhiyun do_test_file(i);
6806*4882a593Smuzhiyun for (i = 1; i <= ARRAY_SIZE(info_raw_tests); i++)
6807*4882a593Smuzhiyun do_test_info_raw(i);
6808*4882a593Smuzhiyun for (i = 1; i <= ARRAY_SIZE(dedup_tests); i++)
6809*4882a593Smuzhiyun do_test_dedup(i);
6810*4882a593Smuzhiyun test_pprint();
6811*4882a593Smuzhiyun }
6812