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