1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2018 Facebook */
7 #include <linux/kernel.h>
8 #include <linux/filter.h>
9 #include <linux/unistd.h>
11 #include <sys/resource.h>
22 #include <bpf/libbpf.h>
25 #include "bpf_rlimit.h"
30 #define MAX_SUBPROGS 16
32 static uint32_t pass_cnt
;
33 static uint32_t error_cnt
;
34 static uint32_t skip_cnt
;
36 #define CHECK(condition, format...) ({ \
37 int __ret = !!(condition); \
39 fprintf(stderr, "%s:%d:FAIL ", __func__, __LINE__); \
40 fprintf(stderr, format); \
45 static int count_result(int err
)
52 fprintf(stderr
, "\n");
56 static int __base_pr(enum libbpf_print_level level
__attribute__((unused
)),
57 const char *format
, va_list args
)
59 return vfprintf(stderr
, format
, args
);
62 #define BTF_END_RAW 0xdeadbeef
63 #define NAME_TBD 0xdeadb33f
65 #define NAME_NTH(N) (0xffff0000 | N)
66 #define IS_NAME_NTH(X) ((X & 0xffff0000) == 0xffff0000)
67 #define GET_NAME_NTH_IDX(X) (X & 0x0000ffff)
69 #define MAX_NR_RAW_U32 1024
70 #define BTF_LOG_BUF_SIZE 65535
73 unsigned int raw_test_num
;
74 unsigned int file_test_num
;
75 unsigned int get_info_test_num
;
76 unsigned int info_raw_test_num
;
77 unsigned int dedup_test_num
;
87 static char btf_log_buf
[BTF_LOG_BUF_SIZE
];
89 static struct btf_header hdr_tmpl
= {
91 .version
= BTF_VERSION
,
92 .hdr_len
= sizeof(struct btf_header
),
95 /* several different mapv kinds(types) supported by pprint */
96 enum pprint_mapv_kind_t
{
97 PPRINT_MAPV_KIND_BASIC
= 0,
98 PPRINT_MAPV_KIND_INT128
,
101 struct btf_raw_test
{
104 const char *map_name
;
106 __u32 raw_types
[MAX_NR_RAW_U32
];
108 enum bpf_map_type map_type
;
123 enum pprint_mapv_kind_t mapv_kind
;
126 #define BTF_STR_SEC(str) \
127 .str_sec = str, .str_sec_size = sizeof(str)
129 static struct btf_raw_test raw_tests
[] = {
136 * unsigned long long m;
146 .descr
= "struct test #1",
149 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
150 /* unsigned long long */
151 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
153 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
155 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
156 /* struct A { */ /* [5] */
157 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 6), 180),
158 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
159 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
160 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
161 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
162 BTF_MEMBER_ENC(NAME_TBD
, 6, 384),/* int q[4][8] */
163 BTF_MEMBER_ENC(NAME_TBD
, 7, 1408), /* enum E r */
166 BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [6] */
167 /* enum E */ /* [7] */
168 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 2), sizeof(int)),
169 BTF_ENUM_ENC(NAME_TBD
, 0),
170 BTF_ENUM_ENC(NAME_TBD
, 1),
173 .str_sec
= "\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1",
174 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1"),
175 .map_type
= BPF_MAP_TYPE_ARRAY
,
176 .map_name
= "struct_test1_map",
177 .key_size
= sizeof(int),
184 /* typedef struct b Struct_B;
189 * const Struct_B o[4];
198 .descr
= "struct test #2",
201 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
202 /* struct b [4] */ /* [2] */
203 BTF_TYPE_ARRAY_ENC(4, 1, 4),
205 /* struct A { */ /* [3] */
206 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 3), 68),
207 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
208 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* struct B n[4] */
209 BTF_MEMBER_ENC(NAME_TBD
, 8, 288),/* const Struct_B o[4];*/
212 /* struct B { */ /* [4] */
213 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), 8),
214 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
215 BTF_MEMBER_ENC(NAME_TBD
, 1, 32),/* int n; */
218 /* const int */ /* [5] */
219 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 1),
220 /* typedef struct b Struct_B */ /* [6] */
221 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_TYPEDEF
, 0, 0), 4),
222 /* const Struct_B */ /* [7] */
223 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 6),
224 /* const Struct_B [4] */ /* [8] */
225 BTF_TYPE_ARRAY_ENC(7, 1, 4),
228 .str_sec
= "\0A\0m\0n\0o\0B\0m\0n\0Struct_B",
229 .str_sec_size
= sizeof("\0A\0m\0n\0o\0B\0m\0n\0Struct_B"),
230 .map_type
= BPF_MAP_TYPE_ARRAY
,
231 .map_name
= "struct_test2_map",
232 .key_size
= sizeof(int),
239 .descr
= "struct test #3 Invalid member offset",
242 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
243 /* int64 */ /* [2] */
244 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 64, 8),
246 /* struct A { */ /* [3] */
247 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), 16),
248 BTF_MEMBER_ENC(NAME_TBD
, 1, 64), /* int m; */
249 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* int64 n; */
253 .str_sec
= "\0A\0m\0n\0",
254 .str_sec_size
= sizeof("\0A\0m\0n\0"),
255 .map_type
= BPF_MAP_TYPE_ARRAY
,
256 .map_name
= "struct_test3_map",
257 .key_size
= sizeof(int),
262 .btf_load_err
= true,
263 .err_str
= "Invalid member bits_offset",
267 * unsigned long long m;
275 .descr
= "global data test #1",
278 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
279 /* unsigned long long */
280 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
282 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
284 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
285 /* struct A { */ /* [5] */
286 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
287 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
288 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
289 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
290 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
294 .str_sec
= "\0A\0m\0n\0o\0p",
295 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p"),
296 .map_type
= BPF_MAP_TYPE_ARRAY
,
297 .map_name
= "struct_test1_map",
298 .key_size
= sizeof(int),
306 * unsigned long long m;
312 * static struct A t; <- in .bss
315 .descr
= "global data test #2",
318 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
319 /* unsigned long long */
320 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
322 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
324 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
325 /* struct A { */ /* [5] */
326 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
327 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
328 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
329 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
330 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
332 /* static struct A t */
333 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
334 /* .bss section */ /* [7] */
335 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 48),
336 BTF_VAR_SECINFO_ENC(6, 0, 48),
339 .str_sec
= "\0A\0m\0n\0o\0p\0t\0.bss",
340 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
341 .map_type
= BPF_MAP_TYPE_ARRAY
,
343 .key_size
= sizeof(int),
350 .descr
= "global data test #3",
353 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
355 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [2] */
356 /* .bss section */ /* [3] */
357 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
358 BTF_VAR_SECINFO_ENC(2, 0, 4),
361 .str_sec
= "\0t\0.bss",
362 .str_sec_size
= sizeof("\0t\0.bss"),
363 .map_type
= BPF_MAP_TYPE_ARRAY
,
365 .key_size
= sizeof(int),
372 .descr
= "global data test #4, unsupported linkage",
375 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
377 BTF_VAR_ENC(NAME_TBD
, 1, 2), /* [2] */
378 /* .bss section */ /* [3] */
379 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
380 BTF_VAR_SECINFO_ENC(2, 0, 4),
383 .str_sec
= "\0t\0.bss",
384 .str_sec_size
= sizeof("\0t\0.bss"),
385 .map_type
= BPF_MAP_TYPE_ARRAY
,
387 .key_size
= sizeof(int),
392 .btf_load_err
= true,
393 .err_str
= "Linkage not supported",
396 .descr
= "global data test #5, invalid var type",
399 BTF_VAR_ENC(NAME_TBD
, 0, 0), /* [1] */
400 /* .bss section */ /* [2] */
401 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
402 BTF_VAR_SECINFO_ENC(1, 0, 4),
405 .str_sec
= "\0t\0.bss",
406 .str_sec_size
= sizeof("\0t\0.bss"),
407 .map_type
= BPF_MAP_TYPE_ARRAY
,
409 .key_size
= sizeof(int),
414 .btf_load_err
= true,
415 .err_str
= "Invalid type_id",
418 .descr
= "global data test #6, invalid var type (fwd type)",
421 BTF_TYPE_ENC(NAME_TBD
,
422 BTF_INFO_ENC(BTF_KIND_FWD
, 1, 0), 0), /* [1] */
423 /* static union A t */
424 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [2] */
425 /* .bss section */ /* [3] */
426 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
427 BTF_VAR_SECINFO_ENC(2, 0, 4),
430 .str_sec
= "\0A\0t\0.bss",
431 .str_sec_size
= sizeof("\0A\0t\0.bss"),
432 .map_type
= BPF_MAP_TYPE_ARRAY
,
434 .key_size
= sizeof(int),
439 .btf_load_err
= true,
440 .err_str
= "Invalid type",
443 .descr
= "global data test #7, invalid var type (fwd type)",
446 BTF_TYPE_ENC(NAME_TBD
,
447 BTF_INFO_ENC(BTF_KIND_FWD
, 1, 0), 0), /* [1] */
448 /* static union A t */
449 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [2] */
450 /* .bss section */ /* [3] */
451 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
452 BTF_VAR_SECINFO_ENC(1, 0, 4),
455 .str_sec
= "\0A\0t\0.bss",
456 .str_sec_size
= sizeof("\0A\0t\0.bss"),
457 .map_type
= BPF_MAP_TYPE_ARRAY
,
459 .key_size
= sizeof(int),
464 .btf_load_err
= true,
465 .err_str
= "Invalid type",
468 .descr
= "global data test #8, invalid var size",
471 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
472 /* unsigned long long */
473 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
475 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
477 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
478 /* struct A { */ /* [5] */
479 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
480 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
481 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
482 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
483 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
485 /* static struct A t */
486 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
487 /* .bss section */ /* [7] */
488 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 48),
489 BTF_VAR_SECINFO_ENC(6, 0, 47),
492 .str_sec
= "\0A\0m\0n\0o\0p\0t\0.bss",
493 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
494 .map_type
= BPF_MAP_TYPE_ARRAY
,
496 .key_size
= sizeof(int),
501 .btf_load_err
= true,
502 .err_str
= "Invalid size",
505 .descr
= "global data test #9, invalid var size",
508 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
509 /* unsigned long long */
510 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
512 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
514 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
515 /* struct A { */ /* [5] */
516 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
517 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
518 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
519 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
520 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
522 /* static struct A t */
523 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
524 /* .bss section */ /* [7] */
525 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 46),
526 BTF_VAR_SECINFO_ENC(6, 0, 48),
529 .str_sec
= "\0A\0m\0n\0o\0p\0t\0.bss",
530 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
531 .map_type
= BPF_MAP_TYPE_ARRAY
,
533 .key_size
= sizeof(int),
538 .btf_load_err
= true,
539 .err_str
= "Invalid size",
542 .descr
= "global data test #10, invalid var size",
545 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
546 /* unsigned long long */
547 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
549 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
551 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
552 /* struct A { */ /* [5] */
553 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
554 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
555 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
556 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
557 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
559 /* static struct A t */
560 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
561 /* .bss section */ /* [7] */
562 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 46),
563 BTF_VAR_SECINFO_ENC(6, 0, 46),
566 .str_sec
= "\0A\0m\0n\0o\0p\0t\0.bss",
567 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
568 .map_type
= BPF_MAP_TYPE_ARRAY
,
570 .key_size
= sizeof(int),
575 .btf_load_err
= true,
576 .err_str
= "Invalid size",
579 .descr
= "global data test #11, multiple section members",
582 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
583 /* unsigned long long */
584 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
586 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
588 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
589 /* struct A { */ /* [5] */
590 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
591 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
592 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
593 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
594 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
596 /* static struct A t */
597 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
599 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [7] */
600 /* .bss section */ /* [8] */
601 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 2), 62),
602 BTF_VAR_SECINFO_ENC(6, 10, 48),
603 BTF_VAR_SECINFO_ENC(7, 58, 4),
606 .str_sec
= "\0A\0m\0n\0o\0p\0t\0u\0.bss",
607 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
608 .map_type
= BPF_MAP_TYPE_ARRAY
,
610 .key_size
= sizeof(int),
617 .descr
= "global data test #12, invalid offset",
620 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
621 /* unsigned long long */
622 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
624 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
626 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
627 /* struct A { */ /* [5] */
628 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
629 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
630 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
631 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
632 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
634 /* static struct A t */
635 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
637 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [7] */
638 /* .bss section */ /* [8] */
639 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 2), 62),
640 BTF_VAR_SECINFO_ENC(6, 10, 48),
641 BTF_VAR_SECINFO_ENC(7, 60, 4),
644 .str_sec
= "\0A\0m\0n\0o\0p\0t\0u\0.bss",
645 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
646 .map_type
= BPF_MAP_TYPE_ARRAY
,
648 .key_size
= sizeof(int),
653 .btf_load_err
= true,
654 .err_str
= "Invalid offset+size",
657 .descr
= "global data test #13, invalid offset",
660 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
661 /* unsigned long long */
662 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
664 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
666 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
667 /* struct A { */ /* [5] */
668 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
669 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
670 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
671 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
672 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
674 /* static struct A t */
675 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
677 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [7] */
678 /* .bss section */ /* [8] */
679 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 2), 62),
680 BTF_VAR_SECINFO_ENC(6, 10, 48),
681 BTF_VAR_SECINFO_ENC(7, 12, 4),
684 .str_sec
= "\0A\0m\0n\0o\0p\0t\0u\0.bss",
685 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
686 .map_type
= BPF_MAP_TYPE_ARRAY
,
688 .key_size
= sizeof(int),
693 .btf_load_err
= true,
694 .err_str
= "Invalid offset",
697 .descr
= "global data test #14, invalid offset",
700 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
701 /* unsigned long long */
702 BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */
704 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 8, 1), /* [3] */
706 BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */
707 /* struct A { */ /* [5] */
708 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 4), 48),
709 BTF_MEMBER_ENC(NAME_TBD
, 2, 0), /* unsigned long long m;*/
710 BTF_MEMBER_ENC(NAME_TBD
, 1, 64),/* int n; */
711 BTF_MEMBER_ENC(NAME_TBD
, 3, 96),/* char o; */
712 BTF_MEMBER_ENC(NAME_TBD
, 4, 128),/* int p[8] */
714 /* static struct A t */
715 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [6] */
717 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [7] */
718 /* .bss section */ /* [8] */
719 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 2), 62),
720 BTF_VAR_SECINFO_ENC(7, 58, 4),
721 BTF_VAR_SECINFO_ENC(6, 10, 48),
724 .str_sec
= "\0A\0m\0n\0o\0p\0t\0u\0.bss",
725 .str_sec_size
= sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
726 .map_type
= BPF_MAP_TYPE_ARRAY
,
728 .key_size
= sizeof(int),
733 .btf_load_err
= true,
734 .err_str
= "Invalid offset",
737 .descr
= "global data test #15, not var kind",
740 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
741 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [2] */
742 /* .bss section */ /* [3] */
743 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
744 BTF_VAR_SECINFO_ENC(1, 0, 4),
747 .str_sec
= "\0A\0t\0.bss",
748 .str_sec_size
= sizeof("\0A\0t\0.bss"),
749 .map_type
= BPF_MAP_TYPE_ARRAY
,
751 .key_size
= sizeof(int),
756 .btf_load_err
= true,
757 .err_str
= "Not a VAR kind member",
760 .descr
= "global data test #16, invalid var referencing sec",
763 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
764 BTF_VAR_ENC(NAME_TBD
, 5, 0), /* [2] */
765 BTF_VAR_ENC(NAME_TBD
, 2, 0), /* [3] */
766 /* a section */ /* [4] */
767 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
768 BTF_VAR_SECINFO_ENC(3, 0, 4),
769 /* a section */ /* [5] */
770 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
771 BTF_VAR_SECINFO_ENC(6, 0, 4),
772 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [6] */
775 .str_sec
= "\0A\0t\0s\0a\0a",
776 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
777 .map_type
= BPF_MAP_TYPE_ARRAY
,
779 .key_size
= sizeof(int),
784 .btf_load_err
= true,
785 .err_str
= "Invalid type_id",
788 .descr
= "global data test #17, invalid var referencing var",
791 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
792 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [2] */
793 BTF_VAR_ENC(NAME_TBD
, 2, 0), /* [3] */
794 /* a section */ /* [4] */
795 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
796 BTF_VAR_SECINFO_ENC(3, 0, 4),
799 .str_sec
= "\0A\0t\0s\0a\0a",
800 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
801 .map_type
= BPF_MAP_TYPE_ARRAY
,
803 .key_size
= sizeof(int),
808 .btf_load_err
= true,
809 .err_str
= "Invalid type_id",
812 .descr
= "global data test #18, invalid var loop",
815 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
816 BTF_VAR_ENC(NAME_TBD
, 2, 0), /* [2] */
817 /* .bss section */ /* [3] */
818 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
819 BTF_VAR_SECINFO_ENC(2, 0, 4),
822 .str_sec
= "\0A\0t\0aaa",
823 .str_sec_size
= sizeof("\0A\0t\0aaa"),
824 .map_type
= BPF_MAP_TYPE_ARRAY
,
826 .key_size
= sizeof(int),
831 .btf_load_err
= true,
832 .err_str
= "Invalid type_id",
835 .descr
= "global data test #19, invalid var referencing var",
838 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
839 BTF_VAR_ENC(NAME_TBD
, 3, 0), /* [2] */
840 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [3] */
843 .str_sec
= "\0A\0t\0s\0a\0a",
844 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
845 .map_type
= BPF_MAP_TYPE_ARRAY
,
847 .key_size
= sizeof(int),
852 .btf_load_err
= true,
853 .err_str
= "Invalid type_id",
856 .descr
= "global data test #20, invalid ptr referencing var",
859 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
860 /* PTR type_id=3 */ /* [2] */
861 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 3),
862 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [3] */
865 .str_sec
= "\0A\0t\0s\0a\0a",
866 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
867 .map_type
= BPF_MAP_TYPE_ARRAY
,
869 .key_size
= sizeof(int),
874 .btf_load_err
= true,
875 .err_str
= "Invalid type_id",
878 .descr
= "global data test #21, var included in struct",
881 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
882 /* struct A { */ /* [2] */
883 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), sizeof(int) * 2),
884 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
885 BTF_MEMBER_ENC(NAME_TBD
, 3, 32),/* VAR type_id=3; */
887 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [3] */
890 .str_sec
= "\0A\0t\0s\0a\0a",
891 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
892 .map_type
= BPF_MAP_TYPE_ARRAY
,
894 .key_size
= sizeof(int),
899 .btf_load_err
= true,
900 .err_str
= "Invalid member",
903 .descr
= "global data test #22, array of var",
906 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
907 BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */
908 BTF_VAR_ENC(NAME_TBD
, 1, 0), /* [3] */
911 .str_sec
= "\0A\0t\0s\0a\0a",
912 .str_sec_size
= sizeof("\0A\0t\0s\0a\0a"),
913 .map_type
= BPF_MAP_TYPE_ARRAY
,
915 .key_size
= sizeof(int),
920 .btf_load_err
= true,
921 .err_str
= "Invalid elem",
923 /* Test member exceeds the size of struct.
931 .descr
= "size check test #1",
934 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
935 /* struct A { */ /* [2] */
936 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), sizeof(int) * 2 - 1),
937 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
938 BTF_MEMBER_ENC(NAME_TBD
, 1, 32),/* int n; */
942 .str_sec
= "\0A\0m\0n",
943 .str_sec_size
= sizeof("\0A\0m\0n"),
944 .map_type
= BPF_MAP_TYPE_ARRAY
,
945 .map_name
= "size_check1_map",
946 .key_size
= sizeof(int),
951 .btf_load_err
= true,
952 .err_str
= "Member exceeds struct_size",
955 /* Test member exeeds the size of struct
963 .descr
= "size check test #2",
966 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, sizeof(int)),
967 /* int[2] */ /* [2] */
968 BTF_TYPE_ARRAY_ENC(1, 1, 2),
969 /* struct A { */ /* [3] */
970 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), sizeof(int) * 3 - 1),
971 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
972 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* int n[2]; */
976 .str_sec
= "\0A\0m\0n",
977 .str_sec_size
= sizeof("\0A\0m\0n"),
978 .map_type
= BPF_MAP_TYPE_ARRAY
,
979 .map_name
= "size_check2_map",
980 .key_size
= sizeof(int),
985 .btf_load_err
= true,
986 .err_str
= "Member exceeds struct_size",
989 /* Test member exeeds the size of struct
997 .descr
= "size check test #3",
1000 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, sizeof(int)),
1001 /* void* */ /* [2] */
1002 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 0),
1003 /* struct A { */ /* [3] */
1004 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), sizeof(int) + sizeof(void *) - 1),
1005 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
1006 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* void *n; */
1010 .str_sec
= "\0A\0m\0n",
1011 .str_sec_size
= sizeof("\0A\0m\0n"),
1012 .map_type
= BPF_MAP_TYPE_ARRAY
,
1013 .map_name
= "size_check3_map",
1014 .key_size
= sizeof(int),
1019 .btf_load_err
= true,
1020 .err_str
= "Member exceeds struct_size",
1023 /* Test member exceeds the size of struct
1036 .descr
= "size check test #4",
1039 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, sizeof(int)),
1040 /* enum E { */ /* [2] */
1041 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 2), sizeof(int)),
1042 BTF_ENUM_ENC(NAME_TBD
, 0),
1043 BTF_ENUM_ENC(NAME_TBD
, 1),
1045 /* struct A { */ /* [3] */
1046 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), sizeof(int) * 2 - 1),
1047 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int m; */
1048 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* enum E n; */
1052 .str_sec
= "\0E\0E0\0E1\0A\0m\0n",
1053 .str_sec_size
= sizeof("\0E\0E0\0E1\0A\0m\0n"),
1054 .map_type
= BPF_MAP_TYPE_ARRAY
,
1055 .map_name
= "size_check4_map",
1056 .key_size
= sizeof(int),
1061 .btf_load_err
= true,
1062 .err_str
= "Member exceeds struct_size",
1065 /* typedef const void * const_void_ptr;
1071 .descr
= "void test #1",
1074 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1075 /* const void */ /* [2] */
1076 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1077 /* const void* */ /* [3] */
1078 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 2),
1079 /* typedef const void * const_void_ptr */
1080 BTF_TYPEDEF_ENC(NAME_TBD
, 3), /* [4] */
1081 /* struct A { */ /* [5] */
1082 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), sizeof(void *)),
1083 /* const_void_ptr m; */
1084 BTF_MEMBER_ENC(NAME_TBD
, 4, 0),
1088 .str_sec
= "\0const_void_ptr\0A\0m",
1089 .str_sec_size
= sizeof("\0const_void_ptr\0A\0m"),
1090 .map_type
= BPF_MAP_TYPE_ARRAY
,
1091 .map_name
= "void_test1_map",
1092 .key_size
= sizeof(int),
1093 .value_size
= sizeof(void *),
1104 .descr
= "void test #2",
1107 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1108 /* const void */ /* [2] */
1109 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1110 /* struct A { */ /* [3] */
1111 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 8),
1113 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
1117 .str_sec
= "\0A\0m",
1118 .str_sec_size
= sizeof("\0A\0m"),
1119 .map_type
= BPF_MAP_TYPE_ARRAY
,
1120 .map_name
= "void_test2_map",
1121 .key_size
= sizeof(int),
1122 .value_size
= sizeof(void *),
1126 .btf_load_err
= true,
1127 .err_str
= "Invalid member",
1130 /* typedef const void * const_void_ptr;
1134 .descr
= "void test #3",
1137 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1138 /* const void */ /* [2] */
1139 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1140 /* const void* */ /* [3] */
1141 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 2),
1142 /* typedef const void * const_void_ptr */
1143 BTF_TYPEDEF_ENC(NAME_TBD
, 3), /* [4] */
1144 /* const_void_ptr[4] */
1145 BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [5] */
1148 .str_sec
= "\0const_void_ptr",
1149 .str_sec_size
= sizeof("\0const_void_ptr"),
1150 .map_type
= BPF_MAP_TYPE_ARRAY
,
1151 .map_name
= "void_test3_map",
1152 .key_size
= sizeof(int),
1153 .value_size
= sizeof(void *) * 4,
1161 .descr
= "void test #4",
1164 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1165 /* const void */ /* [2] */
1166 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1167 /* const void[4] */ /* [3] */
1168 BTF_TYPE_ARRAY_ENC(2, 1, 4),
1171 .str_sec
= "\0A\0m",
1172 .str_sec_size
= sizeof("\0A\0m"),
1173 .map_type
= BPF_MAP_TYPE_ARRAY
,
1174 .map_name
= "void_test4_map",
1175 .key_size
= sizeof(int),
1176 .value_size
= sizeof(void *) * 4,
1180 .btf_load_err
= true,
1181 .err_str
= "Invalid elem",
1184 /* Array_A <------------------+
1185 * elem_type == Array_B |
1188 * Array_B <-------- + |
1189 * elem_type == Array A --+
1192 .descr
= "loop test #1",
1195 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1196 /* Array_A */ /* [2] */
1197 BTF_TYPE_ARRAY_ENC(3, 1, 8),
1198 /* Array_B */ /* [3] */
1199 BTF_TYPE_ARRAY_ENC(2, 1, 8),
1203 .str_sec_size
= sizeof(""),
1204 .map_type
= BPF_MAP_TYPE_ARRAY
,
1205 .map_name
= "loop_test1_map",
1206 .key_size
= sizeof(int),
1207 .value_size
= sizeof(sizeof(int) * 8),
1211 .btf_load_err
= true,
1212 .err_str
= "Loop detected",
1215 /* typedef is _before_ the BTF type of Array_A and Array_B
1217 * typedef Array_B int_array;
1219 * Array_A <------------------+
1220 * elem_type == int_array |
1223 * Array_B <-------- + |
1224 * elem_type == Array_A --+
1227 .descr
= "loop test #2",
1230 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1231 /* typedef Array_B int_array */
1232 BTF_TYPEDEF_ENC(1, 4), /* [2] */
1234 BTF_TYPE_ARRAY_ENC(2, 1, 8), /* [3] */
1236 BTF_TYPE_ARRAY_ENC(3, 1, 8), /* [4] */
1239 .str_sec
= "\0int_array\0",
1240 .str_sec_size
= sizeof("\0int_array"),
1241 .map_type
= BPF_MAP_TYPE_ARRAY
,
1242 .map_name
= "loop_test2_map",
1243 .key_size
= sizeof(int),
1244 .value_size
= sizeof(sizeof(int) * 8),
1248 .btf_load_err
= true,
1249 .err_str
= "Loop detected",
1252 /* Array_A <------------------+
1253 * elem_type == Array_B |
1256 * Array_B <-------- + |
1257 * elem_type == Array_A --+
1260 .descr
= "loop test #3",
1263 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1264 /* Array_A */ /* [2] */
1265 BTF_TYPE_ARRAY_ENC(3, 1, 8),
1266 /* Array_B */ /* [3] */
1267 BTF_TYPE_ARRAY_ENC(2, 1, 8),
1271 .str_sec_size
= sizeof(""),
1272 .map_type
= BPF_MAP_TYPE_ARRAY
,
1273 .map_name
= "loop_test3_map",
1274 .key_size
= sizeof(int),
1275 .value_size
= sizeof(sizeof(int) * 8),
1279 .btf_load_err
= true,
1280 .err_str
= "Loop detected",
1283 /* typedef is _between_ the BTF type of Array_A and Array_B
1285 * typedef Array_B int_array;
1287 * Array_A <------------------+
1288 * elem_type == int_array |
1291 * Array_B <-------- + |
1292 * elem_type == Array_A --+
1295 .descr
= "loop test #4",
1298 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1299 /* Array_A */ /* [2] */
1300 BTF_TYPE_ARRAY_ENC(3, 1, 8),
1301 /* typedef Array_B int_array */ /* [3] */
1302 BTF_TYPEDEF_ENC(NAME_TBD
, 4),
1303 /* Array_B */ /* [4] */
1304 BTF_TYPE_ARRAY_ENC(2, 1, 8),
1307 .str_sec
= "\0int_array\0",
1308 .str_sec_size
= sizeof("\0int_array"),
1309 .map_type
= BPF_MAP_TYPE_ARRAY
,
1310 .map_name
= "loop_test4_map",
1311 .key_size
= sizeof(int),
1312 .value_size
= sizeof(sizeof(int) * 8),
1316 .btf_load_err
= true,
1317 .err_str
= "Loop detected",
1320 /* typedef struct B Struct_B
1333 .descr
= "loop test #5",
1336 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1337 /* struct A */ /* [2] */
1338 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), 8),
1339 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int x; */
1340 BTF_MEMBER_ENC(NAME_TBD
, 3, 32),/* Struct_B y; */
1341 /* typedef struct B Struct_B */
1342 BTF_TYPEDEF_ENC(NAME_TBD
, 4), /* [3] */
1343 /* struct B */ /* [4] */
1344 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), 8),
1345 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int x; */
1346 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* struct A y; */
1349 .str_sec
= "\0A\0x\0y\0Struct_B\0B\0x\0y",
1350 .str_sec_size
= sizeof("\0A\0x\0y\0Struct_B\0B\0x\0y"),
1351 .map_type
= BPF_MAP_TYPE_ARRAY
,
1352 .map_name
= "loop_test5_map",
1353 .key_size
= sizeof(int),
1358 .btf_load_err
= true,
1359 .err_str
= "Loop detected",
1364 * struct A array_a[4];
1368 .descr
= "loop test #6",
1371 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1372 BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */
1373 /* struct A */ /* [3] */
1374 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 2), 8),
1375 BTF_MEMBER_ENC(NAME_TBD
, 1, 0), /* int x; */
1376 BTF_MEMBER_ENC(NAME_TBD
, 2, 32),/* struct A array_a[4]; */
1379 .str_sec
= "\0A\0x\0y",
1380 .str_sec_size
= sizeof("\0A\0x\0y"),
1381 .map_type
= BPF_MAP_TYPE_ARRAY
,
1382 .map_name
= "loop_test6_map",
1383 .key_size
= sizeof(int),
1388 .btf_load_err
= true,
1389 .err_str
= "Loop detected",
1393 .descr
= "loop test #7",
1396 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1397 /* struct A { */ /* [2] */
1398 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), sizeof(void *)),
1399 /* const void *m; */
1400 BTF_MEMBER_ENC(NAME_TBD
, 3, 0),
1401 /* CONST type_id=3 */ /* [3] */
1402 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 4),
1403 /* PTR type_id=2 */ /* [4] */
1404 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 3),
1407 .str_sec
= "\0A\0m",
1408 .str_sec_size
= sizeof("\0A\0m"),
1409 .map_type
= BPF_MAP_TYPE_ARRAY
,
1410 .map_name
= "loop_test7_map",
1411 .key_size
= sizeof(int),
1412 .value_size
= sizeof(void *),
1416 .btf_load_err
= true,
1417 .err_str
= "Loop detected",
1421 .descr
= "loop test #8",
1424 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1425 /* struct A { */ /* [2] */
1426 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), sizeof(void *)),
1427 /* const void *m; */
1428 BTF_MEMBER_ENC(NAME_TBD
, 4, 0),
1429 /* struct B { */ /* [3] */
1430 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), sizeof(void *)),
1431 /* const void *n; */
1432 BTF_MEMBER_ENC(NAME_TBD
, 6, 0),
1433 /* CONST type_id=5 */ /* [4] */
1434 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 5),
1435 /* PTR type_id=6 */ /* [5] */
1436 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 6),
1437 /* CONST type_id=7 */ /* [6] */
1438 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 7),
1439 /* PTR type_id=4 */ /* [7] */
1440 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 4),
1443 .str_sec
= "\0A\0m\0B\0n",
1444 .str_sec_size
= sizeof("\0A\0m\0B\0n"),
1445 .map_type
= BPF_MAP_TYPE_ARRAY
,
1446 .map_name
= "loop_test8_map",
1447 .key_size
= sizeof(int),
1448 .value_size
= sizeof(void *),
1452 .btf_load_err
= true,
1453 .err_str
= "Loop detected",
1457 .descr
= "string section does not end with null",
1460 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1464 .str_sec_size
= sizeof("\0int") - 1,
1465 .map_type
= BPF_MAP_TYPE_ARRAY
,
1466 .map_name
= "hdr_test_map",
1467 .key_size
= sizeof(int),
1468 .value_size
= sizeof(int),
1472 .btf_load_err
= true,
1473 .err_str
= "Invalid string section",
1477 .descr
= "empty string section",
1480 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1485 .map_type
= BPF_MAP_TYPE_ARRAY
,
1486 .map_name
= "hdr_test_map",
1487 .key_size
= sizeof(int),
1488 .value_size
= sizeof(int),
1492 .btf_load_err
= true,
1493 .err_str
= "Invalid string section",
1497 .descr
= "empty type section",
1502 .str_sec_size
= sizeof("\0int"),
1503 .map_type
= BPF_MAP_TYPE_ARRAY
,
1504 .map_name
= "hdr_test_map",
1505 .key_size
= sizeof(int),
1506 .value_size
= sizeof(int),
1510 .btf_load_err
= true,
1511 .err_str
= "No type found",
1515 .descr
= "btf_header test. Longer hdr_len",
1518 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1522 .str_sec_size
= sizeof("\0int"),
1523 .map_type
= BPF_MAP_TYPE_ARRAY
,
1524 .map_name
= "hdr_test_map",
1525 .key_size
= sizeof(int),
1526 .value_size
= sizeof(int),
1530 .btf_load_err
= true,
1532 .err_str
= "Unsupported btf_header",
1536 .descr
= "btf_header test. Gap between hdr and type",
1539 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1543 .str_sec_size
= sizeof("\0int"),
1544 .map_type
= BPF_MAP_TYPE_ARRAY
,
1545 .map_name
= "hdr_test_map",
1546 .key_size
= sizeof(int),
1547 .value_size
= sizeof(int),
1551 .btf_load_err
= true,
1552 .type_off_delta
= 4,
1553 .err_str
= "Unsupported section found",
1557 .descr
= "btf_header test. Gap between type and str",
1560 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1564 .str_sec_size
= sizeof("\0int"),
1565 .map_type
= BPF_MAP_TYPE_ARRAY
,
1566 .map_name
= "hdr_test_map",
1567 .key_size
= sizeof(int),
1568 .value_size
= sizeof(int),
1572 .btf_load_err
= true,
1574 .err_str
= "Unsupported section found",
1578 .descr
= "btf_header test. Overlap between type and str",
1581 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1585 .str_sec_size
= sizeof("\0int"),
1586 .map_type
= BPF_MAP_TYPE_ARRAY
,
1587 .map_name
= "hdr_test_map",
1588 .key_size
= sizeof(int),
1589 .value_size
= sizeof(int),
1593 .btf_load_err
= true,
1594 .str_off_delta
= -4,
1595 .err_str
= "Section overlap found",
1599 .descr
= "btf_header test. Larger BTF size",
1602 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1606 .str_sec_size
= sizeof("\0int"),
1607 .map_type
= BPF_MAP_TYPE_ARRAY
,
1608 .map_name
= "hdr_test_map",
1609 .key_size
= sizeof(int),
1610 .value_size
= sizeof(int),
1614 .btf_load_err
= true,
1615 .str_len_delta
= -4,
1616 .err_str
= "Unsupported section found",
1620 .descr
= "btf_header test. Smaller BTF size",
1623 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
1627 .str_sec_size
= sizeof("\0int"),
1628 .map_type
= BPF_MAP_TYPE_ARRAY
,
1629 .map_name
= "hdr_test_map",
1630 .key_size
= sizeof(int),
1631 .value_size
= sizeof(int),
1635 .btf_load_err
= true,
1637 .err_str
= "Total section length too long",
1641 .descr
= "array test. index_type/elem_type \"int\"",
1644 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1645 /* int[16] */ /* [2] */
1646 BTF_TYPE_ARRAY_ENC(1, 1, 16),
1650 .str_sec_size
= sizeof(""),
1651 .map_type
= BPF_MAP_TYPE_ARRAY
,
1652 .map_name
= "array_test_map",
1653 .key_size
= sizeof(int),
1654 .value_size
= sizeof(int),
1661 .descr
= "array test. index_type/elem_type \"const int\"",
1664 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1665 /* int[16] */ /* [2] */
1666 BTF_TYPE_ARRAY_ENC(3, 3, 16),
1667 /* CONST type_id=1 */ /* [3] */
1668 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 1),
1672 .str_sec_size
= sizeof(""),
1673 .map_type
= BPF_MAP_TYPE_ARRAY
,
1674 .map_name
= "array_test_map",
1675 .key_size
= sizeof(int),
1676 .value_size
= sizeof(int),
1683 .descr
= "array test. index_type \"const int:31\"",
1686 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1687 /* int:31 */ /* [2] */
1688 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 31, 4),
1689 /* int[16] */ /* [3] */
1690 BTF_TYPE_ARRAY_ENC(1, 4, 16),
1691 /* CONST type_id=2 */ /* [4] */
1692 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 2),
1696 .str_sec_size
= sizeof(""),
1697 .map_type
= BPF_MAP_TYPE_ARRAY
,
1698 .map_name
= "array_test_map",
1699 .key_size
= sizeof(int),
1700 .value_size
= sizeof(int),
1704 .btf_load_err
= true,
1705 .err_str
= "Invalid index",
1709 .descr
= "array test. elem_type \"const int:31\"",
1712 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1713 /* int:31 */ /* [2] */
1714 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 31, 4),
1715 /* int[16] */ /* [3] */
1716 BTF_TYPE_ARRAY_ENC(4, 1, 16),
1717 /* CONST type_id=2 */ /* [4] */
1718 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 2),
1722 .str_sec_size
= sizeof(""),
1723 .map_type
= BPF_MAP_TYPE_ARRAY
,
1724 .map_name
= "array_test_map",
1725 .key_size
= sizeof(int),
1726 .value_size
= sizeof(int),
1730 .btf_load_err
= true,
1731 .err_str
= "Invalid array of int",
1735 .descr
= "array test. index_type \"void\"",
1738 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1739 /* int[16] */ /* [2] */
1740 BTF_TYPE_ARRAY_ENC(1, 0, 16),
1744 .str_sec_size
= sizeof(""),
1745 .map_type
= BPF_MAP_TYPE_ARRAY
,
1746 .map_name
= "array_test_map",
1747 .key_size
= sizeof(int),
1748 .value_size
= sizeof(int),
1752 .btf_load_err
= true,
1753 .err_str
= "Invalid index",
1757 .descr
= "array test. index_type \"const void\"",
1760 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1761 /* int[16] */ /* [2] */
1762 BTF_TYPE_ARRAY_ENC(1, 3, 16),
1763 /* CONST type_id=0 (void) */ /* [3] */
1764 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1768 .str_sec_size
= sizeof(""),
1769 .map_type
= BPF_MAP_TYPE_ARRAY
,
1770 .map_name
= "array_test_map",
1771 .key_size
= sizeof(int),
1772 .value_size
= sizeof(int),
1776 .btf_load_err
= true,
1777 .err_str
= "Invalid index",
1781 .descr
= "array test. elem_type \"const void\"",
1784 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1785 /* int[16] */ /* [2] */
1786 BTF_TYPE_ARRAY_ENC(3, 1, 16),
1787 /* CONST type_id=0 (void) */ /* [3] */
1788 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 0),
1792 .str_sec_size
= sizeof(""),
1793 .map_type
= BPF_MAP_TYPE_ARRAY
,
1794 .map_name
= "array_test_map",
1795 .key_size
= sizeof(int),
1796 .value_size
= sizeof(int),
1800 .btf_load_err
= true,
1801 .err_str
= "Invalid elem",
1805 .descr
= "array test. elem_type \"const void *\"",
1808 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1809 /* const void *[16] */ /* [2] */
1810 BTF_TYPE_ARRAY_ENC(3, 1, 16),
1811 /* CONST type_id=4 */ /* [3] */
1812 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 4),
1813 /* void* */ /* [4] */
1814 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 0),
1818 .str_sec_size
= sizeof(""),
1819 .map_type
= BPF_MAP_TYPE_ARRAY
,
1820 .map_name
= "array_test_map",
1821 .key_size
= sizeof(int),
1822 .value_size
= sizeof(int),
1829 .descr
= "array test. index_type \"const void *\"",
1832 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1833 /* const void *[16] */ /* [2] */
1834 BTF_TYPE_ARRAY_ENC(3, 3, 16),
1835 /* CONST type_id=4 */ /* [3] */
1836 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 4),
1837 /* void* */ /* [4] */
1838 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 0),
1842 .str_sec_size
= sizeof(""),
1843 .map_type
= BPF_MAP_TYPE_ARRAY
,
1844 .map_name
= "array_test_map",
1845 .key_size
= sizeof(int),
1846 .value_size
= sizeof(int),
1850 .btf_load_err
= true,
1851 .err_str
= "Invalid index",
1855 .descr
= "array test. t->size != 0\"",
1858 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1859 /* int[16] */ /* [2] */
1860 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY
, 0, 0), 1),
1861 BTF_ARRAY_ENC(1, 1, 16),
1865 .str_sec_size
= sizeof(""),
1866 .map_type
= BPF_MAP_TYPE_ARRAY
,
1867 .map_name
= "array_test_map",
1868 .key_size
= sizeof(int),
1869 .value_size
= sizeof(int),
1873 .btf_load_err
= true,
1874 .err_str
= "size != 0",
1878 .descr
= "int test. invalid int_data",
1880 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT
, 0, 0), 4),
1885 .str_sec_size
= sizeof(""),
1886 .map_type
= BPF_MAP_TYPE_ARRAY
,
1887 .map_name
= "array_test_map",
1888 .key_size
= sizeof(int),
1889 .value_size
= sizeof(int),
1893 .btf_load_err
= true,
1894 .err_str
= "Invalid int_data",
1898 .descr
= "invalid BTF_INFO",
1901 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1902 BTF_TYPE_ENC(0, 0x10000000, 4),
1906 .str_sec_size
= sizeof(""),
1907 .map_type
= BPF_MAP_TYPE_ARRAY
,
1908 .map_name
= "array_test_map",
1909 .key_size
= sizeof(int),
1910 .value_size
= sizeof(int),
1914 .btf_load_err
= true,
1915 .err_str
= "Invalid btf_info",
1919 .descr
= "fwd test. t->type != 0\"",
1922 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
1923 /* fwd type */ /* [2] */
1924 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD
, 0, 0), 1),
1928 .str_sec_size
= sizeof(""),
1929 .map_type
= BPF_MAP_TYPE_ARRAY
,
1930 .map_name
= "fwd_test_map",
1931 .key_size
= sizeof(int),
1932 .value_size
= sizeof(int),
1936 .btf_load_err
= true,
1937 .err_str
= "type != 0",
1941 .descr
= "typedef (invalid name, name_off = 0)",
1943 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1944 BTF_TYPEDEF_ENC(0, 1), /* [2] */
1947 .str_sec
= "\0__int",
1948 .str_sec_size
= sizeof("\0__int"),
1949 .map_type
= BPF_MAP_TYPE_ARRAY
,
1950 .map_name
= "typedef_check_btf",
1951 .key_size
= sizeof(int),
1952 .value_size
= sizeof(int),
1956 .btf_load_err
= true,
1957 .err_str
= "Invalid name",
1961 .descr
= "typedef (invalid name, invalid identifier)",
1963 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1964 BTF_TYPEDEF_ENC(NAME_TBD
, 1), /* [2] */
1967 .str_sec
= "\0__!int",
1968 .str_sec_size
= sizeof("\0__!int"),
1969 .map_type
= BPF_MAP_TYPE_ARRAY
,
1970 .map_name
= "typedef_check_btf",
1971 .key_size
= sizeof(int),
1972 .value_size
= sizeof(int),
1976 .btf_load_err
= true,
1977 .err_str
= "Invalid name",
1981 .descr
= "ptr type (invalid name, name_off <> 0)",
1983 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
1984 BTF_TYPE_ENC(NAME_TBD
,
1985 BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 1), /* [2] */
1988 .str_sec
= "\0__int",
1989 .str_sec_size
= sizeof("\0__int"),
1990 .map_type
= BPF_MAP_TYPE_ARRAY
,
1991 .map_name
= "ptr_type_check_btf",
1992 .key_size
= sizeof(int),
1993 .value_size
= sizeof(int),
1997 .btf_load_err
= true,
1998 .err_str
= "Invalid name",
2002 .descr
= "volatile type (invalid name, name_off <> 0)",
2004 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2005 BTF_TYPE_ENC(NAME_TBD
,
2006 BTF_INFO_ENC(BTF_KIND_VOLATILE
, 0, 0), 1), /* [2] */
2009 .str_sec
= "\0__int",
2010 .str_sec_size
= sizeof("\0__int"),
2011 .map_type
= BPF_MAP_TYPE_ARRAY
,
2012 .map_name
= "volatile_type_check_btf",
2013 .key_size
= sizeof(int),
2014 .value_size
= sizeof(int),
2018 .btf_load_err
= true,
2019 .err_str
= "Invalid name",
2023 .descr
= "const type (invalid name, name_off <> 0)",
2025 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2026 BTF_TYPE_ENC(NAME_TBD
,
2027 BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 1), /* [2] */
2030 .str_sec
= "\0__int",
2031 .str_sec_size
= sizeof("\0__int"),
2032 .map_type
= BPF_MAP_TYPE_ARRAY
,
2033 .map_name
= "const_type_check_btf",
2034 .key_size
= sizeof(int),
2035 .value_size
= sizeof(int),
2039 .btf_load_err
= true,
2040 .err_str
= "Invalid name",
2044 .descr
= "restrict type (invalid name, name_off <> 0)",
2046 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2047 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 0, 0), 1), /* [2] */
2048 BTF_TYPE_ENC(NAME_TBD
,
2049 BTF_INFO_ENC(BTF_KIND_RESTRICT
, 0, 0), 2), /* [3] */
2052 .str_sec
= "\0__int",
2053 .str_sec_size
= sizeof("\0__int"),
2054 .map_type
= BPF_MAP_TYPE_ARRAY
,
2055 .map_name
= "restrict_type_check_btf",
2056 .key_size
= sizeof(int),
2057 .value_size
= sizeof(int),
2061 .btf_load_err
= true,
2062 .err_str
= "Invalid name",
2066 .descr
= "fwd type (invalid name, name_off = 0)",
2068 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2069 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD
, 0, 0), 0), /* [2] */
2072 .str_sec
= "\0__skb",
2073 .str_sec_size
= sizeof("\0__skb"),
2074 .map_type
= BPF_MAP_TYPE_ARRAY
,
2075 .map_name
= "fwd_type_check_btf",
2076 .key_size
= sizeof(int),
2077 .value_size
= sizeof(int),
2081 .btf_load_err
= true,
2082 .err_str
= "Invalid name",
2086 .descr
= "fwd type (invalid name, invalid identifier)",
2088 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2089 BTF_TYPE_ENC(NAME_TBD
,
2090 BTF_INFO_ENC(BTF_KIND_FWD
, 0, 0), 0), /* [2] */
2093 .str_sec
= "\0__!skb",
2094 .str_sec_size
= sizeof("\0__!skb"),
2095 .map_type
= BPF_MAP_TYPE_ARRAY
,
2096 .map_name
= "fwd_type_check_btf",
2097 .key_size
= sizeof(int),
2098 .value_size
= sizeof(int),
2102 .btf_load_err
= true,
2103 .err_str
= "Invalid name",
2107 .descr
= "array type (invalid name, name_off <> 0)",
2109 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2110 BTF_TYPE_ENC(NAME_TBD
,
2111 BTF_INFO_ENC(BTF_KIND_ARRAY
, 0, 0), 0), /* [2] */
2112 BTF_ARRAY_ENC(1, 1, 4),
2115 .str_sec
= "\0__skb",
2116 .str_sec_size
= sizeof("\0__skb"),
2117 .map_type
= BPF_MAP_TYPE_ARRAY
,
2118 .map_name
= "array_type_check_btf",
2119 .key_size
= sizeof(int),
2120 .value_size
= sizeof(int),
2124 .btf_load_err
= true,
2125 .err_str
= "Invalid name",
2129 .descr
= "struct type (name_off = 0)",
2131 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2133 BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 4), /* [2] */
2134 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
2138 .str_sec_size
= sizeof("\0A"),
2139 .map_type
= BPF_MAP_TYPE_ARRAY
,
2140 .map_name
= "struct_type_check_btf",
2141 .key_size
= sizeof(int),
2142 .value_size
= sizeof(int),
2149 .descr
= "struct type (invalid name, invalid identifier)",
2151 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2152 BTF_TYPE_ENC(NAME_TBD
,
2153 BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 4), /* [2] */
2154 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
2157 .str_sec
= "\0A!\0B",
2158 .str_sec_size
= sizeof("\0A!\0B"),
2159 .map_type
= BPF_MAP_TYPE_ARRAY
,
2160 .map_name
= "struct_type_check_btf",
2161 .key_size
= sizeof(int),
2162 .value_size
= sizeof(int),
2166 .btf_load_err
= true,
2167 .err_str
= "Invalid name",
2171 .descr
= "struct member (name_off = 0)",
2173 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2175 BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 4), /* [2] */
2176 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
2180 .str_sec_size
= sizeof("\0A"),
2181 .map_type
= BPF_MAP_TYPE_ARRAY
,
2182 .map_name
= "struct_type_check_btf",
2183 .key_size
= sizeof(int),
2184 .value_size
= sizeof(int),
2191 .descr
= "struct member (invalid name, invalid identifier)",
2193 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2194 BTF_TYPE_ENC(NAME_TBD
,
2195 BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 4), /* [2] */
2196 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
2199 .str_sec
= "\0A\0B*",
2200 .str_sec_size
= sizeof("\0A\0B*"),
2201 .map_type
= BPF_MAP_TYPE_ARRAY
,
2202 .map_name
= "struct_type_check_btf",
2203 .key_size
= sizeof(int),
2204 .value_size
= sizeof(int),
2208 .btf_load_err
= true,
2209 .err_str
= "Invalid name",
2213 .descr
= "enum type (name_off = 0)",
2215 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2217 BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1),
2218 sizeof(int)), /* [2] */
2219 BTF_ENUM_ENC(NAME_TBD
, 0),
2222 .str_sec
= "\0A\0B",
2223 .str_sec_size
= sizeof("\0A\0B"),
2224 .map_type
= BPF_MAP_TYPE_ARRAY
,
2225 .map_name
= "enum_type_check_btf",
2226 .key_size
= sizeof(int),
2227 .value_size
= sizeof(int),
2234 .descr
= "enum type (invalid name, invalid identifier)",
2236 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2237 BTF_TYPE_ENC(NAME_TBD
,
2238 BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1),
2239 sizeof(int)), /* [2] */
2240 BTF_ENUM_ENC(NAME_TBD
, 0),
2243 .str_sec
= "\0A!\0B",
2244 .str_sec_size
= sizeof("\0A!\0B"),
2245 .map_type
= BPF_MAP_TYPE_ARRAY
,
2246 .map_name
= "enum_type_check_btf",
2247 .key_size
= sizeof(int),
2248 .value_size
= sizeof(int),
2252 .btf_load_err
= true,
2253 .err_str
= "Invalid name",
2257 .descr
= "enum member (invalid name, name_off = 0)",
2259 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2261 BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1),
2262 sizeof(int)), /* [2] */
2267 .str_sec_size
= sizeof(""),
2268 .map_type
= BPF_MAP_TYPE_ARRAY
,
2269 .map_name
= "enum_type_check_btf",
2270 .key_size
= sizeof(int),
2271 .value_size
= sizeof(int),
2275 .btf_load_err
= true,
2276 .err_str
= "Invalid name",
2280 .descr
= "enum member (invalid name, invalid identifier)",
2282 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2284 BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1),
2285 sizeof(int)), /* [2] */
2286 BTF_ENUM_ENC(NAME_TBD
, 0),
2290 .str_sec_size
= sizeof("\0A!"),
2291 .map_type
= BPF_MAP_TYPE_ARRAY
,
2292 .map_name
= "enum_type_check_btf",
2293 .key_size
= sizeof(int),
2294 .value_size
= sizeof(int),
2298 .btf_load_err
= true,
2299 .err_str
= "Invalid name",
2302 .descr
= "arraymap invalid btf key (a bit field)",
2305 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
2306 /* 32 bit int with 32 bit offset */ /* [2] */
2307 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 32, 32, 8),
2311 .str_sec_size
= sizeof(""),
2312 .map_type
= BPF_MAP_TYPE_ARRAY
,
2313 .map_name
= "array_map_check_btf",
2314 .key_size
= sizeof(int),
2315 .value_size
= sizeof(int),
2319 .map_create_err
= true,
2323 .descr
= "arraymap invalid btf key (!= 32 bits)",
2326 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
2327 /* 16 bit int with 0 bit offset */ /* [2] */
2328 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 16, 2),
2332 .str_sec_size
= sizeof(""),
2333 .map_type
= BPF_MAP_TYPE_ARRAY
,
2334 .map_name
= "array_map_check_btf",
2335 .key_size
= sizeof(int),
2336 .value_size
= sizeof(int),
2340 .map_create_err
= true,
2344 .descr
= "arraymap invalid btf value (too small)",
2347 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
2351 .str_sec_size
= sizeof(""),
2352 .map_type
= BPF_MAP_TYPE_ARRAY
,
2353 .map_name
= "array_map_check_btf",
2354 .key_size
= sizeof(int),
2355 /* btf_value_size < map->value_size */
2356 .value_size
= sizeof(__u64
),
2360 .map_create_err
= true,
2364 .descr
= "arraymap invalid btf value (too big)",
2367 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
2371 .str_sec_size
= sizeof(""),
2372 .map_type
= BPF_MAP_TYPE_ARRAY
,
2373 .map_name
= "array_map_check_btf",
2374 .key_size
= sizeof(int),
2375 /* btf_value_size > map->value_size */
2376 .value_size
= sizeof(__u16
),
2380 .map_create_err
= true,
2384 .descr
= "func proto (int (*)(int, unsigned int))",
2386 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2387 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2388 /* int (*)(int, unsigned int) */
2389 BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
2390 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2391 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2395 .str_sec_size
= sizeof(""),
2396 .map_type
= BPF_MAP_TYPE_ARRAY
,
2397 .map_name
= "func_proto_type_check_btf",
2398 .key_size
= sizeof(int),
2399 .value_size
= sizeof(int),
2406 .descr
= "func proto (vararg)",
2408 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2409 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2410 /* void (*)(int, unsigned int, ...) */
2411 BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2412 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2413 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2414 BTF_FUNC_PROTO_ARG_ENC(0, 0),
2418 .str_sec_size
= sizeof(""),
2419 .map_type
= BPF_MAP_TYPE_ARRAY
,
2420 .map_name
= "func_proto_type_check_btf",
2421 .key_size
= sizeof(int),
2422 .value_size
= sizeof(int),
2429 .descr
= "func proto (vararg with name)",
2431 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2432 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2433 /* void (*)(int a, unsigned int b, ... c) */
2434 BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2435 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2436 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2437 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 0),
2440 .str_sec
= "\0a\0b\0c",
2441 .str_sec_size
= sizeof("\0a\0b\0c"),
2442 .map_type
= BPF_MAP_TYPE_ARRAY
,
2443 .map_name
= "func_proto_type_check_btf",
2444 .key_size
= sizeof(int),
2445 .value_size
= sizeof(int),
2449 .btf_load_err
= true,
2450 .err_str
= "Invalid arg#3",
2454 .descr
= "func proto (arg after vararg)",
2456 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2457 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2458 /* void (*)(int a, ..., unsigned int b) */
2459 BTF_FUNC_PROTO_ENC(0, 3), /* [3] */
2460 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2461 BTF_FUNC_PROTO_ARG_ENC(0, 0),
2462 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2465 .str_sec
= "\0a\0b",
2466 .str_sec_size
= sizeof("\0a\0b"),
2467 .map_type
= BPF_MAP_TYPE_ARRAY
,
2468 .map_name
= "func_proto_type_check_btf",
2469 .key_size
= sizeof(int),
2470 .value_size
= sizeof(int),
2474 .btf_load_err
= true,
2475 .err_str
= "Invalid arg#2",
2479 .descr
= "func proto (CONST=>TYPEDEF=>PTR=>FUNC_PROTO)",
2481 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2482 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2483 /* typedef void (*func_ptr)(int, unsigned int) */
2484 BTF_TYPEDEF_ENC(NAME_TBD
, 5), /* [3] */
2485 /* const func_ptr */
2486 BTF_CONST_ENC(3), /* [4] */
2487 BTF_PTR_ENC(6), /* [5] */
2488 BTF_FUNC_PROTO_ENC(0, 2), /* [6] */
2489 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2490 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2493 .str_sec
= "\0func_ptr",
2494 .str_sec_size
= sizeof("\0func_ptr"),
2495 .map_type
= BPF_MAP_TYPE_ARRAY
,
2496 .map_name
= "func_proto_type_check_btf",
2497 .key_size
= sizeof(int),
2498 .value_size
= sizeof(int),
2505 .descr
= "func proto (TYPEDEF=>FUNC_PROTO)",
2507 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2508 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2509 BTF_TYPEDEF_ENC(NAME_TBD
, 4), /* [3] */
2510 BTF_FUNC_PROTO_ENC(0, 2), /* [4] */
2511 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2512 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2515 .str_sec
= "\0func_typedef",
2516 .str_sec_size
= sizeof("\0func_typedef"),
2517 .map_type
= BPF_MAP_TYPE_ARRAY
,
2518 .map_name
= "func_proto_type_check_btf",
2519 .key_size
= sizeof(int),
2520 .value_size
= sizeof(int),
2527 .descr
= "func proto (btf_resolve(arg))",
2529 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2530 /* void (*)(const void *) */
2531 BTF_FUNC_PROTO_ENC(0, 1), /* [2] */
2532 BTF_FUNC_PROTO_ARG_ENC(0, 3),
2533 BTF_CONST_ENC(4), /* [3] */
2534 BTF_PTR_ENC(0), /* [4] */
2538 .str_sec_size
= sizeof(""),
2539 .map_type
= BPF_MAP_TYPE_ARRAY
,
2540 .map_name
= "func_proto_type_check_btf",
2541 .key_size
= sizeof(int),
2542 .value_size
= sizeof(int),
2549 .descr
= "func proto (Not all arg has name)",
2551 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2552 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2553 /* void (*)(int, unsigned int b) */
2554 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2555 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2556 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2560 .str_sec_size
= sizeof("\0b"),
2561 .map_type
= BPF_MAP_TYPE_ARRAY
,
2562 .map_name
= "func_proto_type_check_btf",
2563 .key_size
= sizeof(int),
2564 .value_size
= sizeof(int),
2571 .descr
= "func proto (Bad arg name_off)",
2573 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2574 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2575 /* void (*)(int a, unsigned int <bad_name_off>) */
2576 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2577 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2578 BTF_FUNC_PROTO_ARG_ENC(0x0fffffff, 2),
2582 .str_sec_size
= sizeof("\0a"),
2583 .map_type
= BPF_MAP_TYPE_ARRAY
,
2584 .map_name
= "func_proto_type_check_btf",
2585 .key_size
= sizeof(int),
2586 .value_size
= sizeof(int),
2590 .btf_load_err
= true,
2591 .err_str
= "Invalid arg#2",
2595 .descr
= "func proto (Bad arg name)",
2597 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2598 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2599 /* void (*)(int a, unsigned int !!!) */
2600 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2601 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2602 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2605 .str_sec
= "\0a\0!!!",
2606 .str_sec_size
= sizeof("\0a\0!!!"),
2607 .map_type
= BPF_MAP_TYPE_ARRAY
,
2608 .map_name
= "func_proto_type_check_btf",
2609 .key_size
= sizeof(int),
2610 .value_size
= sizeof(int),
2614 .btf_load_err
= true,
2615 .err_str
= "Invalid arg#2",
2619 .descr
= "func proto (Invalid return type)",
2621 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2622 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2623 /* <bad_ret_type> (*)(int, unsigned int) */
2624 BTF_FUNC_PROTO_ENC(100, 2), /* [3] */
2625 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2626 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2630 .str_sec_size
= sizeof(""),
2631 .map_type
= BPF_MAP_TYPE_ARRAY
,
2632 .map_name
= "func_proto_type_check_btf",
2633 .key_size
= sizeof(int),
2634 .value_size
= sizeof(int),
2638 .btf_load_err
= true,
2639 .err_str
= "Invalid return type",
2643 .descr
= "func proto (with func name)",
2645 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2646 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2647 /* void func_proto(int, unsigned int) */
2648 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO
, 0, 2), 0), /* [3] */
2649 BTF_FUNC_PROTO_ARG_ENC(0, 1),
2650 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2653 .str_sec
= "\0func_proto",
2654 .str_sec_size
= sizeof("\0func_proto"),
2655 .map_type
= BPF_MAP_TYPE_ARRAY
,
2656 .map_name
= "func_proto_type_check_btf",
2657 .key_size
= sizeof(int),
2658 .value_size
= sizeof(int),
2662 .btf_load_err
= true,
2663 .err_str
= "Invalid name",
2667 .descr
= "func proto (const void arg)",
2669 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2670 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2671 /* void (*)(const void) */
2672 BTF_FUNC_PROTO_ENC(0, 1), /* [3] */
2673 BTF_FUNC_PROTO_ARG_ENC(0, 4),
2674 BTF_CONST_ENC(0), /* [4] */
2678 .str_sec_size
= sizeof(""),
2679 .map_type
= BPF_MAP_TYPE_ARRAY
,
2680 .map_name
= "func_proto_type_check_btf",
2681 .key_size
= sizeof(int),
2682 .value_size
= sizeof(int),
2686 .btf_load_err
= true,
2687 .err_str
= "Invalid arg#1",
2691 .descr
= "func (void func(int a, unsigned int b))",
2693 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2694 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2695 /* void (*)(int a, unsigned int b) */
2696 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2697 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2698 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2699 /* void func(int a, unsigned int b) */
2700 BTF_FUNC_ENC(NAME_TBD
, 3), /* [4] */
2703 .str_sec
= "\0a\0b\0func",
2704 .str_sec_size
= sizeof("\0a\0b\0func"),
2705 .map_type
= BPF_MAP_TYPE_ARRAY
,
2706 .map_name
= "func_type_check_btf",
2707 .key_size
= sizeof(int),
2708 .value_size
= sizeof(int),
2715 .descr
= "func (No func name)",
2717 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2718 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2719 /* void (*)(int a, unsigned int b) */
2720 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2721 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2722 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2723 /* void <no_name>(int a, unsigned int b) */
2724 BTF_FUNC_ENC(0, 3), /* [4] */
2727 .str_sec
= "\0a\0b",
2728 .str_sec_size
= sizeof("\0a\0b"),
2729 .map_type
= BPF_MAP_TYPE_ARRAY
,
2730 .map_name
= "func_type_check_btf",
2731 .key_size
= sizeof(int),
2732 .value_size
= sizeof(int),
2736 .btf_load_err
= true,
2737 .err_str
= "Invalid name",
2741 .descr
= "func (Invalid func name)",
2743 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2744 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2745 /* void (*)(int a, unsigned int b) */
2746 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2747 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2748 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2749 /* void !!!(int a, unsigned int b) */
2750 BTF_FUNC_ENC(NAME_TBD
, 3), /* [4] */
2753 .str_sec
= "\0a\0b\0!!!",
2754 .str_sec_size
= sizeof("\0a\0b\0!!!"),
2755 .map_type
= BPF_MAP_TYPE_ARRAY
,
2756 .map_name
= "func_type_check_btf",
2757 .key_size
= sizeof(int),
2758 .value_size
= sizeof(int),
2762 .btf_load_err
= true,
2763 .err_str
= "Invalid name",
2767 .descr
= "func (Some arg has no name)",
2769 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2770 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2771 /* void (*)(int a, unsigned int) */
2772 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2773 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2774 BTF_FUNC_PROTO_ARG_ENC(0, 2),
2775 /* void func(int a, unsigned int) */
2776 BTF_FUNC_ENC(NAME_TBD
, 3), /* [4] */
2779 .str_sec
= "\0a\0func",
2780 .str_sec_size
= sizeof("\0a\0func"),
2781 .map_type
= BPF_MAP_TYPE_ARRAY
,
2782 .map_name
= "func_type_check_btf",
2783 .key_size
= sizeof(int),
2784 .value_size
= sizeof(int),
2788 .btf_load_err
= true,
2789 .err_str
= "Invalid arg#2",
2793 .descr
= "func (Non zero vlen)",
2795 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2796 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */
2797 /* void (*)(int a, unsigned int b) */
2798 BTF_FUNC_PROTO_ENC(0, 2), /* [3] */
2799 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
2800 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
2801 /* void func(int a, unsigned int b) */
2802 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_FUNC
, 0, 2), 3), /* [4] */
2805 .str_sec
= "\0a\0b\0func",
2806 .str_sec_size
= sizeof("\0a\0b\0func"),
2807 .map_type
= BPF_MAP_TYPE_ARRAY
,
2808 .map_name
= "func_type_check_btf",
2809 .key_size
= sizeof(int),
2810 .value_size
= sizeof(int),
2814 .btf_load_err
= true,
2815 .err_str
= "vlen != 0",
2819 .descr
= "func (Not referring to FUNC_PROTO)",
2821 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2822 BTF_FUNC_ENC(NAME_TBD
, 1), /* [2] */
2825 .str_sec
= "\0func",
2826 .str_sec_size
= sizeof("\0func"),
2827 .map_type
= BPF_MAP_TYPE_ARRAY
,
2828 .map_name
= "func_type_check_btf",
2829 .key_size
= sizeof(int),
2830 .value_size
= sizeof(int),
2834 .btf_load_err
= true,
2835 .err_str
= "Invalid type_id",
2839 .descr
= "invalid int kind_flag",
2841 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2842 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT
, 1, 0), 4), /* [2] */
2843 BTF_INT_ENC(0, 0, 32),
2847 .map_type
= BPF_MAP_TYPE_ARRAY
,
2848 .map_name
= "int_type_check_btf",
2849 .key_size
= sizeof(int),
2850 .value_size
= sizeof(int),
2854 .btf_load_err
= true,
2855 .err_str
= "Invalid btf_info kind_flag",
2859 .descr
= "invalid ptr kind_flag",
2861 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2862 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR
, 1, 0), 1), /* [2] */
2866 .map_type
= BPF_MAP_TYPE_ARRAY
,
2867 .map_name
= "ptr_type_check_btf",
2868 .key_size
= sizeof(int),
2869 .value_size
= sizeof(int),
2873 .btf_load_err
= true,
2874 .err_str
= "Invalid btf_info kind_flag",
2878 .descr
= "invalid array kind_flag",
2880 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2881 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY
, 1, 0), 0), /* [2] */
2882 BTF_ARRAY_ENC(1, 1, 1),
2886 .map_type
= BPF_MAP_TYPE_ARRAY
,
2887 .map_name
= "array_type_check_btf",
2888 .key_size
= sizeof(int),
2889 .value_size
= sizeof(int),
2893 .btf_load_err
= true,
2894 .err_str
= "Invalid btf_info kind_flag",
2898 .descr
= "invalid enum kind_flag",
2900 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2901 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 1, 1), 4), /* [2] */
2902 BTF_ENUM_ENC(NAME_TBD
, 0),
2906 .map_type
= BPF_MAP_TYPE_ARRAY
,
2907 .map_name
= "enum_type_check_btf",
2908 .key_size
= sizeof(int),
2909 .value_size
= sizeof(int),
2913 .btf_load_err
= true,
2914 .err_str
= "Invalid btf_info kind_flag",
2918 .descr
= "valid fwd kind_flag",
2920 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2921 BTF_TYPE_ENC(NAME_TBD
,
2922 BTF_INFO_ENC(BTF_KIND_FWD
, 1, 0), 0), /* [2] */
2926 .map_type
= BPF_MAP_TYPE_ARRAY
,
2927 .map_name
= "fwd_type_check_btf",
2928 .key_size
= sizeof(int),
2929 .value_size
= sizeof(int),
2936 .descr
= "invalid typedef kind_flag",
2938 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2939 BTF_TYPE_ENC(NAME_TBD
,
2940 BTF_INFO_ENC(BTF_KIND_TYPEDEF
, 1, 0), 1), /* [2] */
2944 .map_type
= BPF_MAP_TYPE_ARRAY
,
2945 .map_name
= "typedef_type_check_btf",
2946 .key_size
= sizeof(int),
2947 .value_size
= sizeof(int),
2951 .btf_load_err
= true,
2952 .err_str
= "Invalid btf_info kind_flag",
2956 .descr
= "invalid volatile kind_flag",
2958 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2959 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE
, 1, 0), 1), /* [2] */
2963 .map_type
= BPF_MAP_TYPE_ARRAY
,
2964 .map_name
= "volatile_type_check_btf",
2965 .key_size
= sizeof(int),
2966 .value_size
= sizeof(int),
2970 .btf_load_err
= true,
2971 .err_str
= "Invalid btf_info kind_flag",
2975 .descr
= "invalid const kind_flag",
2977 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2978 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 1, 0), 1), /* [2] */
2982 .map_type
= BPF_MAP_TYPE_ARRAY
,
2983 .map_name
= "const_type_check_btf",
2984 .key_size
= sizeof(int),
2985 .value_size
= sizeof(int),
2989 .btf_load_err
= true,
2990 .err_str
= "Invalid btf_info kind_flag",
2994 .descr
= "invalid restrict kind_flag",
2996 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
2997 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_RESTRICT
, 1, 0), 1), /* [2] */
3001 .map_type
= BPF_MAP_TYPE_ARRAY
,
3002 .map_name
= "restrict_type_check_btf",
3003 .key_size
= sizeof(int),
3004 .value_size
= sizeof(int),
3008 .btf_load_err
= true,
3009 .err_str
= "Invalid btf_info kind_flag",
3013 .descr
= "invalid func kind_flag",
3015 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3016 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO
, 0, 0), 0), /* [2] */
3017 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_FUNC
, 1, 0), 2), /* [3] */
3021 .map_type
= BPF_MAP_TYPE_ARRAY
,
3022 .map_name
= "func_type_check_btf",
3023 .key_size
= sizeof(int),
3024 .value_size
= sizeof(int),
3028 .btf_load_err
= true,
3029 .err_str
= "Invalid btf_info kind_flag",
3033 .descr
= "invalid func_proto kind_flag",
3035 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3036 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO
, 1, 0), 0), /* [2] */
3040 .map_type
= BPF_MAP_TYPE_ARRAY
,
3041 .map_name
= "func_proto_type_check_btf",
3042 .key_size
= sizeof(int),
3043 .value_size
= sizeof(int),
3047 .btf_load_err
= true,
3048 .err_str
= "Invalid btf_info kind_flag",
3052 .descr
= "valid struct, kind_flag, bitfield_size = 0",
3054 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3055 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 8), /* [2] */
3056 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(0, 0)),
3057 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(0, 32)),
3060 BTF_STR_SEC("\0A\0B"),
3061 .map_type
= BPF_MAP_TYPE_ARRAY
,
3062 .map_name
= "struct_type_check_btf",
3063 .key_size
= sizeof(int),
3064 .value_size
= sizeof(int),
3071 .descr
= "valid struct, kind_flag, int member, bitfield_size != 0",
3073 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3074 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4), /* [2] */
3075 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(4, 0)),
3076 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(4, 4)),
3079 BTF_STR_SEC("\0A\0B"),
3080 .map_type
= BPF_MAP_TYPE_ARRAY
,
3081 .map_name
= "struct_type_check_btf",
3082 .key_size
= sizeof(int),
3083 .value_size
= sizeof(int),
3090 .descr
= "valid union, kind_flag, int member, bitfield_size != 0",
3092 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3093 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 1, 2), 4), /* [2] */
3094 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(4, 0)),
3095 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(4, 0)),
3098 BTF_STR_SEC("\0A\0B"),
3099 .map_type
= BPF_MAP_TYPE_ARRAY
,
3100 .map_name
= "union_type_check_btf",
3101 .key_size
= sizeof(int),
3102 .value_size
= sizeof(int),
3109 .descr
= "valid struct, kind_flag, enum member, bitfield_size != 0",
3111 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3112 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4), /* [2] */
3113 BTF_ENUM_ENC(NAME_TBD
, 0),
3114 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4),/* [3] */
3115 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(4, 0)),
3116 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(4, 4)),
3119 BTF_STR_SEC("\0A\0B\0C"),
3120 .map_type
= BPF_MAP_TYPE_ARRAY
,
3121 .map_name
= "struct_type_check_btf",
3122 .key_size
= sizeof(int),
3123 .value_size
= sizeof(int),
3130 .descr
= "valid union, kind_flag, enum member, bitfield_size != 0",
3132 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3133 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4), /* [2] */
3134 BTF_ENUM_ENC(NAME_TBD
, 0),
3135 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 1, 2), 4), /* [3] */
3136 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(4, 0)),
3137 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(4, 0)),
3140 BTF_STR_SEC("\0A\0B\0C"),
3141 .map_type
= BPF_MAP_TYPE_ARRAY
,
3142 .map_name
= "union_type_check_btf",
3143 .key_size
= sizeof(int),
3144 .value_size
= sizeof(int),
3151 .descr
= "valid struct, kind_flag, typedef member, bitfield_size != 0",
3153 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3154 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4), /* [2] */
3155 BTF_ENUM_ENC(NAME_TBD
, 0),
3156 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4),/* [3] */
3157 BTF_MEMBER_ENC(NAME_TBD
, 4, BTF_MEMBER_OFFSET(4, 0)),
3158 BTF_MEMBER_ENC(NAME_TBD
, 5, BTF_MEMBER_OFFSET(4, 4)),
3159 BTF_TYPEDEF_ENC(NAME_TBD
, 1), /* [4] */
3160 BTF_TYPEDEF_ENC(NAME_TBD
, 2), /* [5] */
3163 BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3164 .map_type
= BPF_MAP_TYPE_ARRAY
,
3165 .map_name
= "struct_type_check_btf",
3166 .key_size
= sizeof(int),
3167 .value_size
= sizeof(int),
3174 .descr
= "valid union, kind_flag, typedef member, bitfield_size != 0",
3176 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3177 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4), /* [2] */
3178 BTF_ENUM_ENC(NAME_TBD
, 0),
3179 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 1, 2), 4), /* [3] */
3180 BTF_MEMBER_ENC(NAME_TBD
, 4, BTF_MEMBER_OFFSET(4, 0)),
3181 BTF_MEMBER_ENC(NAME_TBD
, 5, BTF_MEMBER_OFFSET(4, 0)),
3182 BTF_TYPEDEF_ENC(NAME_TBD
, 1), /* [4] */
3183 BTF_TYPEDEF_ENC(NAME_TBD
, 2), /* [5] */
3186 BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3187 .map_type
= BPF_MAP_TYPE_ARRAY
,
3188 .map_name
= "union_type_check_btf",
3189 .key_size
= sizeof(int),
3190 .value_size
= sizeof(int),
3197 .descr
= "invalid struct, kind_flag, bitfield_size greater than struct size",
3199 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3200 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4), /* [2] */
3201 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(20, 0)),
3202 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(20, 20)),
3205 BTF_STR_SEC("\0A\0B"),
3206 .map_type
= BPF_MAP_TYPE_ARRAY
,
3207 .map_name
= "struct_type_check_btf",
3208 .key_size
= sizeof(int),
3209 .value_size
= sizeof(int),
3213 .btf_load_err
= true,
3214 .err_str
= "Member exceeds struct_size",
3218 .descr
= "invalid struct, kind_flag, bitfield base_type int not regular",
3220 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3221 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 20, 4), /* [2] */
3222 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4), /* [3] */
3223 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(20, 0)),
3224 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(20, 20)),
3227 BTF_STR_SEC("\0A\0B"),
3228 .map_type
= BPF_MAP_TYPE_ARRAY
,
3229 .map_name
= "struct_type_check_btf",
3230 .key_size
= sizeof(int),
3231 .value_size
= sizeof(int),
3235 .btf_load_err
= true,
3236 .err_str
= "Invalid member base type",
3240 .descr
= "invalid struct, kind_flag, base_type int not regular",
3242 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3243 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 12, 4), /* [2] */
3244 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 4), /* [3] */
3245 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(8, 0)),
3246 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(8, 8)),
3249 BTF_STR_SEC("\0A\0B"),
3250 .map_type
= BPF_MAP_TYPE_ARRAY
,
3251 .map_name
= "struct_type_check_btf",
3252 .key_size
= sizeof(int),
3253 .value_size
= sizeof(int),
3257 .btf_load_err
= true,
3258 .err_str
= "Invalid member base type",
3262 .descr
= "invalid union, kind_flag, bitfield_size greater than struct size",
3264 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3265 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 1, 2), 2), /* [2] */
3266 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(8, 0)),
3267 BTF_MEMBER_ENC(NAME_TBD
, 1, BTF_MEMBER_OFFSET(20, 0)),
3270 BTF_STR_SEC("\0A\0B"),
3271 .map_type
= BPF_MAP_TYPE_ARRAY
,
3272 .map_name
= "union_type_check_btf",
3273 .key_size
= sizeof(int),
3274 .value_size
= sizeof(int),
3278 .btf_load_err
= true,
3279 .err_str
= "Member exceeds struct_size",
3283 .descr
= "invalid struct, kind_flag, int member, bitfield_size = 0, wrong byte alignment",
3285 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3286 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [2] */
3287 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 12), /* [3] */
3288 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 0)),
3289 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 36)),
3292 BTF_STR_SEC("\0A\0B"),
3293 .map_type
= BPF_MAP_TYPE_ARRAY
,
3294 .map_name
= "struct_type_check_btf",
3295 .key_size
= sizeof(int),
3296 .value_size
= sizeof(int),
3300 .btf_load_err
= true,
3301 .err_str
= "Invalid member offset",
3305 .descr
= "invalid struct, kind_flag, enum member, bitfield_size = 0, wrong byte alignment",
3307 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3308 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [2] */
3309 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4), /* [2] */
3310 BTF_ENUM_ENC(NAME_TBD
, 0),
3311 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 2), 12), /* [3] */
3312 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 0)),
3313 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 36)),
3316 BTF_STR_SEC("\0A\0B\0C"),
3317 .map_type
= BPF_MAP_TYPE_ARRAY
,
3318 .map_name
= "struct_type_check_btf",
3319 .key_size
= sizeof(int),
3320 .value_size
= sizeof(int),
3324 .btf_load_err
= true,
3325 .err_str
= "Invalid member offset",
3329 .descr
= "128-bit int",
3331 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3332 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 128, 16), /* [2] */
3336 .map_type
= BPF_MAP_TYPE_ARRAY
,
3337 .map_name
= "int_type_check_btf",
3338 .key_size
= sizeof(int),
3339 .value_size
= sizeof(int),
3346 .descr
= "struct, 128-bit int member",
3348 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3349 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 128, 16), /* [2] */
3350 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 16), /* [3] */
3351 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
3355 .map_type
= BPF_MAP_TYPE_ARRAY
,
3356 .map_name
= "struct_type_check_btf",
3357 .key_size
= sizeof(int),
3358 .value_size
= sizeof(int),
3365 .descr
= "struct, 120-bit int member bitfield",
3367 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3368 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 120, 16), /* [2] */
3369 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 1), 16), /* [3] */
3370 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
3374 .map_type
= BPF_MAP_TYPE_ARRAY
,
3375 .map_name
= "struct_type_check_btf",
3376 .key_size
= sizeof(int),
3377 .value_size
= sizeof(int),
3384 .descr
= "struct, kind_flag, 128-bit int member",
3386 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3387 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 128, 16), /* [2] */
3388 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 1), 16), /* [3] */
3389 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 0)),
3393 .map_type
= BPF_MAP_TYPE_ARRAY
,
3394 .map_name
= "struct_type_check_btf",
3395 .key_size
= sizeof(int),
3396 .value_size
= sizeof(int),
3403 .descr
= "struct, kind_flag, 120-bit int member bitfield",
3405 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
3406 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 128, 16), /* [2] */
3407 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 1), 16), /* [3] */
3408 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(120, 0)),
3412 .map_type
= BPF_MAP_TYPE_ARRAY
,
3413 .map_name
= "struct_type_check_btf",
3414 .key_size
= sizeof(int),
3415 .value_size
= sizeof(int),
3421 * typedef int arr_t[16];
3427 .descr
= "struct->ptr->typedef->array->int size resolution",
3429 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [1] */
3430 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
3431 BTF_PTR_ENC(3), /* [2] */
3432 BTF_TYPEDEF_ENC(NAME_TBD
, 4), /* [3] */
3433 BTF_TYPE_ARRAY_ENC(5, 5, 16), /* [4] */
3434 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [5] */
3437 BTF_STR_SEC("\0s\0a\0arr_t"),
3438 .map_type
= BPF_MAP_TYPE_ARRAY
,
3439 .map_name
= "ptr_mod_chain_size_resolve_map",
3440 .key_size
= sizeof(int),
3441 .value_size
= sizeof(int) * 16,
3442 .key_type_id
= 5 /* int */,
3443 .value_type_id
= 3 /* arr_t */,
3447 * typedef int arr_t[16][8][4];
3453 .descr
= "struct->ptr->typedef->multi-array->int size resolution",
3455 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [1] */
3456 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
3457 BTF_PTR_ENC(3), /* [2] */
3458 BTF_TYPEDEF_ENC(NAME_TBD
, 4), /* [3] */
3459 BTF_TYPE_ARRAY_ENC(5, 7, 16), /* [4] */
3460 BTF_TYPE_ARRAY_ENC(6, 7, 8), /* [5] */
3461 BTF_TYPE_ARRAY_ENC(7, 7, 4), /* [6] */
3462 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [7] */
3465 BTF_STR_SEC("\0s\0a\0arr_t"),
3466 .map_type
= BPF_MAP_TYPE_ARRAY
,
3467 .map_name
= "multi_arr_size_resolve_map",
3468 .key_size
= sizeof(int),
3469 .value_size
= sizeof(int) * 16 * 8 * 4,
3470 .key_type_id
= 7 /* int */,
3471 .value_type_id
= 3 /* arr_t */,
3475 * typedef int int_t;
3476 * typedef int_t arr3_t[4];
3477 * typedef arr3_t arr2_t[8];
3478 * typedef arr2_t arr1_t[16];
3484 .descr
= "typedef/multi-arr mix size resolution",
3486 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [1] */
3487 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
3488 BTF_PTR_ENC(3), /* [2] */
3489 BTF_TYPEDEF_ENC(NAME_TBD
, 4), /* [3] */
3490 BTF_TYPE_ARRAY_ENC(5, 10, 16), /* [4] */
3491 BTF_TYPEDEF_ENC(NAME_TBD
, 6), /* [5] */
3492 BTF_TYPE_ARRAY_ENC(7, 10, 8), /* [6] */
3493 BTF_TYPEDEF_ENC(NAME_TBD
, 8), /* [7] */
3494 BTF_TYPE_ARRAY_ENC(9, 10, 4), /* [8] */
3495 BTF_TYPEDEF_ENC(NAME_TBD
, 10), /* [9] */
3496 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [10] */
3499 BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"),
3500 .map_type
= BPF_MAP_TYPE_ARRAY
,
3501 .map_name
= "typedef_arra_mix_size_resolve_map",
3502 .key_size
= sizeof(int),
3503 .value_size
= sizeof(int) * 16 * 8 * 4,
3504 .key_type_id
= 10 /* int */,
3505 .value_type_id
= 3 /* arr_t */,
3509 }; /* struct btf_raw_test raw_tests[] */
3511 static const char *get_next_str(const char *start
, const char *end
)
3513 return start
< end
- 1 ? start
+ 1 : NULL
;
3516 static int get_raw_sec_size(const __u32
*raw_types
)
3520 for (i
= MAX_NR_RAW_U32
- 1;
3521 i
>= 0 && raw_types
[i
] != BTF_END_RAW
;
3525 return i
< 0 ? i
: i
* sizeof(raw_types
[0]);
3528 static void *btf_raw_create(const struct btf_header
*hdr
,
3529 const __u32
*raw_types
,
3531 unsigned int str_sec_size
,
3532 unsigned int *btf_size
,
3533 const char **ret_next_str
)
3535 const char *next_str
= str
, *end_str
= str
+ str_sec_size
;
3536 const char **strs_idx
= NULL
, **tmp_strs_idx
;
3537 int strs_cap
= 0, strs_cnt
= 0, next_str_idx
= 0;
3538 unsigned int size_needed
, offset
;
3539 struct btf_header
*ret_hdr
;
3540 int i
, type_sec_size
, err
= 0;
3541 uint32_t *ret_types
;
3542 void *raw_btf
= NULL
;
3544 type_sec_size
= get_raw_sec_size(raw_types
);
3545 if (CHECK(type_sec_size
< 0, "Cannot get nr_raw_types"))
3548 size_needed
= sizeof(*hdr
) + type_sec_size
+ str_sec_size
;
3549 raw_btf
= malloc(size_needed
);
3550 if (CHECK(!raw_btf
, "Cannot allocate memory for raw_btf"))
3554 memcpy(raw_btf
, hdr
, sizeof(*hdr
));
3555 offset
= sizeof(*hdr
);
3558 while ((next_str
= get_next_str(next_str
, end_str
))) {
3559 if (strs_cnt
== strs_cap
) {
3560 strs_cap
+= max(16, strs_cap
/ 2);
3561 tmp_strs_idx
= realloc(strs_idx
,
3562 sizeof(*strs_idx
) * strs_cap
);
3563 if (CHECK(!tmp_strs_idx
,
3564 "Cannot allocate memory for strs_idx")) {
3568 strs_idx
= tmp_strs_idx
;
3570 strs_idx
[strs_cnt
++] = next_str
;
3571 next_str
+= strlen(next_str
);
3574 /* Copy type section */
3575 ret_types
= raw_btf
+ offset
;
3576 for (i
= 0; i
< type_sec_size
/ sizeof(raw_types
[0]); i
++) {
3577 if (raw_types
[i
] == NAME_TBD
) {
3578 if (CHECK(next_str_idx
== strs_cnt
,
3579 "Error in getting next_str #%d",
3584 ret_types
[i
] = strs_idx
[next_str_idx
++] - str
;
3585 } else if (IS_NAME_NTH(raw_types
[i
])) {
3586 int idx
= GET_NAME_NTH_IDX(raw_types
[i
]);
3588 if (CHECK(idx
<= 0 || idx
> strs_cnt
,
3589 "Error getting string #%d, strs_cnt:%d",
3594 ret_types
[i
] = strs_idx
[idx
-1] - str
;
3596 ret_types
[i
] = raw_types
[i
];
3599 offset
+= type_sec_size
;
3601 /* Copy string section */
3602 memcpy(raw_btf
+ offset
, str
, str_sec_size
);
3604 ret_hdr
= (struct btf_header
*)raw_btf
;
3605 ret_hdr
->type_len
= type_sec_size
;
3606 ret_hdr
->str_off
= type_sec_size
;
3607 ret_hdr
->str_len
= str_sec_size
;
3609 *btf_size
= size_needed
;
3612 next_str_idx
< strs_cnt
? strs_idx
[next_str_idx
] : NULL
;
3625 static int do_test_raw(unsigned int test_num
)
3627 struct btf_raw_test
*test
= &raw_tests
[test_num
- 1];
3628 struct bpf_create_map_attr create_attr
= {};
3629 int map_fd
= -1, btf_fd
= -1;
3630 unsigned int raw_btf_size
;
3631 struct btf_header
*hdr
;
3635 fprintf(stderr
, "BTF raw test[%u] (%s): ", test_num
, test
->descr
);
3636 raw_btf
= btf_raw_create(&hdr_tmpl
,
3640 &raw_btf_size
, NULL
);
3647 hdr
->hdr_len
= (int)hdr
->hdr_len
+ test
->hdr_len_delta
;
3648 hdr
->type_off
= (int)hdr
->type_off
+ test
->type_off_delta
;
3649 hdr
->str_off
= (int)hdr
->str_off
+ test
->str_off_delta
;
3650 hdr
->str_len
= (int)hdr
->str_len
+ test
->str_len_delta
;
3652 *btf_log_buf
= '\0';
3653 btf_fd
= bpf_load_btf(raw_btf
, raw_btf_size
,
3654 btf_log_buf
, BTF_LOG_BUF_SIZE
,
3658 err
= ((btf_fd
== -1) != test
->btf_load_err
);
3659 if (CHECK(err
, "btf_fd:%d test->btf_load_err:%u",
3660 btf_fd
, test
->btf_load_err
) ||
3661 CHECK(test
->err_str
&& !strstr(btf_log_buf
, test
->err_str
),
3662 "expected err_str:%s", test
->err_str
)) {
3667 if (err
|| btf_fd
== -1)
3670 create_attr
.name
= test
->map_name
;
3671 create_attr
.map_type
= test
->map_type
;
3672 create_attr
.key_size
= test
->key_size
;
3673 create_attr
.value_size
= test
->value_size
;
3674 create_attr
.max_entries
= test
->max_entries
;
3675 create_attr
.btf_fd
= btf_fd
;
3676 create_attr
.btf_key_type_id
= test
->key_type_id
;
3677 create_attr
.btf_value_type_id
= test
->value_type_id
;
3679 map_fd
= bpf_create_map_xattr(&create_attr
);
3681 err
= ((map_fd
== -1) != test
->map_create_err
);
3682 CHECK(err
, "map_fd:%d test->map_create_err:%u",
3683 map_fd
, test
->map_create_err
);
3687 fprintf(stderr
, "OK");
3689 if (*btf_log_buf
&& (err
|| args
.always_log
))
3690 fprintf(stderr
, "\n%s", btf_log_buf
);
3700 static int test_raw(void)
3705 if (args
.raw_test_num
)
3706 return count_result(do_test_raw(args
.raw_test_num
));
3708 for (i
= 1; i
<= ARRAY_SIZE(raw_tests
); i
++)
3709 err
|= count_result(do_test_raw(i
));
3714 struct btf_get_info_test
{
3716 const char *str_sec
;
3717 __u32 raw_types
[MAX_NR_RAW_U32
];
3720 int (*special_test
)(unsigned int test_num
);
3723 static int test_big_btf_info(unsigned int test_num
);
3724 static int test_btf_id(unsigned int test_num
);
3726 const struct btf_get_info_test get_info_tests
[] = {
3728 .descr
= "== raw_btf_size+1",
3731 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
3735 .str_sec_size
= sizeof(""),
3736 .btf_size_delta
= 1,
3739 .descr
= "== raw_btf_size-3",
3742 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
3746 .str_sec_size
= sizeof(""),
3747 .btf_size_delta
= -3,
3750 .descr
= "Large bpf_btf_info",
3753 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
3757 .str_sec_size
= sizeof(""),
3758 .special_test
= test_big_btf_info
,
3764 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4),
3765 /* unsigned int */ /* [2] */
3766 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),
3770 .str_sec_size
= sizeof(""),
3771 .special_test
= test_btf_id
,
3775 static inline __u64
ptr_to_u64(const void *ptr
)
3777 return (__u64
)(unsigned long)ptr
;
3780 static int test_big_btf_info(unsigned int test_num
)
3782 const struct btf_get_info_test
*test
= &get_info_tests
[test_num
- 1];
3783 uint8_t *raw_btf
= NULL
, *user_btf
= NULL
;
3784 unsigned int raw_btf_size
;
3786 struct bpf_btf_info info
;
3789 struct bpf_btf_info
*info
;
3790 int btf_fd
= -1, err
;
3793 raw_btf
= btf_raw_create(&hdr_tmpl
,
3797 &raw_btf_size
, NULL
);
3802 *btf_log_buf
= '\0';
3804 user_btf
= malloc(raw_btf_size
);
3805 if (CHECK(!user_btf
, "!user_btf")) {
3810 btf_fd
= bpf_load_btf(raw_btf
, raw_btf_size
,
3811 btf_log_buf
, BTF_LOG_BUF_SIZE
,
3813 if (CHECK(btf_fd
== -1, "errno:%d", errno
)) {
3819 * GET_INFO should error out if the userspace info
3820 * has non zero tailing bytes.
3822 info
= &info_garbage
.info
;
3823 memset(info
, 0, sizeof(*info
));
3824 info_garbage
.garbage
= 0xdeadbeef;
3825 info_len
= sizeof(info_garbage
);
3826 info
->btf
= ptr_to_u64(user_btf
);
3827 info
->btf_size
= raw_btf_size
;
3829 err
= bpf_obj_get_info_by_fd(btf_fd
, info
, &info_len
);
3830 if (CHECK(!err
, "!err")) {
3836 * GET_INFO should succeed even info_len is larger than
3837 * the kernel supported as long as tailing bytes are zero.
3838 * The kernel supported info len should also be returned
3841 info_garbage
.garbage
= 0;
3842 err
= bpf_obj_get_info_by_fd(btf_fd
, info
, &info_len
);
3843 if (CHECK(err
|| info_len
!= sizeof(*info
),
3844 "err:%d errno:%d info_len:%u sizeof(*info):%lu",
3845 err
, errno
, info_len
, sizeof(*info
))) {
3850 fprintf(stderr
, "OK");
3853 if (*btf_log_buf
&& (err
|| args
.always_log
))
3854 fprintf(stderr
, "\n%s", btf_log_buf
);
3865 static int test_btf_id(unsigned int test_num
)
3867 const struct btf_get_info_test
*test
= &get_info_tests
[test_num
- 1];
3868 struct bpf_create_map_attr create_attr
= {};
3869 uint8_t *raw_btf
= NULL
, *user_btf
[2] = {};
3870 int btf_fd
[2] = {-1, -1}, map_fd
= -1;
3871 struct bpf_map_info map_info
= {};
3872 struct bpf_btf_info info
[2] = {};
3873 unsigned int raw_btf_size
;
3877 raw_btf
= btf_raw_create(&hdr_tmpl
,
3881 &raw_btf_size
, NULL
);
3886 *btf_log_buf
= '\0';
3888 for (i
= 0; i
< 2; i
++) {
3889 user_btf
[i
] = malloc(raw_btf_size
);
3890 if (CHECK(!user_btf
[i
], "!user_btf[%d]", i
)) {
3894 info
[i
].btf
= ptr_to_u64(user_btf
[i
]);
3895 info
[i
].btf_size
= raw_btf_size
;
3898 btf_fd
[0] = bpf_load_btf(raw_btf
, raw_btf_size
,
3899 btf_log_buf
, BTF_LOG_BUF_SIZE
,
3901 if (CHECK(btf_fd
[0] == -1, "errno:%d", errno
)) {
3906 /* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */
3907 info_len
= sizeof(info
[0]);
3908 err
= bpf_obj_get_info_by_fd(btf_fd
[0], &info
[0], &info_len
);
3909 if (CHECK(err
, "errno:%d", errno
)) {
3914 btf_fd
[1] = bpf_btf_get_fd_by_id(info
[0].id
);
3915 if (CHECK(btf_fd
[1] == -1, "errno:%d", errno
)) {
3921 err
= bpf_obj_get_info_by_fd(btf_fd
[1], &info
[1], &info_len
);
3922 if (CHECK(err
|| info
[0].id
!= info
[1].id
||
3923 info
[0].btf_size
!= info
[1].btf_size
||
3924 (ret
= memcmp(user_btf
[0], user_btf
[1], info
[0].btf_size
)),
3925 "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d",
3926 err
, errno
, info
[0].id
, info
[1].id
,
3927 info
[0].btf_size
, info
[1].btf_size
, ret
)) {
3932 /* Test btf members in struct bpf_map_info */
3933 create_attr
.name
= "test_btf_id";
3934 create_attr
.map_type
= BPF_MAP_TYPE_ARRAY
;
3935 create_attr
.key_size
= sizeof(int);
3936 create_attr
.value_size
= sizeof(unsigned int);
3937 create_attr
.max_entries
= 4;
3938 create_attr
.btf_fd
= btf_fd
[0];
3939 create_attr
.btf_key_type_id
= 1;
3940 create_attr
.btf_value_type_id
= 2;
3942 map_fd
= bpf_create_map_xattr(&create_attr
);
3943 if (CHECK(map_fd
== -1, "errno:%d", errno
)) {
3948 info_len
= sizeof(map_info
);
3949 err
= bpf_obj_get_info_by_fd(map_fd
, &map_info
, &info_len
);
3950 if (CHECK(err
|| map_info
.btf_id
!= info
[0].id
||
3951 map_info
.btf_key_type_id
!= 1 || map_info
.btf_value_type_id
!= 2,
3952 "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u",
3953 err
, errno
, info
[0].id
, map_info
.btf_id
, map_info
.btf_key_type_id
,
3954 map_info
.btf_value_type_id
)) {
3959 for (i
= 0; i
< 2; i
++) {
3964 /* Test BTF ID is removed from the kernel */
3965 btf_fd
[0] = bpf_btf_get_fd_by_id(map_info
.btf_id
);
3966 if (CHECK(btf_fd
[0] == -1, "errno:%d", errno
)) {
3973 /* The map holds the last ref to BTF and its btf_id */
3976 btf_fd
[0] = bpf_btf_get_fd_by_id(map_info
.btf_id
);
3977 if (CHECK(btf_fd
[0] != -1, "BTF lingers")) {
3982 fprintf(stderr
, "OK");
3985 if (*btf_log_buf
&& (err
|| args
.always_log
))
3986 fprintf(stderr
, "\n%s", btf_log_buf
);
3991 for (i
= 0; i
< 2; i
++) {
3993 if (btf_fd
[i
] != -1)
4000 static int do_test_get_info(unsigned int test_num
)
4002 const struct btf_get_info_test
*test
= &get_info_tests
[test_num
- 1];
4003 unsigned int raw_btf_size
, user_btf_size
, expected_nbytes
;
4004 uint8_t *raw_btf
= NULL
, *user_btf
= NULL
;
4005 struct bpf_btf_info info
= {};
4006 int btf_fd
= -1, err
, ret
;
4009 fprintf(stderr
, "BTF GET_INFO test[%u] (%s): ",
4010 test_num
, test
->descr
);
4012 if (test
->special_test
)
4013 return test
->special_test(test_num
);
4015 raw_btf
= btf_raw_create(&hdr_tmpl
,
4019 &raw_btf_size
, NULL
);
4024 *btf_log_buf
= '\0';
4026 user_btf
= malloc(raw_btf_size
);
4027 if (CHECK(!user_btf
, "!user_btf")) {
4032 btf_fd
= bpf_load_btf(raw_btf
, raw_btf_size
,
4033 btf_log_buf
, BTF_LOG_BUF_SIZE
,
4035 if (CHECK(btf_fd
== -1, "errno:%d", errno
)) {
4040 user_btf_size
= (int)raw_btf_size
+ test
->btf_size_delta
;
4041 expected_nbytes
= min(raw_btf_size
, user_btf_size
);
4042 if (raw_btf_size
> expected_nbytes
)
4043 memset(user_btf
+ expected_nbytes
, 0xff,
4044 raw_btf_size
- expected_nbytes
);
4046 info_len
= sizeof(info
);
4047 info
.btf
= ptr_to_u64(user_btf
);
4048 info
.btf_size
= user_btf_size
;
4051 err
= bpf_obj_get_info_by_fd(btf_fd
, &info
, &info_len
);
4052 if (CHECK(err
|| !info
.id
|| info_len
!= sizeof(info
) ||
4053 info
.btf_size
!= raw_btf_size
||
4054 (ret
= memcmp(raw_btf
, user_btf
, expected_nbytes
)),
4055 "err:%d errno:%d info.id:%u info_len:%u sizeof(info):%lu raw_btf_size:%u info.btf_size:%u expected_nbytes:%u memcmp:%d",
4056 err
, errno
, info
.id
, info_len
, sizeof(info
),
4057 raw_btf_size
, info
.btf_size
, expected_nbytes
, ret
)) {
4062 while (expected_nbytes
< raw_btf_size
) {
4063 fprintf(stderr
, "%u...", expected_nbytes
);
4064 if (CHECK(user_btf
[expected_nbytes
++] != 0xff,
4065 "user_btf[%u]:%x != 0xff", expected_nbytes
- 1,
4066 user_btf
[expected_nbytes
- 1])) {
4072 fprintf(stderr
, "OK");
4075 if (*btf_log_buf
&& (err
|| args
.always_log
))
4076 fprintf(stderr
, "\n%s", btf_log_buf
);
4087 static int test_get_info(void)
4092 if (args
.get_info_test_num
)
4093 return count_result(do_test_get_info(args
.get_info_test_num
));
4095 for (i
= 1; i
<= ARRAY_SIZE(get_info_tests
); i
++)
4096 err
|= count_result(do_test_get_info(i
));
4101 struct btf_file_test
{
4103 bool btf_kv_notfound
;
4106 static struct btf_file_test file_tests
[] = {
4107 { .file
= "test_btf_haskv.o", },
4108 { .file
= "test_btf_newkv.o", },
4109 { .file
= "test_btf_nokv.o", .btf_kv_notfound
= true, },
4112 static int do_test_file(unsigned int test_num
)
4114 const struct btf_file_test
*test
= &file_tests
[test_num
- 1];
4115 const char *expected_fnames
[] = {"_dummy_tracepoint",
4116 "test_long_fname_1",
4117 "test_long_fname_2"};
4118 struct btf_ext
*btf_ext
= NULL
;
4119 struct bpf_prog_info info
= {};
4120 struct bpf_object
*obj
= NULL
;
4121 struct bpf_func_info
*finfo
;
4122 struct bpf_program
*prog
;
4123 __u32 info_len
, rec_size
;
4124 bool has_btf_ext
= false;
4125 struct btf
*btf
= NULL
;
4126 void *func_info
= NULL
;
4127 struct bpf_map
*map
;
4128 int i
, err
, prog_fd
;
4130 fprintf(stderr
, "BTF libbpf test[%u] (%s): ", test_num
,
4133 btf
= btf__parse_elf(test
->file
, &btf_ext
);
4135 if (PTR_ERR(btf
) == -ENOENT
) {
4136 fprintf(stderr
, "SKIP. No ELF %s found", BTF_ELF_SEC
);
4140 return PTR_ERR(btf
);
4144 has_btf_ext
= btf_ext
!= NULL
;
4145 btf_ext__free(btf_ext
);
4147 obj
= bpf_object__open(test
->file
);
4148 if (CHECK(IS_ERR(obj
), "obj: %ld", PTR_ERR(obj
)))
4149 return PTR_ERR(obj
);
4151 prog
= bpf_program__next(NULL
, obj
);
4152 if (CHECK(!prog
, "Cannot find bpf_prog")) {
4157 bpf_program__set_type(prog
, BPF_PROG_TYPE_TRACEPOINT
);
4158 err
= bpf_object__load(obj
);
4159 if (CHECK(err
< 0, "bpf_object__load: %d", err
))
4161 prog_fd
= bpf_program__fd(prog
);
4163 map
= bpf_object__find_map_by_name(obj
, "btf_map");
4164 if (CHECK(!map
, "btf_map not found")) {
4169 err
= (bpf_map__btf_key_type_id(map
) == 0 || bpf_map__btf_value_type_id(map
) == 0)
4170 != test
->btf_kv_notfound
;
4171 if (CHECK(err
, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u",
4172 bpf_map__btf_key_type_id(map
), bpf_map__btf_value_type_id(map
),
4173 test
->btf_kv_notfound
))
4179 /* get necessary program info */
4180 info_len
= sizeof(struct bpf_prog_info
);
4181 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
4183 if (CHECK(err
== -1, "invalid get info (1st) errno:%d", errno
)) {
4184 fprintf(stderr
, "%s\n", btf_log_buf
);
4188 if (CHECK(info
.nr_func_info
!= 3,
4189 "incorrect info.nr_func_info (1st) %d",
4190 info
.nr_func_info
)) {
4194 rec_size
= info
.func_info_rec_size
;
4195 if (CHECK(rec_size
!= sizeof(struct bpf_func_info
),
4196 "incorrect info.func_info_rec_size (1st) %d\n", rec_size
)) {
4201 func_info
= malloc(info
.nr_func_info
* rec_size
);
4202 if (CHECK(!func_info
, "out of memory")) {
4207 /* reset info to only retrieve func_info related data */
4208 memset(&info
, 0, sizeof(info
));
4209 info
.nr_func_info
= 3;
4210 info
.func_info_rec_size
= rec_size
;
4211 info
.func_info
= ptr_to_u64(func_info
);
4213 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
4215 if (CHECK(err
== -1, "invalid get info (2nd) errno:%d", errno
)) {
4216 fprintf(stderr
, "%s\n", btf_log_buf
);
4220 if (CHECK(info
.nr_func_info
!= 3,
4221 "incorrect info.nr_func_info (2nd) %d",
4222 info
.nr_func_info
)) {
4226 if (CHECK(info
.func_info_rec_size
!= rec_size
,
4227 "incorrect info.func_info_rec_size (2nd) %d",
4228 info
.func_info_rec_size
)) {
4233 err
= btf__get_from_id(info
.btf_id
, &btf
);
4234 if (CHECK(err
, "cannot get btf from kernel, err: %d", err
))
4237 /* check three functions */
4239 for (i
= 0; i
< 3; i
++) {
4240 const struct btf_type
*t
;
4243 t
= btf__type_by_id(btf
, finfo
->type_id
);
4244 if (CHECK(!t
, "btf__type_by_id failure: id %u",
4250 fname
= btf__name_by_offset(btf
, t
->name_off
);
4251 err
= strcmp(fname
, expected_fnames
[i
]);
4252 /* for the second and third functions in .text section,
4253 * the compiler may order them either way.
4256 err
= strcmp(fname
, expected_fnames
[3 - i
]);
4257 if (CHECK(err
, "incorrect fname %s", fname
? : "")) {
4262 finfo
= (void *)finfo
+ rec_size
;
4266 fprintf(stderr
, "OK");
4270 bpf_object__close(obj
);
4274 static int test_file(void)
4279 if (args
.file_test_num
)
4280 return count_result(do_test_file(args
.file_test_num
));
4282 for (i
= 1; i
<= ARRAY_SIZE(file_tests
); i
++)
4283 err
|= count_result(do_test_file(i
));
4288 const char *pprint_enum_str
[] = {
4295 struct pprint_mapv
{
4300 uint32_t unused_bits2a
:2,
4315 uint8_t si8_4
[2][2];
4318 #ifdef __SIZEOF_INT128__
4319 struct pprint_mapv_int128
{
4322 unsigned __int128 bits3
:3;
4323 unsigned __int128 bits80
:80;
4324 unsigned __int128 ui128
;
4328 static struct btf_raw_test pprint_test_template
[] = {
4331 /* unsighed char */ /* [1] */
4332 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 8, 1),
4333 /* unsigned short */ /* [2] */
4334 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 16, 2),
4335 /* unsigned int */ /* [3] */
4336 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4),
4338 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
4339 /* unsigned long long */ /* [5] */
4340 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 64, 8),
4341 /* 2 bits */ /* [6] */
4342 BTF_TYPE_INT_ENC(0, 0, 0, 2, 2),
4343 /* 28 bits */ /* [7] */
4344 BTF_TYPE_INT_ENC(0, 0, 0, 28, 4),
4345 /* uint8_t[8] */ /* [8] */
4346 BTF_TYPE_ARRAY_ENC(9, 1, 8),
4347 /* typedef unsigned char uint8_t */ /* [9] */
4348 BTF_TYPEDEF_ENC(NAME_TBD
, 1),
4349 /* typedef unsigned short uint16_t */ /* [10] */
4350 BTF_TYPEDEF_ENC(NAME_TBD
, 2),
4351 /* typedef unsigned int uint32_t */ /* [11] */
4352 BTF_TYPEDEF_ENC(NAME_TBD
, 3),
4353 /* typedef int int32_t */ /* [12] */
4354 BTF_TYPEDEF_ENC(NAME_TBD
, 4),
4355 /* typedef unsigned long long uint64_t *//* [13] */
4356 BTF_TYPEDEF_ENC(NAME_TBD
, 5),
4357 /* union (anon) */ /* [14] */
4358 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 0, 2), 8),
4359 BTF_MEMBER_ENC(NAME_TBD
, 13, 0),/* uint64_t ui64; */
4360 BTF_MEMBER_ENC(NAME_TBD
, 8, 0), /* uint8_t ui8a[8]; */
4361 /* enum (anon) */ /* [15] */
4362 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 4), 4),
4363 BTF_ENUM_ENC(NAME_TBD
, 0),
4364 BTF_ENUM_ENC(NAME_TBD
, 1),
4365 BTF_ENUM_ENC(NAME_TBD
, 2),
4366 BTF_ENUM_ENC(NAME_TBD
, 3),
4367 /* struct pprint_mapv */ /* [16] */
4368 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 0, 11), 40),
4369 BTF_MEMBER_ENC(NAME_TBD
, 11, 0), /* uint32_t ui32 */
4370 BTF_MEMBER_ENC(NAME_TBD
, 10, 32), /* uint16_t ui16 */
4371 BTF_MEMBER_ENC(NAME_TBD
, 12, 64), /* int32_t si32 */
4372 BTF_MEMBER_ENC(NAME_TBD
, 6, 96), /* unused_bits2a */
4373 BTF_MEMBER_ENC(NAME_TBD
, 7, 98), /* bits28 */
4374 BTF_MEMBER_ENC(NAME_TBD
, 6, 126), /* unused_bits2b */
4375 BTF_MEMBER_ENC(0, 14, 128), /* union (anon) */
4376 BTF_MEMBER_ENC(NAME_TBD
, 15, 192), /* aenum */
4377 BTF_MEMBER_ENC(NAME_TBD
, 11, 224), /* uint32_t ui32b */
4378 BTF_MEMBER_ENC(NAME_TBD
, 6, 256), /* bits2c */
4379 BTF_MEMBER_ENC(NAME_TBD
, 17, 264), /* si8_4 */
4380 BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */
4381 BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */
4384 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"),
4385 .key_size
= sizeof(unsigned int),
4386 .value_size
= sizeof(struct pprint_mapv
),
4387 .key_type_id
= 3, /* unsigned int */
4388 .value_type_id
= 16, /* struct pprint_mapv */
4389 .max_entries
= 128 * 1024,
4393 /* this type will have the same type as the
4394 * first .raw_types definition, but struct type will
4395 * be encoded with kind_flag set.
4398 /* unsighed char */ /* [1] */
4399 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 8, 1),
4400 /* unsigned short */ /* [2] */
4401 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 16, 2),
4402 /* unsigned int */ /* [3] */
4403 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4),
4405 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
4406 /* unsigned long long */ /* [5] */
4407 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 64, 8),
4408 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */
4409 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */
4410 /* uint8_t[8] */ /* [8] */
4411 BTF_TYPE_ARRAY_ENC(9, 1, 8),
4412 /* typedef unsigned char uint8_t */ /* [9] */
4413 BTF_TYPEDEF_ENC(NAME_TBD
, 1),
4414 /* typedef unsigned short uint16_t */ /* [10] */
4415 BTF_TYPEDEF_ENC(NAME_TBD
, 2),
4416 /* typedef unsigned int uint32_t */ /* [11] */
4417 BTF_TYPEDEF_ENC(NAME_TBD
, 3),
4418 /* typedef int int32_t */ /* [12] */
4419 BTF_TYPEDEF_ENC(NAME_TBD
, 4),
4420 /* typedef unsigned long long uint64_t *//* [13] */
4421 BTF_TYPEDEF_ENC(NAME_TBD
, 5),
4422 /* union (anon) */ /* [14] */
4423 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 0, 2), 8),
4424 BTF_MEMBER_ENC(NAME_TBD
, 13, 0),/* uint64_t ui64; */
4425 BTF_MEMBER_ENC(NAME_TBD
, 8, 0), /* uint8_t ui8a[8]; */
4426 /* enum (anon) */ /* [15] */
4427 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 4), 4),
4428 BTF_ENUM_ENC(NAME_TBD
, 0),
4429 BTF_ENUM_ENC(NAME_TBD
, 1),
4430 BTF_ENUM_ENC(NAME_TBD
, 2),
4431 BTF_ENUM_ENC(NAME_TBD
, 3),
4432 /* struct pprint_mapv */ /* [16] */
4433 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 11), 40),
4434 BTF_MEMBER_ENC(NAME_TBD
, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
4435 BTF_MEMBER_ENC(NAME_TBD
, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
4436 BTF_MEMBER_ENC(NAME_TBD
, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
4437 BTF_MEMBER_ENC(NAME_TBD
, 6, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */
4438 BTF_MEMBER_ENC(NAME_TBD
, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */
4439 BTF_MEMBER_ENC(NAME_TBD
, 6, BTF_MEMBER_OFFSET(2, 126)), /* unused_bits2b */
4440 BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
4441 BTF_MEMBER_ENC(NAME_TBD
, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
4442 BTF_MEMBER_ENC(NAME_TBD
, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
4443 BTF_MEMBER_ENC(NAME_TBD
, 6, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
4444 BTF_MEMBER_ENC(NAME_TBD
, 17, 264), /* si8_4 */
4445 BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */
4446 BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */
4449 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"),
4450 .key_size
= sizeof(unsigned int),
4451 .value_size
= sizeof(struct pprint_mapv
),
4452 .key_type_id
= 3, /* unsigned int */
4453 .value_type_id
= 16, /* struct pprint_mapv */
4454 .max_entries
= 128 * 1024,
4458 /* this type will have the same layout as the
4459 * first .raw_types definition. The struct type will
4460 * be encoded with kind_flag set, bitfield members
4461 * are added typedef/const/volatile, and bitfield members
4462 * will have both int and enum types.
4465 /* unsighed char */ /* [1] */
4466 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 8, 1),
4467 /* unsigned short */ /* [2] */
4468 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 16, 2),
4469 /* unsigned int */ /* [3] */
4470 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4),
4472 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4),
4473 /* unsigned long long */ /* [5] */
4474 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 64, 8),
4475 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */
4476 BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */
4477 /* uint8_t[8] */ /* [8] */
4478 BTF_TYPE_ARRAY_ENC(9, 1, 8),
4479 /* typedef unsigned char uint8_t */ /* [9] */
4480 BTF_TYPEDEF_ENC(NAME_TBD
, 1),
4481 /* typedef unsigned short uint16_t */ /* [10] */
4482 BTF_TYPEDEF_ENC(NAME_TBD
, 2),
4483 /* typedef unsigned int uint32_t */ /* [11] */
4484 BTF_TYPEDEF_ENC(NAME_TBD
, 3),
4485 /* typedef int int32_t */ /* [12] */
4486 BTF_TYPEDEF_ENC(NAME_TBD
, 4),
4487 /* typedef unsigned long long uint64_t *//* [13] */
4488 BTF_TYPEDEF_ENC(NAME_TBD
, 5),
4489 /* union (anon) */ /* [14] */
4490 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION
, 0, 2), 8),
4491 BTF_MEMBER_ENC(NAME_TBD
, 13, 0),/* uint64_t ui64; */
4492 BTF_MEMBER_ENC(NAME_TBD
, 8, 0), /* uint8_t ui8a[8]; */
4493 /* enum (anon) */ /* [15] */
4494 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 4), 4),
4495 BTF_ENUM_ENC(NAME_TBD
, 0),
4496 BTF_ENUM_ENC(NAME_TBD
, 1),
4497 BTF_ENUM_ENC(NAME_TBD
, 2),
4498 BTF_ENUM_ENC(NAME_TBD
, 3),
4499 /* struct pprint_mapv */ /* [16] */
4500 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 11), 40),
4501 BTF_MEMBER_ENC(NAME_TBD
, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
4502 BTF_MEMBER_ENC(NAME_TBD
, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
4503 BTF_MEMBER_ENC(NAME_TBD
, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
4504 BTF_MEMBER_ENC(NAME_TBD
, 17, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */
4505 BTF_MEMBER_ENC(NAME_TBD
, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */
4506 BTF_MEMBER_ENC(NAME_TBD
, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */
4507 BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
4508 BTF_MEMBER_ENC(NAME_TBD
, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
4509 BTF_MEMBER_ENC(NAME_TBD
, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
4510 BTF_MEMBER_ENC(NAME_TBD
, 17, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
4511 BTF_MEMBER_ENC(NAME_TBD
, 20, BTF_MEMBER_OFFSET(0, 264)), /* si8_4 */
4512 /* typedef unsigned int ___int */ /* [17] */
4513 BTF_TYPEDEF_ENC(NAME_TBD
, 18),
4514 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE
, 0, 0), 6), /* [18] */
4515 BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST
, 0, 0), 15), /* [19] */
4516 BTF_TYPE_ARRAY_ENC(21, 1, 2), /* [20] */
4517 BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [21] */
4520 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"),
4521 .key_size
= sizeof(unsigned int),
4522 .value_size
= sizeof(struct pprint_mapv
),
4523 .key_type_id
= 3, /* unsigned int */
4524 .value_type_id
= 16, /* struct pprint_mapv */
4525 .max_entries
= 128 * 1024,
4528 #ifdef __SIZEOF_INT128__
4532 /* unsigned int */ /* [1] */
4533 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4),
4534 /* __int128 */ /* [2] */
4535 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 128, 16),
4536 /* unsigned __int128 */ /* [3] */
4537 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 128, 16),
4538 /* struct pprint_mapv_int128 */ /* [4] */
4539 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_STRUCT
, 1, 5), 64),
4540 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 0)), /* si128a */
4541 BTF_MEMBER_ENC(NAME_TBD
, 2, BTF_MEMBER_OFFSET(0, 128)), /* si128b */
4542 BTF_MEMBER_ENC(NAME_TBD
, 3, BTF_MEMBER_OFFSET(3, 256)), /* bits3 */
4543 BTF_MEMBER_ENC(NAME_TBD
, 3, BTF_MEMBER_OFFSET(80, 259)), /* bits80 */
4544 BTF_MEMBER_ENC(NAME_TBD
, 3, BTF_MEMBER_OFFSET(0, 384)), /* ui128 */
4547 BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"),
4548 .key_size
= sizeof(unsigned int),
4549 .value_size
= sizeof(struct pprint_mapv_int128
),
4552 .max_entries
= 128 * 1024,
4553 .mapv_kind
= PPRINT_MAPV_KIND_INT128
,
4559 static struct btf_pprint_test_meta
{
4561 enum bpf_map_type map_type
;
4562 const char *map_name
;
4566 } pprint_tests_meta
[] = {
4568 .descr
= "BTF pretty print array",
4569 .map_type
= BPF_MAP_TYPE_ARRAY
,
4570 .map_name
= "pprint_test_array",
4571 .ordered_map
= true,
4572 .lossless_map
= true,
4573 .percpu_map
= false,
4577 .descr
= "BTF pretty print hash",
4578 .map_type
= BPF_MAP_TYPE_HASH
,
4579 .map_name
= "pprint_test_hash",
4580 .ordered_map
= false,
4581 .lossless_map
= true,
4582 .percpu_map
= false,
4586 .descr
= "BTF pretty print lru hash",
4587 .map_type
= BPF_MAP_TYPE_LRU_HASH
,
4588 .map_name
= "pprint_test_lru_hash",
4589 .ordered_map
= false,
4590 .lossless_map
= false,
4591 .percpu_map
= false,
4595 .descr
= "BTF pretty print percpu array",
4596 .map_type
= BPF_MAP_TYPE_PERCPU_ARRAY
,
4597 .map_name
= "pprint_test_percpu_array",
4598 .ordered_map
= true,
4599 .lossless_map
= true,
4604 .descr
= "BTF pretty print percpu hash",
4605 .map_type
= BPF_MAP_TYPE_PERCPU_HASH
,
4606 .map_name
= "pprint_test_percpu_hash",
4607 .ordered_map
= false,
4608 .lossless_map
= true,
4613 .descr
= "BTF pretty print lru percpu hash",
4614 .map_type
= BPF_MAP_TYPE_LRU_PERCPU_HASH
,
4615 .map_name
= "pprint_test_lru_percpu_hash",
4616 .ordered_map
= false,
4617 .lossless_map
= false,
4623 static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind
)
4625 if (mapv_kind
== PPRINT_MAPV_KIND_BASIC
)
4626 return sizeof(struct pprint_mapv
);
4628 #ifdef __SIZEOF_INT128__
4629 if (mapv_kind
== PPRINT_MAPV_KIND_INT128
)
4630 return sizeof(struct pprint_mapv_int128
);
4636 static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind
,
4637 void *mapv
, uint32_t i
,
4638 int num_cpus
, int rounded_value_size
)
4642 if (mapv_kind
== PPRINT_MAPV_KIND_BASIC
) {
4643 struct pprint_mapv
*v
= mapv
;
4645 for (cpu
= 0; cpu
< num_cpus
; cpu
++) {
4648 v
->unused_bits2a
= 3;
4650 v
->unused_bits2b
= 3;
4652 v
->aenum
= i
& 0x03;
4655 v
->si8_4
[0][0] = (cpu
+ i
) & 0xff;
4656 v
->si8_4
[0][1] = (cpu
+ i
+ 1) & 0xff;
4657 v
->si8_4
[1][0] = (cpu
+ i
+ 2) & 0xff;
4658 v
->si8_4
[1][1] = (cpu
+ i
+ 3) & 0xff;
4659 v
= (void *)v
+ rounded_value_size
;
4663 #ifdef __SIZEOF_INT128__
4664 if (mapv_kind
== PPRINT_MAPV_KIND_INT128
) {
4665 struct pprint_mapv_int128
*v
= mapv
;
4667 for (cpu
= 0; cpu
< num_cpus
; cpu
++) {
4670 v
->bits3
= i
& 0x07;
4671 v
->bits80
= (((unsigned __int128
)1) << 64) + i
;
4672 v
->ui128
= (((unsigned __int128
)2) << 64) + i
;
4673 v
= (void *)v
+ rounded_value_size
;
4679 ssize_t
get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind
,
4680 char *expected_line
, ssize_t line_size
,
4681 bool percpu_map
, unsigned int next_key
,
4682 int cpu
, void *mapv
)
4684 ssize_t nexpected_line
= -1;
4686 if (mapv_kind
== PPRINT_MAPV_KIND_BASIC
) {
4687 struct pprint_mapv
*v
= mapv
;
4689 nexpected_line
= snprintf(expected_line
, line_size
,
4690 "%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
4691 "{%lu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
4692 "%u,0x%x,[[%d,%d],[%d,%d]]}\n",
4693 percpu_map
? "\tcpu" : "",
4694 percpu_map
? cpu
: next_key
,
4700 v
->ui8a
[0], v
->ui8a
[1],
4701 v
->ui8a
[2], v
->ui8a
[3],
4702 v
->ui8a
[4], v
->ui8a
[5],
4703 v
->ui8a
[6], v
->ui8a
[7],
4704 pprint_enum_str
[v
->aenum
],
4707 v
->si8_4
[0][0], v
->si8_4
[0][1],
4708 v
->si8_4
[1][0], v
->si8_4
[1][1]);
4711 #ifdef __SIZEOF_INT128__
4712 if (mapv_kind
== PPRINT_MAPV_KIND_INT128
) {
4713 struct pprint_mapv_int128
*v
= mapv
;
4715 nexpected_line
= snprintf(expected_line
, line_size
,
4716 "%s%u: {0x%lx,0x%lx,0x%lx,"
4717 "0x%lx%016lx,0x%lx%016lx}\n",
4718 percpu_map
? "\tcpu" : "",
4719 percpu_map
? cpu
: next_key
,
4720 (uint64_t)v
->si128a
,
4721 (uint64_t)v
->si128b
,
4723 (uint64_t)(v
->bits80
>> 64),
4724 (uint64_t)v
->bits80
,
4725 (uint64_t)(v
->ui128
>> 64),
4726 (uint64_t)v
->ui128
);
4730 return nexpected_line
;
4733 static int check_line(const char *expected_line
, int nexpected_line
,
4734 int expected_line_len
, const char *line
)
4736 if (CHECK(nexpected_line
== expected_line_len
,
4737 "expected_line is too long"))
4740 if (strcmp(expected_line
, line
)) {
4741 fprintf(stderr
, "unexpected pprint output\n");
4742 fprintf(stderr
, "expected: %s", expected_line
);
4743 fprintf(stderr
, " read: %s", line
);
4751 static int do_test_pprint(int test_num
)
4753 const struct btf_raw_test
*test
= &pprint_test_template
[test_num
];
4754 enum pprint_mapv_kind_t mapv_kind
= test
->mapv_kind
;
4755 struct bpf_create_map_attr create_attr
= {};
4756 bool ordered_map
, lossless_map
, percpu_map
;
4757 int err
, ret
, num_cpus
, rounded_value_size
;
4758 unsigned int key
, nr_read_elems
;
4759 int map_fd
= -1, btf_fd
= -1;
4760 unsigned int raw_btf_size
;
4761 char expected_line
[255];
4762 FILE *pin_file
= NULL
;
4764 size_t line_len
= 0;
4770 fprintf(stderr
, "%s(#%d)......", test
->descr
, test_num
);
4771 raw_btf
= btf_raw_create(&hdr_tmpl
, test
->raw_types
,
4772 test
->str_sec
, test
->str_sec_size
,
4773 &raw_btf_size
, NULL
);
4778 *btf_log_buf
= '\0';
4779 btf_fd
= bpf_load_btf(raw_btf
, raw_btf_size
,
4780 btf_log_buf
, BTF_LOG_BUF_SIZE
,
4784 if (CHECK(btf_fd
== -1, "errno:%d", errno
)) {
4789 create_attr
.name
= test
->map_name
;
4790 create_attr
.map_type
= test
->map_type
;
4791 create_attr
.key_size
= test
->key_size
;
4792 create_attr
.value_size
= test
->value_size
;
4793 create_attr
.max_entries
= test
->max_entries
;
4794 create_attr
.btf_fd
= btf_fd
;
4795 create_attr
.btf_key_type_id
= test
->key_type_id
;
4796 create_attr
.btf_value_type_id
= test
->value_type_id
;
4798 map_fd
= bpf_create_map_xattr(&create_attr
);
4799 if (CHECK(map_fd
== -1, "errno:%d", errno
)) {
4804 ret
= snprintf(pin_path
, sizeof(pin_path
), "%s/%s",
4805 "/sys/fs/bpf", test
->map_name
);
4807 if (CHECK(ret
== sizeof(pin_path
), "pin_path %s/%s is too long",
4808 "/sys/fs/bpf", test
->map_name
)) {
4813 err
= bpf_obj_pin(map_fd
, pin_path
);
4814 if (CHECK(err
, "bpf_obj_pin(%s): errno:%d.", pin_path
, errno
))
4817 percpu_map
= test
->percpu_map
;
4818 num_cpus
= percpu_map
? bpf_num_possible_cpus() : 1;
4819 rounded_value_size
= round_up(get_pprint_mapv_size(mapv_kind
), 8);
4820 mapv
= calloc(num_cpus
, rounded_value_size
);
4821 if (CHECK(!mapv
, "mapv allocation failure")) {
4826 for (key
= 0; key
< test
->max_entries
; key
++) {
4827 set_pprint_mapv(mapv_kind
, mapv
, key
, num_cpus
, rounded_value_size
);
4828 bpf_map_update_elem(map_fd
, &key
, mapv
, 0);
4831 pin_file
= fopen(pin_path
, "r");
4832 if (CHECK(!pin_file
, "fopen(%s): errno:%d", pin_path
, errno
)) {
4837 /* Skip lines start with '#' */
4838 while ((nread
= getline(&line
, &line_len
, pin_file
)) > 0 &&
4842 if (CHECK(nread
<= 0, "Unexpected EOF")) {
4848 ordered_map
= test
->ordered_map
;
4849 lossless_map
= test
->lossless_map
;
4851 ssize_t nexpected_line
;
4852 unsigned int next_key
;
4856 next_key
= ordered_map
? nr_read_elems
: atoi(line
);
4857 set_pprint_mapv(mapv_kind
, mapv
, next_key
, num_cpus
, rounded_value_size
);
4860 for (cpu
= 0; cpu
< num_cpus
; cpu
++) {
4862 /* for percpu map, the format looks like:
4864 * cpu0: <value_on_cpu0>
4865 * cpu1: <value_on_cpu1>
4867 * cpun: <value_on_cpun>
4870 * let us verify the line containing the key here.
4873 nexpected_line
= snprintf(expected_line
,
4874 sizeof(expected_line
),
4878 err
= check_line(expected_line
, nexpected_line
,
4879 sizeof(expected_line
), line
);
4884 /* read value@cpu */
4885 nread
= getline(&line
, &line_len
, pin_file
);
4890 nexpected_line
= get_pprint_expected_line(mapv_kind
, expected_line
,
4891 sizeof(expected_line
),
4892 percpu_map
, next_key
,
4894 err
= check_line(expected_line
, nexpected_line
,
4895 sizeof(expected_line
), line
);
4899 cmapv
= cmapv
+ rounded_value_size
;
4903 /* skip the last bracket for the percpu map */
4904 nread
= getline(&line
, &line_len
, pin_file
);
4909 nread
= getline(&line
, &line_len
, pin_file
);
4910 } while (++nr_read_elems
< test
->max_entries
&& nread
> 0);
4913 CHECK(nr_read_elems
< test
->max_entries
,
4914 "Unexpected EOF. nr_read_elems:%u test->max_entries:%u",
4915 nr_read_elems
, test
->max_entries
)) {
4920 if (CHECK(nread
> 0, "Unexpected extra pprint output: %s", line
)) {
4931 fprintf(stderr
, "OK");
4932 if (*btf_log_buf
&& (err
|| args
.always_log
))
4933 fprintf(stderr
, "\n%s", btf_log_buf
);
4946 static int test_pprint(void)
4951 /* test various maps with the first test template */
4952 for (i
= 0; i
< ARRAY_SIZE(pprint_tests_meta
); i
++) {
4953 pprint_test_template
[0].descr
= pprint_tests_meta
[i
].descr
;
4954 pprint_test_template
[0].map_type
= pprint_tests_meta
[i
].map_type
;
4955 pprint_test_template
[0].map_name
= pprint_tests_meta
[i
].map_name
;
4956 pprint_test_template
[0].ordered_map
= pprint_tests_meta
[i
].ordered_map
;
4957 pprint_test_template
[0].lossless_map
= pprint_tests_meta
[i
].lossless_map
;
4958 pprint_test_template
[0].percpu_map
= pprint_tests_meta
[i
].percpu_map
;
4960 err
|= count_result(do_test_pprint(0));
4963 /* test rest test templates with the first map */
4964 for (i
= 1; i
< ARRAY_SIZE(pprint_test_template
); i
++) {
4965 pprint_test_template
[i
].descr
= pprint_tests_meta
[0].descr
;
4966 pprint_test_template
[i
].map_type
= pprint_tests_meta
[0].map_type
;
4967 pprint_test_template
[i
].map_name
= pprint_tests_meta
[0].map_name
;
4968 pprint_test_template
[i
].ordered_map
= pprint_tests_meta
[0].ordered_map
;
4969 pprint_test_template
[i
].lossless_map
= pprint_tests_meta
[0].lossless_map
;
4970 pprint_test_template
[i
].percpu_map
= pprint_tests_meta
[0].percpu_map
;
4971 err
|= count_result(do_test_pprint(i
));
4977 #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \
4978 (insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff))
4980 static struct prog_info_raw_test
{
4982 const char *str_sec
;
4983 const char *err_str
;
4984 __u32 raw_types
[MAX_NR_RAW_U32
];
4986 struct bpf_insn insns
[MAX_INSNS
];
4988 __u32 func_info
[MAX_SUBPROGS
][2];
4989 __u32 func_info_rec_size
;
4990 __u32 func_info_cnt
;
4991 __u32 line_info
[MAX_NR_RAW_U32
];
4992 __u32 line_info_rec_size
;
4993 __u32 nr_jited_ksyms
;
4994 bool expected_prog_load_failure
;
4995 __u32 dead_code_cnt
;
4996 __u32 dead_code_mask
;
4997 __u32 dead_func_cnt
;
4998 __u32 dead_func_mask
;
4999 } info_raw_tests
[] = {
5001 .descr
= "func_type (main func + one sub)",
5003 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5004 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4), /* [2] */
5005 BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5006 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5007 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5008 BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5009 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5010 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5011 BTF_FUNC_ENC(NAME_TBD
, 3), /* [5] */
5012 BTF_FUNC_ENC(NAME_TBD
, 4), /* [6] */
5015 .str_sec
= "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5016 .str_sec_size
= sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5018 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 1, 0, 2),
5019 BPF_MOV64_IMM(BPF_REG_0
, 1),
5021 BPF_MOV64_IMM(BPF_REG_0
, 2),
5024 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5025 .func_info
= { {0, 5}, {3, 6} },
5026 .func_info_rec_size
= 8,
5028 .line_info
= { BTF_END_RAW
},
5032 .descr
= "func_type (Incorrect func_info_rec_size)",
5034 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5035 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4), /* [2] */
5036 BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5037 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5038 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5039 BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5040 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5041 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5042 BTF_FUNC_ENC(NAME_TBD
, 3), /* [5] */
5043 BTF_FUNC_ENC(NAME_TBD
, 4), /* [6] */
5046 .str_sec
= "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5047 .str_sec_size
= sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5049 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 1, 0, 2),
5050 BPF_MOV64_IMM(BPF_REG_0
, 1),
5052 BPF_MOV64_IMM(BPF_REG_0
, 2),
5055 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5056 .func_info
= { {0, 5}, {3, 6} },
5057 .func_info_rec_size
= 4,
5059 .line_info
= { BTF_END_RAW
},
5060 .expected_prog_load_failure
= true,
5064 .descr
= "func_type (Incorrect func_info_cnt)",
5066 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5067 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4), /* [2] */
5068 BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5069 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5070 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5071 BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5072 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5073 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5074 BTF_FUNC_ENC(NAME_TBD
, 3), /* [5] */
5075 BTF_FUNC_ENC(NAME_TBD
, 4), /* [6] */
5078 .str_sec
= "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5079 .str_sec_size
= sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5081 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 1, 0, 2),
5082 BPF_MOV64_IMM(BPF_REG_0
, 1),
5084 BPF_MOV64_IMM(BPF_REG_0
, 2),
5087 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5088 .func_info
= { {0, 5}, {3, 6} },
5089 .func_info_rec_size
= 8,
5091 .line_info
= { BTF_END_RAW
},
5092 .expected_prog_load_failure
= true,
5096 .descr
= "func_type (Incorrect bpf_func_info.insn_off)",
5098 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5099 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 32, 4), /* [2] */
5100 BTF_FUNC_PROTO_ENC(1, 2), /* [3] */
5101 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5102 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5103 BTF_FUNC_PROTO_ENC(1, 2), /* [4] */
5104 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 2),
5105 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5106 BTF_FUNC_ENC(NAME_TBD
, 3), /* [5] */
5107 BTF_FUNC_ENC(NAME_TBD
, 4), /* [6] */
5110 .str_sec
= "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5111 .str_sec_size
= sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5113 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 1, 0, 2),
5114 BPF_MOV64_IMM(BPF_REG_0
, 1),
5116 BPF_MOV64_IMM(BPF_REG_0
, 2),
5119 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5120 .func_info
= { {0, 5}, {2, 6} },
5121 .func_info_rec_size
= 8,
5123 .line_info
= { BTF_END_RAW
},
5124 .expected_prog_load_failure
= true,
5128 .descr
= "line_info (No subprog)",
5130 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5133 BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5135 BPF_MOV64_IMM(BPF_REG_0
, 1),
5136 BPF_MOV64_IMM(BPF_REG_1
, 2),
5137 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5140 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5143 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5144 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 9),
5145 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8),
5146 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 7),
5149 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5150 .nr_jited_ksyms
= 1,
5154 .descr
= "line_info (No subprog. insn_off >= prog->len)",
5156 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5159 BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5161 BPF_MOV64_IMM(BPF_REG_0
, 1),
5162 BPF_MOV64_IMM(BPF_REG_1
, 2),
5163 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5166 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5169 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5170 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 9),
5171 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8),
5172 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 7),
5173 BPF_LINE_INFO_ENC(4, 0, 0, 5, 6),
5176 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5177 .nr_jited_ksyms
= 1,
5178 .err_str
= "line_info[4].insn_off",
5179 .expected_prog_load_failure
= true,
5183 .descr
= "line_info (Zero bpf insn code)",
5185 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5186 BTF_TYPE_INT_ENC(NAME_TBD
, 0, 0, 64, 8), /* [2] */
5187 BTF_TYPEDEF_ENC(NAME_TBD
, 2), /* [3] */
5190 BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"),
5192 BPF_LD_IMM64(BPF_REG_0
, 1),
5195 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5198 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5199 BPF_LINE_INFO_ENC(1, 0, 0, 2, 9),
5200 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8),
5203 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5204 .nr_jited_ksyms
= 1,
5205 .err_str
= "Invalid insn code at line_info[1]",
5206 .expected_prog_load_failure
= true,
5210 .descr
= "line_info (No subprog. zero tailing line_info",
5212 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5215 BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5217 BPF_MOV64_IMM(BPF_REG_0
, 1),
5218 BPF_MOV64_IMM(BPF_REG_1
, 2),
5219 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5222 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5225 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10), 0,
5226 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 9), 0,
5227 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8), 0,
5228 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 7), 0,
5231 .line_info_rec_size
= sizeof(struct bpf_line_info
) + sizeof(__u32
),
5232 .nr_jited_ksyms
= 1,
5236 .descr
= "line_info (No subprog. nonzero tailing line_info)",
5238 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5241 BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5243 BPF_MOV64_IMM(BPF_REG_0
, 1),
5244 BPF_MOV64_IMM(BPF_REG_1
, 2),
5245 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5248 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5251 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10), 0,
5252 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 9), 0,
5253 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8), 0,
5254 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 7), 1,
5257 .line_info_rec_size
= sizeof(struct bpf_line_info
) + sizeof(__u32
),
5258 .nr_jited_ksyms
= 1,
5259 .err_str
= "nonzero tailing record in line_info",
5260 .expected_prog_load_failure
= true,
5264 .descr
= "line_info (subprog)",
5266 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5269 BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5271 BPF_MOV64_IMM(BPF_REG_2
, 1),
5272 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5273 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5276 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5277 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5280 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5283 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5284 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 2, 9),
5285 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 3, 8),
5286 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 4, 7),
5289 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5290 .nr_jited_ksyms
= 2,
5294 .descr
= "line_info (subprog + func_info)",
5296 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5297 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5298 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5299 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5300 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5303 BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5305 BPF_MOV64_IMM(BPF_REG_2
, 1),
5306 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5307 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5310 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5311 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5314 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5316 .func_info_rec_size
= 8,
5317 .func_info
= { {0, 4}, {5, 3} },
5319 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5320 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 2, 9),
5321 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 3, 8),
5322 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 4, 7),
5325 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5326 .nr_jited_ksyms
= 2,
5330 .descr
= "line_info (subprog. missing 1st func line info)",
5332 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5335 BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5337 BPF_MOV64_IMM(BPF_REG_2
, 1),
5338 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5339 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5342 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5343 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5346 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5349 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 1, 10),
5350 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 2, 9),
5351 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 3, 8),
5352 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 4, 7),
5355 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5356 .nr_jited_ksyms
= 2,
5357 .err_str
= "missing bpf_line_info for func#0",
5358 .expected_prog_load_failure
= true,
5362 .descr
= "line_info (subprog. missing 2nd func line info)",
5364 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5367 BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5369 BPF_MOV64_IMM(BPF_REG_2
, 1),
5370 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5371 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5374 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5375 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5378 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5381 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5382 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 2, 9),
5383 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 3, 8),
5384 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 4, 7),
5387 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5388 .nr_jited_ksyms
= 2,
5389 .err_str
= "missing bpf_line_info for func#1",
5390 .expected_prog_load_failure
= true,
5394 .descr
= "line_info (subprog. unordered insn offset)",
5396 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5399 BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5401 BPF_MOV64_IMM(BPF_REG_2
, 1),
5402 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5403 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5406 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5407 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5410 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5413 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5414 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 2, 9),
5415 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8),
5416 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 4, 7),
5419 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5420 .nr_jited_ksyms
= 2,
5421 .err_str
= "Invalid line_info[2].insn_off",
5422 .expected_prog_load_failure
= true,
5426 .descr
= "line_info (dead start)",
5428 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5431 BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5433 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
5434 BPF_MOV64_IMM(BPF_REG_0
, 1),
5435 BPF_MOV64_IMM(BPF_REG_1
, 2),
5436 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5439 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5442 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5443 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 9),
5444 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 8),
5445 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 7),
5446 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 5, 6),
5449 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5450 .nr_jited_ksyms
= 1,
5452 .dead_code_mask
= 0x01,
5456 .descr
= "line_info (dead end)",
5458 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5461 BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"),
5463 BPF_MOV64_IMM(BPF_REG_0
, 1),
5464 BPF_MOV64_IMM(BPF_REG_1
, 2),
5465 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
5466 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 10, 1),
5470 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5473 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 12),
5474 BPF_LINE_INFO_ENC(1, 0, NAME_TBD
, 2, 11),
5475 BPF_LINE_INFO_ENC(2, 0, NAME_TBD
, 3, 10),
5476 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 4, 9),
5477 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 5, 8),
5478 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 6, 7),
5481 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5482 .nr_jited_ksyms
= 1,
5484 .dead_code_mask
= 0x28,
5488 .descr
= "line_info (dead code + subprog + func_info)",
5490 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5491 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5492 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5493 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5494 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5497 BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */"
5498 "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5499 "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5500 "\0return func(a);\0b+=1;\0return b;"),
5502 BPF_MOV64_IMM(BPF_REG_2
, 1),
5503 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
5504 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
5505 BPF_JMP_IMM(BPF_JGE
, BPF_REG_2
, 0, 8),
5506 BPF_MOV64_IMM(BPF_REG_2
, 1),
5507 BPF_MOV64_IMM(BPF_REG_2
, 1),
5508 BPF_MOV64_IMM(BPF_REG_2
, 1),
5509 BPF_MOV64_IMM(BPF_REG_2
, 1),
5510 BPF_MOV64_IMM(BPF_REG_2
, 1),
5511 BPF_MOV64_IMM(BPF_REG_2
, 1),
5512 BPF_MOV64_IMM(BPF_REG_2
, 1),
5513 BPF_MOV64_IMM(BPF_REG_2
, 1),
5516 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
5517 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5520 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5522 .func_info_rec_size
= 8,
5523 .func_info
= { {0, 4}, {14, 3} },
5525 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5526 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 1, 10),
5527 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 1, 10),
5528 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 1, 10),
5529 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5530 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 1, 10),
5531 BPF_LINE_INFO_ENC(8, 0, NAME_TBD
, 1, 10),
5532 BPF_LINE_INFO_ENC(9, 0, NAME_TBD
, 1, 10),
5533 BPF_LINE_INFO_ENC(10, 0, NAME_TBD
, 1, 10),
5534 BPF_LINE_INFO_ENC(11, 0, NAME_TBD
, 2, 9),
5535 BPF_LINE_INFO_ENC(12, 0, NAME_TBD
, 2, 9),
5536 BPF_LINE_INFO_ENC(14, 0, NAME_TBD
, 3, 8),
5537 BPF_LINE_INFO_ENC(16, 0, NAME_TBD
, 4, 7),
5540 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5541 .nr_jited_ksyms
= 2,
5543 .dead_code_mask
= 0x3fe,
5547 .descr
= "line_info (dead subprog)",
5549 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5550 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5551 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5552 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5553 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5554 BTF_FUNC_ENC(NAME_TBD
, 2), /* [5] */
5557 BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
5558 "\0return 0;\0return 0;\0/* dead */\0/* dead */"
5559 "\0/* dead */\0return bla + 1;\0return bla + 1;"
5560 "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
5562 BPF_MOV64_IMM(BPF_REG_2
, 1),
5563 BPF_JMP_IMM(BPF_JGE
, BPF_REG_2
, 0, 1),
5566 BPF_MOV64_IMM(BPF_REG_0
, 0),
5568 BPF_MOV64_IMM(BPF_REG_0
, 0),
5571 BPF_MOV64_REG(BPF_REG_0
, 2),
5572 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5575 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5577 .func_info_rec_size
= 8,
5578 .func_info
= { {0, 4}, {6, 3}, {9, 5} },
5580 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5581 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 1, 10),
5582 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 1, 10),
5583 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 1, 10),
5584 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5585 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 1, 10),
5586 BPF_LINE_INFO_ENC(8, 0, NAME_TBD
, 1, 10),
5587 BPF_LINE_INFO_ENC(9, 0, NAME_TBD
, 1, 10),
5588 BPF_LINE_INFO_ENC(10, 0, NAME_TBD
, 1, 10),
5589 BPF_LINE_INFO_ENC(11, 0, NAME_TBD
, 2, 9),
5592 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5593 .nr_jited_ksyms
= 2,
5595 .dead_code_mask
= 0x70,
5597 .dead_func_mask
= 0x2,
5601 .descr
= "line_info (dead last subprog)",
5603 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5604 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5605 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5606 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5607 BTF_FUNC_ENC(NAME_TBD
, 2), /* [5] */
5610 BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */"
5611 "\0return 0;\0/* dead */\0/* dead */"),
5613 BPF_MOV64_IMM(BPF_REG_2
, 1),
5614 BPF_JMP_IMM(BPF_JGE
, BPF_REG_2
, 0, 1),
5616 BPF_MOV64_IMM(BPF_REG_0
, 0),
5618 BPF_MOV64_IMM(BPF_REG_0
, 0),
5621 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5623 .func_info_rec_size
= 8,
5624 .func_info
= { {0, 4}, {5, 3} },
5626 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5627 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 1, 10),
5628 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 1, 10),
5629 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 1, 10),
5630 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5633 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5634 .nr_jited_ksyms
= 1,
5636 .dead_code_mask
= 0x18,
5638 .dead_func_mask
= 0x2,
5642 .descr
= "line_info (dead subprog + dead start)",
5644 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5645 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5646 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5647 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5648 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5649 BTF_FUNC_ENC(NAME_TBD
, 2), /* [5] */
5652 BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */"
5653 "\0return 0;\0return 0;\0return 0;"
5654 "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5655 "\0return b + 1;\0return b + 1;\0return b + 1;"),
5657 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
5658 BPF_MOV64_IMM(BPF_REG_2
, 1),
5659 BPF_JMP_IMM(BPF_JGE
, BPF_REG_2
, 0, 1),
5662 BPF_MOV64_IMM(BPF_REG_0
, 0),
5664 BPF_MOV64_IMM(BPF_REG_0
, 0),
5667 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
5668 BPF_MOV64_REG(BPF_REG_0
, 2),
5669 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5672 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5674 .func_info_rec_size
= 8,
5675 .func_info
= { {0, 4}, {7, 3}, {10, 5} },
5677 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5678 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 1, 10),
5679 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 1, 10),
5680 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 1, 10),
5681 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5682 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 1, 10),
5683 BPF_LINE_INFO_ENC(8, 0, NAME_TBD
, 1, 10),
5684 BPF_LINE_INFO_ENC(9, 0, NAME_TBD
, 1, 10),
5685 BPF_LINE_INFO_ENC(10, 0, NAME_TBD
, 1, 10),
5686 BPF_LINE_INFO_ENC(11, 0, NAME_TBD
, 2, 9),
5687 BPF_LINE_INFO_ENC(12, 0, NAME_TBD
, 2, 9),
5688 BPF_LINE_INFO_ENC(13, 0, NAME_TBD
, 2, 9),
5691 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5692 .nr_jited_ksyms
= 2,
5694 .dead_code_mask
= 0x1e2,
5696 .dead_func_mask
= 0x2,
5700 .descr
= "line_info (dead subprog + dead start w/ move)",
5702 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5703 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5704 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5705 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5706 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5707 BTF_FUNC_ENC(NAME_TBD
, 2), /* [5] */
5710 BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
5711 "\0return 0;\0return 0;\0/* dead */\0/* dead */"
5712 "\0/* dead */\0return bla + 1;\0return bla + 1;"
5713 "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
5715 BPF_MOV64_IMM(BPF_REG_2
, 1),
5716 BPF_JMP_IMM(BPF_JGE
, BPF_REG_2
, 0, 1),
5719 BPF_MOV64_IMM(BPF_REG_0
, 0),
5721 BPF_MOV64_IMM(BPF_REG_0
, 0),
5724 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
5725 BPF_MOV64_REG(BPF_REG_0
, 2),
5726 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 1),
5729 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5731 .func_info_rec_size
= 8,
5732 .func_info
= { {0, 4}, {6, 3}, {9, 5} },
5734 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5735 BPF_LINE_INFO_ENC(3, 0, NAME_TBD
, 1, 10),
5736 BPF_LINE_INFO_ENC(4, 0, NAME_TBD
, 1, 10),
5737 BPF_LINE_INFO_ENC(5, 0, NAME_TBD
, 1, 10),
5738 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5739 BPF_LINE_INFO_ENC(7, 0, NAME_TBD
, 1, 10),
5740 BPF_LINE_INFO_ENC(8, 0, NAME_TBD
, 1, 10),
5741 BPF_LINE_INFO_ENC(9, 0, NAME_TBD
, 1, 10),
5742 BPF_LINE_INFO_ENC(11, 0, NAME_TBD
, 1, 10),
5743 BPF_LINE_INFO_ENC(12, 0, NAME_TBD
, 2, 9),
5746 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5747 .nr_jited_ksyms
= 2,
5749 .dead_code_mask
= 0x70,
5751 .dead_func_mask
= 0x2,
5755 .descr
= "line_info (dead end + subprog start w/ no linfo)",
5757 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
5758 BTF_FUNC_PROTO_ENC(1, 1), /* [2] */
5759 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
5760 BTF_FUNC_ENC(NAME_TBD
, 2), /* [3] */
5761 BTF_FUNC_ENC(NAME_TBD
, 2), /* [4] */
5764 BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"),
5766 BPF_MOV64_IMM(BPF_REG_0
, 0),
5767 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 1, 3),
5769 BPF_MOV64_IMM(BPF_REG_0
, 0),
5772 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
5775 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
5777 .func_info_rec_size
= 8,
5778 .func_info
= { {0, 3}, {6, 4}, },
5780 BPF_LINE_INFO_ENC(0, 0, NAME_TBD
, 1, 10),
5781 BPF_LINE_INFO_ENC(6, 0, NAME_TBD
, 1, 10),
5784 .line_info_rec_size
= sizeof(struct bpf_line_info
),
5785 .nr_jited_ksyms
= 2,
5790 static size_t probe_prog_length(const struct bpf_insn
*fp
)
5794 for (len
= MAX_INSNS
- 1; len
> 0; --len
)
5795 if (fp
[len
].code
!= 0 || fp
[len
].imm
!= 0)
5800 static __u32
*patch_name_tbd(const __u32
*raw_u32
,
5801 const char *str
, __u32 str_off
,
5802 unsigned int str_sec_size
,
5803 unsigned int *ret_size
)
5805 int i
, raw_u32_size
= get_raw_sec_size(raw_u32
);
5806 const char *end_str
= str
+ str_sec_size
;
5807 const char *next_str
= str
+ str_off
;
5808 __u32
*new_u32
= NULL
;
5810 if (raw_u32_size
== -1)
5811 return ERR_PTR(-EINVAL
);
5813 if (!raw_u32_size
) {
5818 new_u32
= malloc(raw_u32_size
);
5820 return ERR_PTR(-ENOMEM
);
5822 for (i
= 0; i
< raw_u32_size
/ sizeof(raw_u32
[0]); i
++) {
5823 if (raw_u32
[i
] == NAME_TBD
) {
5824 next_str
= get_next_str(next_str
, end_str
);
5825 if (CHECK(!next_str
, "Error in getting next_str\n")) {
5827 return ERR_PTR(-EINVAL
);
5829 new_u32
[i
] = next_str
- str
;
5830 next_str
+= strlen(next_str
);
5832 new_u32
[i
] = raw_u32
[i
];
5836 *ret_size
= raw_u32_size
;
5840 static int test_get_finfo(const struct prog_info_raw_test
*test
,
5843 struct bpf_prog_info info
= {};
5844 struct bpf_func_info
*finfo
;
5845 __u32 info_len
, rec_size
, i
;
5846 void *func_info
= NULL
;
5850 /* get necessary lens */
5851 info_len
= sizeof(struct bpf_prog_info
);
5852 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
5853 if (CHECK(err
== -1, "invalid get info (1st) errno:%d", errno
)) {
5854 fprintf(stderr
, "%s\n", btf_log_buf
);
5857 nr_func_info
= test
->func_info_cnt
- test
->dead_func_cnt
;
5858 if (CHECK(info
.nr_func_info
!= nr_func_info
,
5859 "incorrect info.nr_func_info (1st) %d",
5860 info
.nr_func_info
)) {
5864 rec_size
= info
.func_info_rec_size
;
5865 if (CHECK(rec_size
!= sizeof(struct bpf_func_info
),
5866 "incorrect info.func_info_rec_size (1st) %d", rec_size
)) {
5870 if (!info
.nr_func_info
)
5873 func_info
= malloc(info
.nr_func_info
* rec_size
);
5874 if (CHECK(!func_info
, "out of memory"))
5877 /* reset info to only retrieve func_info related data */
5878 memset(&info
, 0, sizeof(info
));
5879 info
.nr_func_info
= nr_func_info
;
5880 info
.func_info_rec_size
= rec_size
;
5881 info
.func_info
= ptr_to_u64(func_info
);
5882 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
5883 if (CHECK(err
== -1, "invalid get info (2nd) errno:%d", errno
)) {
5884 fprintf(stderr
, "%s\n", btf_log_buf
);
5888 if (CHECK(info
.nr_func_info
!= nr_func_info
,
5889 "incorrect info.nr_func_info (2nd) %d",
5890 info
.nr_func_info
)) {
5894 if (CHECK(info
.func_info_rec_size
!= rec_size
,
5895 "incorrect info.func_info_rec_size (2nd) %d",
5896 info
.func_info_rec_size
)) {
5902 for (i
= 0; i
< nr_func_info
; i
++) {
5903 if (test
->dead_func_mask
& (1 << i
))
5905 if (CHECK(finfo
->type_id
!= test
->func_info
[i
][1],
5906 "incorrect func_type %u expected %u",
5907 finfo
->type_id
, test
->func_info
[i
][1])) {
5911 finfo
= (void *)finfo
+ rec_size
;
5921 static int test_get_linfo(const struct prog_info_raw_test
*test
,
5922 const void *patched_linfo
,
5923 __u32 cnt
, int prog_fd
)
5925 __u32 i
, info_len
, nr_jited_ksyms
, nr_jited_func_lens
;
5926 __u64
*jited_linfo
= NULL
, *jited_ksyms
= NULL
;
5927 __u32 rec_size
, jited_rec_size
, jited_cnt
;
5928 struct bpf_line_info
*linfo
= NULL
;
5929 __u32 cur_func_len
, ksyms_found
;
5930 struct bpf_prog_info info
= {};
5931 __u32
*jited_func_lens
= NULL
;
5932 __u64 cur_func_ksyms
;
5937 rec_size
= sizeof(*linfo
);
5938 jited_rec_size
= sizeof(*jited_linfo
);
5939 if (test
->nr_jited_ksyms
)
5940 nr_jited_ksyms
= test
->nr_jited_ksyms
;
5942 nr_jited_ksyms
= test
->func_info_cnt
- test
->dead_func_cnt
;
5943 nr_jited_func_lens
= nr_jited_ksyms
;
5945 info_len
= sizeof(struct bpf_prog_info
);
5946 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
5947 if (CHECK(err
== -1, "err:%d errno:%d", err
, errno
)) {
5952 if (!info
.jited_prog_len
) {
5953 /* prog is not jited */
5956 nr_jited_func_lens
= 1;
5959 if (CHECK(info
.nr_line_info
!= cnt
||
5960 info
.nr_jited_line_info
!= jited_cnt
||
5961 info
.nr_jited_ksyms
!= nr_jited_ksyms
||
5962 info
.nr_jited_func_lens
!= nr_jited_func_lens
||
5963 (!info
.nr_line_info
&& info
.nr_jited_line_info
),
5964 "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)",
5965 info
.nr_line_info
, cnt
,
5966 info
.nr_jited_line_info
, jited_cnt
,
5967 info
.nr_jited_ksyms
, nr_jited_ksyms
,
5968 info
.nr_jited_func_lens
, nr_jited_func_lens
)) {
5973 if (CHECK(info
.line_info_rec_size
!= sizeof(struct bpf_line_info
) ||
5974 info
.jited_line_info_rec_size
!= sizeof(__u64
),
5975 "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)",
5976 info
.line_info_rec_size
, rec_size
,
5977 info
.jited_line_info_rec_size
, jited_rec_size
)) {
5985 rec_size
= info
.line_info_rec_size
;
5986 jited_rec_size
= info
.jited_line_info_rec_size
;
5988 memset(&info
, 0, sizeof(info
));
5990 linfo
= calloc(cnt
, rec_size
);
5991 if (CHECK(!linfo
, "!linfo")) {
5995 info
.nr_line_info
= cnt
;
5996 info
.line_info_rec_size
= rec_size
;
5997 info
.line_info
= ptr_to_u64(linfo
);
6000 jited_linfo
= calloc(jited_cnt
, jited_rec_size
);
6001 jited_ksyms
= calloc(nr_jited_ksyms
, sizeof(*jited_ksyms
));
6002 jited_func_lens
= calloc(nr_jited_func_lens
,
6003 sizeof(*jited_func_lens
));
6004 if (CHECK(!jited_linfo
|| !jited_ksyms
|| !jited_func_lens
,
6005 "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p",
6006 jited_linfo
, jited_ksyms
, jited_func_lens
)) {
6011 info
.nr_jited_line_info
= jited_cnt
;
6012 info
.jited_line_info_rec_size
= jited_rec_size
;
6013 info
.jited_line_info
= ptr_to_u64(jited_linfo
);
6014 info
.nr_jited_ksyms
= nr_jited_ksyms
;
6015 info
.jited_ksyms
= ptr_to_u64(jited_ksyms
);
6016 info
.nr_jited_func_lens
= nr_jited_func_lens
;
6017 info
.jited_func_lens
= ptr_to_u64(jited_func_lens
);
6020 err
= bpf_obj_get_info_by_fd(prog_fd
, &info
, &info_len
);
6023 * Only recheck the info.*line_info* fields.
6024 * Other fields are not the concern of this test.
6026 if (CHECK(err
== -1 ||
6027 info
.nr_line_info
!= cnt
||
6028 (jited_cnt
&& !info
.jited_line_info
) ||
6029 info
.nr_jited_line_info
!= jited_cnt
||
6030 info
.line_info_rec_size
!= rec_size
||
6031 info
.jited_line_info_rec_size
!= jited_rec_size
,
6032 "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",
6034 info
.nr_line_info
, cnt
,
6035 info
.nr_jited_line_info
, jited_cnt
,
6036 info
.line_info_rec_size
, rec_size
,
6037 info
.jited_line_info_rec_size
, jited_rec_size
,
6038 (void *)(long)info
.line_info
,
6039 (void *)(long)info
.jited_line_info
)) {
6045 while (test
->dead_code_mask
& (1 << dead_insns
))
6048 CHECK(linfo
[0].insn_off
, "linfo[0].insn_off:%u",
6050 for (i
= 1; i
< cnt
; i
++) {
6051 const struct bpf_line_info
*expected_linfo
;
6053 while (test
->dead_code_mask
& (1 << (i
+ dead_insns
)))
6056 expected_linfo
= patched_linfo
+
6057 ((i
+ dead_insns
) * test
->line_info_rec_size
);
6058 if (CHECK(linfo
[i
].insn_off
<= linfo
[i
- 1].insn_off
,
6059 "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u",
6060 i
, linfo
[i
].insn_off
,
6061 i
- 1, linfo
[i
- 1].insn_off
)) {
6065 if (CHECK(linfo
[i
].file_name_off
!= expected_linfo
->file_name_off
||
6066 linfo
[i
].line_off
!= expected_linfo
->line_off
||
6067 linfo
[i
].line_col
!= expected_linfo
->line_col
,
6068 "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i
,
6069 linfo
[i
].file_name_off
,
6072 expected_linfo
->file_name_off
,
6073 expected_linfo
->line_off
,
6074 expected_linfo
->line_col
)) {
6081 fprintf(stderr
, "not jited. skipping jited_line_info check. ");
6086 if (CHECK(jited_linfo
[0] != jited_ksyms
[0],
6087 "jited_linfo[0]:%lx != jited_ksyms[0]:%lx",
6088 (long)(jited_linfo
[0]), (long)(jited_ksyms
[0]))) {
6094 cur_func_len
= jited_func_lens
[0];
6095 cur_func_ksyms
= jited_ksyms
[0];
6096 for (i
= 1; i
< jited_cnt
; i
++) {
6097 if (ksyms_found
< nr_jited_ksyms
&&
6098 jited_linfo
[i
] == jited_ksyms
[ksyms_found
]) {
6099 cur_func_ksyms
= jited_ksyms
[ksyms_found
];
6100 cur_func_len
= jited_ksyms
[ksyms_found
];
6105 if (CHECK(jited_linfo
[i
] <= jited_linfo
[i
- 1],
6106 "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx",
6107 i
, (long)jited_linfo
[i
],
6108 i
- 1, (long)(jited_linfo
[i
- 1]))) {
6113 if (CHECK(jited_linfo
[i
] - cur_func_ksyms
> cur_func_len
,
6114 "jited_linfo[%u]:%lx - %lx > %u",
6115 i
, (long)jited_linfo
[i
], (long)cur_func_ksyms
,
6122 if (CHECK(ksyms_found
!= nr_jited_ksyms
,
6123 "ksyms_found:%u != nr_jited_ksyms:%u",
6124 ksyms_found
, nr_jited_ksyms
)) {
6135 free(jited_func_lens
);
6139 static int do_test_info_raw(unsigned int test_num
)
6141 const struct prog_info_raw_test
*test
= &info_raw_tests
[test_num
- 1];
6142 unsigned int raw_btf_size
, linfo_str_off
, linfo_size
;
6143 int btf_fd
= -1, prog_fd
= -1, err
= 0;
6144 void *raw_btf
, *patched_linfo
= NULL
;
6145 const char *ret_next_str
;
6146 union bpf_attr attr
= {};
6148 fprintf(stderr
, "BTF prog info raw test[%u] (%s): ", test_num
, test
->descr
);
6149 raw_btf
= btf_raw_create(&hdr_tmpl
, test
->raw_types
,
6150 test
->str_sec
, test
->str_sec_size
,
6151 &raw_btf_size
, &ret_next_str
);
6156 *btf_log_buf
= '\0';
6157 btf_fd
= bpf_load_btf(raw_btf
, raw_btf_size
,
6158 btf_log_buf
, BTF_LOG_BUF_SIZE
,
6162 if (CHECK(btf_fd
== -1, "invalid btf_fd errno:%d", errno
)) {
6167 if (*btf_log_buf
&& args
.always_log
)
6168 fprintf(stderr
, "\n%s", btf_log_buf
);
6169 *btf_log_buf
= '\0';
6171 linfo_str_off
= ret_next_str
- test
->str_sec
;
6172 patched_linfo
= patch_name_tbd(test
->line_info
,
6173 test
->str_sec
, linfo_str_off
,
6174 test
->str_sec_size
, &linfo_size
);
6175 if (IS_ERR(patched_linfo
)) {
6176 fprintf(stderr
, "error in creating raw bpf_line_info");
6181 attr
.prog_type
= test
->prog_type
;
6182 attr
.insns
= ptr_to_u64(test
->insns
);
6183 attr
.insn_cnt
= probe_prog_length(test
->insns
);
6184 attr
.license
= ptr_to_u64("GPL");
6185 attr
.prog_btf_fd
= btf_fd
;
6186 attr
.func_info_rec_size
= test
->func_info_rec_size
;
6187 attr
.func_info_cnt
= test
->func_info_cnt
;
6188 attr
.func_info
= ptr_to_u64(test
->func_info
);
6189 attr
.log_buf
= ptr_to_u64(btf_log_buf
);
6190 attr
.log_size
= BTF_LOG_BUF_SIZE
;
6193 attr
.line_info_rec_size
= test
->line_info_rec_size
;
6194 attr
.line_info
= ptr_to_u64(patched_linfo
);
6195 attr
.line_info_cnt
= linfo_size
/ attr
.line_info_rec_size
;
6198 prog_fd
= syscall(__NR_bpf
, BPF_PROG_LOAD
, &attr
, sizeof(attr
));
6199 err
= ((prog_fd
== -1) != test
->expected_prog_load_failure
);
6200 if (CHECK(err
, "prog_fd:%d expected_prog_load_failure:%u errno:%d",
6201 prog_fd
, test
->expected_prog_load_failure
, errno
) ||
6202 CHECK(test
->err_str
&& !strstr(btf_log_buf
, test
->err_str
),
6203 "expected err_str:%s", test
->err_str
)) {
6211 err
= test_get_finfo(test
, prog_fd
);
6215 err
= test_get_linfo(test
, patched_linfo
,
6216 attr
.line_info_cnt
- test
->dead_code_cnt
,
6223 fprintf(stderr
, "OK");
6225 if (*btf_log_buf
&& (err
|| args
.always_log
))
6226 fprintf(stderr
, "\n%s", btf_log_buf
);
6233 if (!IS_ERR(patched_linfo
))
6234 free(patched_linfo
);
6239 static int test_info_raw(void)
6244 if (args
.info_raw_test_num
)
6245 return count_result(do_test_info_raw(args
.info_raw_test_num
));
6247 for (i
= 1; i
<= ARRAY_SIZE(info_raw_tests
); i
++)
6248 err
|= count_result(do_test_info_raw(i
));
6253 struct btf_raw_data
{
6254 __u32 raw_types
[MAX_NR_RAW_U32
];
6255 const char *str_sec
;
6259 struct btf_dedup_test
{
6261 struct btf_raw_data input
;
6262 struct btf_raw_data expect
;
6263 struct btf_dedup_opts opts
;
6266 const struct btf_dedup_test dedup_tests
[] = {
6269 .descr
= "dedup: unused strings filtering",
6272 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 32, 4),
6273 BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED
, 0, 64, 8),
6276 BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"),
6280 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4),
6281 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 64, 8),
6284 BTF_STR_SEC("\0int\0long"),
6287 .dont_resolve_fwds
= false,
6291 .descr
= "dedup: strings deduplication",
6294 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4),
6295 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 64, 8),
6296 BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED
, 0, 32, 4),
6297 BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED
, 0, 64, 8),
6298 BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED
, 0, 32, 4),
6301 BTF_STR_SEC("\0int\0long int\0int\0long int\0int"),
6305 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4),
6306 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 64, 8),
6309 BTF_STR_SEC("\0int\0long int"),
6312 .dont_resolve_fwds
= false,
6316 .descr
= "dedup: struct example #1",
6328 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
6330 BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */
6332 BTF_STRUCT_ENC(NAME_NTH(2), 4, 84), /* [3] */
6333 BTF_MEMBER_ENC(NAME_NTH(3), 4, 0), /* struct s *next; */
6334 BTF_MEMBER_ENC(NAME_NTH(4), 5, 64), /* const int *a; */
6335 BTF_MEMBER_ENC(NAME_NTH(5), 2, 128), /* int b[16]; */
6336 BTF_MEMBER_ENC(NAME_NTH(6), 1, 640), /* int c; */
6337 /* ptr -> [3] struct s */
6338 BTF_PTR_ENC(3), /* [4] */
6339 /* ptr -> [6] const int */
6340 BTF_PTR_ENC(6), /* [5] */
6341 /* const -> [1] int */
6342 BTF_CONST_ENC(1), /* [6] */
6344 /* full copy of the above */
6345 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4), /* [7] */
6346 BTF_TYPE_ARRAY_ENC(7, 7, 16), /* [8] */
6347 BTF_STRUCT_ENC(NAME_NTH(2), 4, 84), /* [9] */
6348 BTF_MEMBER_ENC(NAME_NTH(3), 10, 0),
6349 BTF_MEMBER_ENC(NAME_NTH(4), 11, 64),
6350 BTF_MEMBER_ENC(NAME_NTH(5), 8, 128),
6351 BTF_MEMBER_ENC(NAME_NTH(6), 7, 640),
6352 BTF_PTR_ENC(9), /* [10] */
6353 BTF_PTR_ENC(12), /* [11] */
6354 BTF_CONST_ENC(7), /* [12] */
6357 BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0"),
6362 BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
6364 BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */
6366 BTF_STRUCT_ENC(NAME_NTH(6), 4, 84), /* [3] */
6367 BTF_MEMBER_ENC(NAME_NTH(5), 4, 0), /* struct s *next; */
6368 BTF_MEMBER_ENC(NAME_NTH(1), 5, 64), /* const int *a; */
6369 BTF_MEMBER_ENC(NAME_NTH(2), 2, 128), /* int b[16]; */
6370 BTF_MEMBER_ENC(NAME_NTH(3), 1, 640), /* int c; */
6371 /* ptr -> [3] struct s */
6372 BTF_PTR_ENC(3), /* [4] */
6373 /* ptr -> [6] const int */
6374 BTF_PTR_ENC(6), /* [5] */
6375 /* const -> [1] int */
6376 BTF_CONST_ENC(1), /* [6] */
6379 BTF_STR_SEC("\0a\0b\0c\0int\0next\0s"),
6382 .dont_resolve_fwds
= false,
6386 .descr
= "dedup: struct <-> fwd resolution w/ hash collision",
6402 BTF_FWD_ENC(NAME_TBD
, 0 /* struct fwd */), /* [1] fwd x */
6403 BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6404 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [3] struct s */
6405 BTF_MEMBER_ENC(NAME_TBD
, 2, 0),
6407 BTF_STRUCT_ENC(NAME_TBD
, 0, 0), /* [4] struct x */
6408 BTF_PTR_ENC(4), /* [5] ptr -> [4] */
6409 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [6] struct s */
6410 BTF_MEMBER_ENC(NAME_TBD
, 5, 0),
6413 BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"),
6417 BTF_PTR_ENC(3), /* [1] ptr -> [3] */
6418 BTF_STRUCT_ENC(NAME_TBD
, 1, 8), /* [2] struct s */
6419 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
6420 BTF_STRUCT_ENC(NAME_NTH(2), 0, 0), /* [3] struct x */
6423 BTF_STR_SEC("\0s\0x"),
6426 .dont_resolve_fwds
= false,
6427 .dedup_table_size
= 1, /* force hash collisions */
6431 .descr
= "dedup: void equiv check",
6445 BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */
6446 BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6447 BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */
6448 BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6450 BTF_PTR_ENC(0), /* [4] ptr -> void */
6451 BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */
6452 BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6455 BTF_STR_SEC("\0s\0x"),
6460 BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */
6461 BTF_PTR_ENC(1), /* [2] ptr -> [1] */
6462 BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */
6463 BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6465 BTF_PTR_ENC(0), /* [4] ptr -> void */
6466 BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */
6467 BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6470 BTF_STR_SEC("\0s\0x"),
6473 .dont_resolve_fwds
= false,
6474 .dedup_table_size
= 1, /* force hash collisions */
6478 .descr
= "dedup: all possible kinds (no duplicates)",
6481 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 8), /* [1] int */
6482 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 2), 4), /* [2] enum */
6483 BTF_ENUM_ENC(NAME_TBD
, 0),
6484 BTF_ENUM_ENC(NAME_TBD
, 1),
6485 BTF_FWD_ENC(NAME_TBD
, 1 /* union kind_flag */), /* [3] fwd */
6486 BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */
6487 BTF_STRUCT_ENC(NAME_TBD
, 1, 4), /* [5] struct */
6488 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
6489 BTF_UNION_ENC(NAME_TBD
, 1, 4), /* [6] union */
6490 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
6491 BTF_TYPEDEF_ENC(NAME_TBD
, 1), /* [7] typedef */
6492 BTF_PTR_ENC(0), /* [8] ptr */
6493 BTF_CONST_ENC(8), /* [9] const */
6494 BTF_VOLATILE_ENC(8), /* [10] volatile */
6495 BTF_RESTRICT_ENC(8), /* [11] restrict */
6496 BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */
6497 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
6498 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 8),
6499 BTF_FUNC_ENC(NAME_TBD
, 12), /* [13] func */
6502 BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M"),
6506 BTF_TYPE_INT_ENC(NAME_TBD
, BTF_INT_SIGNED
, 0, 32, 8), /* [1] int */
6507 BTF_TYPE_ENC(NAME_TBD
, BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 2), 4), /* [2] enum */
6508 BTF_ENUM_ENC(NAME_TBD
, 0),
6509 BTF_ENUM_ENC(NAME_TBD
, 1),
6510 BTF_FWD_ENC(NAME_TBD
, 1 /* union kind_flag */), /* [3] fwd */
6511 BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */
6512 BTF_STRUCT_ENC(NAME_TBD
, 1, 4), /* [5] struct */
6513 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
6514 BTF_UNION_ENC(NAME_TBD
, 1, 4), /* [6] union */
6515 BTF_MEMBER_ENC(NAME_TBD
, 1, 0),
6516 BTF_TYPEDEF_ENC(NAME_TBD
, 1), /* [7] typedef */
6517 BTF_PTR_ENC(0), /* [8] ptr */
6518 BTF_CONST_ENC(8), /* [9] const */
6519 BTF_VOLATILE_ENC(8), /* [10] volatile */
6520 BTF_RESTRICT_ENC(8), /* [11] restrict */
6521 BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */
6522 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 1),
6523 BTF_FUNC_PROTO_ARG_ENC(NAME_TBD
, 8),
6524 BTF_FUNC_ENC(NAME_TBD
, 12), /* [13] func */
6527 BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M"),
6530 .dont_resolve_fwds
= false,
6534 .descr
= "dedup: no int duplicates",
6537 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 8),
6538 /* different name */
6539 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 32, 8),
6540 /* different encoding */
6541 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR
, 0, 32, 8),
6542 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL
, 0, 32, 8),
6543 /* different bit offset */
6544 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 8, 32, 8),
6545 /* different bit size */
6546 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 27, 8),
6547 /* different byte size */
6548 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4),
6551 BTF_STR_SEC("\0int\0some other int"),
6555 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 8),
6556 /* different name */
6557 BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED
, 0, 32, 8),
6558 /* different encoding */
6559 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR
, 0, 32, 8),
6560 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL
, 0, 32, 8),
6561 /* different bit offset */
6562 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 8, 32, 8),
6563 /* different bit size */
6564 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 27, 8),
6565 /* different byte size */
6566 BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED
, 0, 32, 4),
6569 BTF_STR_SEC("\0int\0some other int"),
6572 .dont_resolve_fwds
= false,
6576 .descr
= "dedup: enum fwd resolution",
6579 /* [1] fwd enum 'e1' before full enum */
6580 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 0), 4),
6581 /* [2] full enum 'e1' after fwd */
6582 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6583 BTF_ENUM_ENC(NAME_NTH(2), 123),
6584 /* [3] full enum 'e2' before fwd */
6585 BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6586 BTF_ENUM_ENC(NAME_NTH(4), 456),
6587 /* [4] fwd enum 'e2' after full enum */
6588 BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 0), 4),
6589 /* [5] incompatible fwd enum with different size */
6590 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 0), 1),
6591 /* [6] incompatible full enum with different value */
6592 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6593 BTF_ENUM_ENC(NAME_NTH(2), 321),
6596 BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6600 /* [1] full enum 'e1' */
6601 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6602 BTF_ENUM_ENC(NAME_NTH(2), 123),
6603 /* [2] full enum 'e2' */
6604 BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6605 BTF_ENUM_ENC(NAME_NTH(4), 456),
6606 /* [3] incompatible fwd enum with different size */
6607 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 0), 1),
6608 /* [4] incompatible full enum with different value */
6609 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM
, 0, 1), 4),
6610 BTF_ENUM_ENC(NAME_NTH(2), 321),
6613 BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6616 .dont_resolve_fwds
= false,
6620 .descr
= "dedup: datasec and vars pass-through",
6624 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
6626 BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */
6627 /* .bss section */ /* [3] */
6628 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
6629 BTF_VAR_SECINFO_ENC(2, 0, 4),
6630 /* int, referenced from [5] */
6631 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [4] */
6632 /* another static int t */
6633 BTF_VAR_ENC(NAME_NTH(2), 4, 0), /* [5] */
6634 /* another .bss section */ /* [6] */
6635 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
6636 BTF_VAR_SECINFO_ENC(5, 0, 4),
6639 BTF_STR_SEC("\0.bss\0t"),
6644 BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED
, 0, 32, 4), /* [1] */
6646 BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */
6647 /* .bss section */ /* [3] */
6648 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
6649 BTF_VAR_SECINFO_ENC(2, 0, 4),
6650 /* another static int t */
6651 BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [4] */
6652 /* another .bss section */ /* [5] */
6653 BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC
, 0, 1), 4),
6654 BTF_VAR_SECINFO_ENC(4, 0, 4),
6657 BTF_STR_SEC("\0.bss\0t"),
6660 .dont_resolve_fwds
= false,
6661 .dedup_table_size
= 1
6667 static int btf_type_size(const struct btf_type
*t
)
6669 int base_size
= sizeof(struct btf_type
);
6670 __u16 vlen
= BTF_INFO_VLEN(t
->info
);
6671 __u16 kind
= BTF_INFO_KIND(t
->info
);
6675 case BTF_KIND_CONST
:
6676 case BTF_KIND_VOLATILE
:
6677 case BTF_KIND_RESTRICT
:
6679 case BTF_KIND_TYPEDEF
:
6683 return base_size
+ sizeof(__u32
);
6685 return base_size
+ vlen
* sizeof(struct btf_enum
);
6686 case BTF_KIND_ARRAY
:
6687 return base_size
+ sizeof(struct btf_array
);
6688 case BTF_KIND_STRUCT
:
6689 case BTF_KIND_UNION
:
6690 return base_size
+ vlen
* sizeof(struct btf_member
);
6691 case BTF_KIND_FUNC_PROTO
:
6692 return base_size
+ vlen
* sizeof(struct btf_param
);
6694 return base_size
+ sizeof(struct btf_var
);
6695 case BTF_KIND_DATASEC
:
6696 return base_size
+ vlen
* sizeof(struct btf_var_secinfo
);
6698 fprintf(stderr
, "Unsupported BTF_KIND:%u\n", kind
);
6703 static void dump_btf_strings(const char *strs
, __u32 len
)
6705 const char *cur
= strs
;
6708 while (cur
< strs
+ len
) {
6709 fprintf(stderr
, "string #%d: '%s'\n", i
, cur
);
6710 cur
+= strlen(cur
) + 1;
6715 static int do_test_dedup(unsigned int test_num
)
6717 const struct btf_dedup_test
*test
= &dedup_tests
[test_num
- 1];
6718 __u32 test_nr_types
, expect_nr_types
, test_btf_size
, expect_btf_size
;
6719 const struct btf_header
*test_hdr
, *expect_hdr
;
6720 struct btf
*test_btf
= NULL
, *expect_btf
= NULL
;
6721 const void *test_btf_data
, *expect_btf_data
;
6722 const char *ret_test_next_str
, *ret_expect_next_str
;
6723 const char *test_strs
, *expect_strs
;
6724 const char *test_str_cur
, *test_str_end
;
6725 const char *expect_str_cur
, *expect_str_end
;
6726 unsigned int raw_btf_size
;
6730 fprintf(stderr
, "BTF dedup test[%u] (%s):", test_num
, test
->descr
);
6732 raw_btf
= btf_raw_create(&hdr_tmpl
, test
->input
.raw_types
,
6733 test
->input
.str_sec
, test
->input
.str_sec_size
,
6734 &raw_btf_size
, &ret_test_next_str
);
6737 test_btf
= btf__new((__u8
*)raw_btf
, raw_btf_size
);
6739 if (CHECK(IS_ERR(test_btf
), "invalid test_btf errno:%ld",
6740 PTR_ERR(test_btf
))) {
6745 raw_btf
= btf_raw_create(&hdr_tmpl
, test
->expect
.raw_types
,
6746 test
->expect
.str_sec
,
6747 test
->expect
.str_sec_size
,
6748 &raw_btf_size
, &ret_expect_next_str
);
6751 expect_btf
= btf__new((__u8
*)raw_btf
, raw_btf_size
);
6753 if (CHECK(IS_ERR(expect_btf
), "invalid expect_btf errno:%ld",
6754 PTR_ERR(expect_btf
))) {
6759 err
= btf__dedup(test_btf
, NULL
, &test
->opts
);
6760 if (CHECK(err
, "btf_dedup failed errno:%d", err
)) {
6765 test_btf_data
= btf__get_raw_data(test_btf
, &test_btf_size
);
6766 expect_btf_data
= btf__get_raw_data(expect_btf
, &expect_btf_size
);
6767 if (CHECK(test_btf_size
!= expect_btf_size
,
6768 "test_btf_size:%u != expect_btf_size:%u",
6769 test_btf_size
, expect_btf_size
)) {
6774 test_hdr
= test_btf_data
;
6775 test_strs
= test_btf_data
+ sizeof(*test_hdr
) + test_hdr
->str_off
;
6776 expect_hdr
= expect_btf_data
;
6777 expect_strs
= expect_btf_data
+ sizeof(*test_hdr
) + expect_hdr
->str_off
;
6778 if (CHECK(test_hdr
->str_len
!= expect_hdr
->str_len
,
6779 "test_hdr->str_len:%u != expect_hdr->str_len:%u",
6780 test_hdr
->str_len
, expect_hdr
->str_len
)) {
6781 fprintf(stderr
, "\ntest strings:\n");
6782 dump_btf_strings(test_strs
, test_hdr
->str_len
);
6783 fprintf(stderr
, "\nexpected strings:\n");
6784 dump_btf_strings(expect_strs
, expect_hdr
->str_len
);
6789 test_str_cur
= test_strs
;
6790 test_str_end
= test_strs
+ test_hdr
->str_len
;
6791 expect_str_cur
= expect_strs
;
6792 expect_str_end
= expect_strs
+ expect_hdr
->str_len
;
6793 while (test_str_cur
< test_str_end
&& expect_str_cur
< expect_str_end
) {
6794 size_t test_len
, expect_len
;
6796 test_len
= strlen(test_str_cur
);
6797 expect_len
= strlen(expect_str_cur
);
6798 if (CHECK(test_len
!= expect_len
,
6799 "test_len:%zu != expect_len:%zu "
6800 "(test_str:%s, expect_str:%s)",
6801 test_len
, expect_len
, test_str_cur
, expect_str_cur
)) {
6805 if (CHECK(strcmp(test_str_cur
, expect_str_cur
),
6806 "test_str:%s != expect_str:%s",
6807 test_str_cur
, expect_str_cur
)) {
6811 test_str_cur
+= test_len
+ 1;
6812 expect_str_cur
+= expect_len
+ 1;
6814 if (CHECK(test_str_cur
!= test_str_end
,
6815 "test_str_cur:%p != test_str_end:%p",
6816 test_str_cur
, test_str_end
)) {
6821 test_nr_types
= btf__get_nr_types(test_btf
);
6822 expect_nr_types
= btf__get_nr_types(expect_btf
);
6823 if (CHECK(test_nr_types
!= expect_nr_types
,
6824 "test_nr_types:%u != expect_nr_types:%u",
6825 test_nr_types
, expect_nr_types
)) {
6830 for (i
= 1; i
<= test_nr_types
; i
++) {
6831 const struct btf_type
*test_type
, *expect_type
;
6832 int test_size
, expect_size
;
6834 test_type
= btf__type_by_id(test_btf
, i
);
6835 expect_type
= btf__type_by_id(expect_btf
, i
);
6836 test_size
= btf_type_size(test_type
);
6837 expect_size
= btf_type_size(expect_type
);
6839 if (CHECK(test_size
!= expect_size
,
6840 "type #%d: test_size:%d != expect_size:%u",
6841 i
, test_size
, expect_size
)) {
6845 if (CHECK(memcmp((void *)test_type
,
6846 (void *)expect_type
,
6848 "type #%d: contents differ", i
)) {
6856 fprintf(stderr
, "OK");
6857 if (!IS_ERR(test_btf
))
6858 btf__free(test_btf
);
6859 if (!IS_ERR(expect_btf
))
6860 btf__free(expect_btf
);
6865 static int test_dedup(void)
6870 if (args
.dedup_test_num
)
6871 return count_result(do_test_dedup(args
.dedup_test_num
));
6873 for (i
= 1; i
<= ARRAY_SIZE(dedup_tests
); i
++)
6874 err
|= count_result(do_test_dedup(i
));
6879 static void usage(const char *cmd
)
6881 fprintf(stderr
, "Usage: %s [-l] [[-r btf_raw_test_num (1 - %zu)] |\n"
6882 "\t[-g btf_get_info_test_num (1 - %zu)] |\n"
6883 "\t[-f btf_file_test_num (1 - %zu)] |\n"
6884 "\t[-k btf_prog_info_raw_test_num (1 - %zu)] |\n"
6885 "\t[-p (pretty print test)] |\n"
6886 "\t[-d btf_dedup_test_num (1 - %zu)]]\n",
6887 cmd
, ARRAY_SIZE(raw_tests
), ARRAY_SIZE(get_info_tests
),
6888 ARRAY_SIZE(file_tests
), ARRAY_SIZE(info_raw_tests
),
6889 ARRAY_SIZE(dedup_tests
));
6892 static int parse_args(int argc
, char **argv
)
6894 const char *optstr
= "hlpk:f:r:g:d:";
6897 while ((opt
= getopt(argc
, argv
, optstr
)) != -1) {
6900 args
.always_log
= true;
6903 args
.file_test_num
= atoi(optarg
);
6904 args
.file_test
= true;
6907 args
.raw_test_num
= atoi(optarg
);
6908 args
.raw_test
= true;
6911 args
.get_info_test_num
= atoi(optarg
);
6912 args
.get_info_test
= true;
6915 args
.pprint_test
= true;
6918 args
.info_raw_test_num
= atoi(optarg
);
6919 args
.info_raw_test
= true;
6922 args
.dedup_test_num
= atoi(optarg
);
6923 args
.dedup_test
= true;
6934 if (args
.raw_test_num
&&
6935 (args
.raw_test_num
< 1 ||
6936 args
.raw_test_num
> ARRAY_SIZE(raw_tests
))) {
6937 fprintf(stderr
, "BTF raw test number must be [1 - %zu]\n",
6938 ARRAY_SIZE(raw_tests
));
6942 if (args
.file_test_num
&&
6943 (args
.file_test_num
< 1 ||
6944 args
.file_test_num
> ARRAY_SIZE(file_tests
))) {
6945 fprintf(stderr
, "BTF file test number must be [1 - %zu]\n",
6946 ARRAY_SIZE(file_tests
));
6950 if (args
.get_info_test_num
&&
6951 (args
.get_info_test_num
< 1 ||
6952 args
.get_info_test_num
> ARRAY_SIZE(get_info_tests
))) {
6953 fprintf(stderr
, "BTF get info test number must be [1 - %zu]\n",
6954 ARRAY_SIZE(get_info_tests
));
6958 if (args
.info_raw_test_num
&&
6959 (args
.info_raw_test_num
< 1 ||
6960 args
.info_raw_test_num
> ARRAY_SIZE(info_raw_tests
))) {
6961 fprintf(stderr
, "BTF prog info raw test number must be [1 - %zu]\n",
6962 ARRAY_SIZE(info_raw_tests
));
6966 if (args
.dedup_test_num
&&
6967 (args
.dedup_test_num
< 1 ||
6968 args
.dedup_test_num
> ARRAY_SIZE(dedup_tests
))) {
6969 fprintf(stderr
, "BTF dedup test number must be [1 - %zu]\n",
6970 ARRAY_SIZE(dedup_tests
));
6977 static void print_summary(void)
6979 fprintf(stderr
, "PASS:%u SKIP:%u FAIL:%u\n",
6980 pass_cnt
- skip_cnt
, skip_cnt
, error_cnt
);
6983 int main(int argc
, char **argv
)
6987 err
= parse_args(argc
, argv
);
6991 if (args
.always_log
)
6992 libbpf_set_print(__base_pr
);
6997 if (args
.get_info_test
)
6998 err
|= test_get_info();
7003 if (args
.pprint_test
)
7004 err
|= test_pprint();
7006 if (args
.info_raw_test
)
7007 err
|= test_info_raw();
7009 if (args
.dedup_test
)
7010 err
|= test_dedup();
7012 if (args
.raw_test
|| args
.get_info_test
|| args
.file_test
||
7013 args
.pprint_test
|| args
.info_raw_test
|| args
.dedup_test
)
7017 err
|= test_get_info();
7019 err
|= test_info_raw();
7020 err
|= test_dedup();