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 }, 390635baba7aSYonghong Song 3907c64779e2SAndrii Nakryiko }; /* struct btf_raw_test raw_tests[] */ 3908c64779e2SAndrii Nakryiko 3909c64779e2SAndrii Nakryiko static const char *get_next_str(const char *start, const char *end) 3910c64779e2SAndrii Nakryiko { 3911c64779e2SAndrii Nakryiko return start < end - 1 ? start + 1 : NULL; 3912c64779e2SAndrii Nakryiko } 3913c64779e2SAndrii Nakryiko 3914c64779e2SAndrii Nakryiko static int get_raw_sec_size(const __u32 *raw_types) 3915c64779e2SAndrii Nakryiko { 3916c64779e2SAndrii Nakryiko int i; 3917c64779e2SAndrii Nakryiko 3918c64779e2SAndrii Nakryiko for (i = MAX_NR_RAW_U32 - 1; 3919c64779e2SAndrii Nakryiko i >= 0 && raw_types[i] != BTF_END_RAW; 3920c64779e2SAndrii Nakryiko i--) 3921c64779e2SAndrii Nakryiko ; 3922c64779e2SAndrii Nakryiko 3923c64779e2SAndrii Nakryiko return i < 0 ? i : i * sizeof(raw_types[0]); 3924c64779e2SAndrii Nakryiko } 3925c64779e2SAndrii Nakryiko 3926c64779e2SAndrii Nakryiko static void *btf_raw_create(const struct btf_header *hdr, 3927c64779e2SAndrii Nakryiko const __u32 *raw_types, 3928c64779e2SAndrii Nakryiko const char *str, 3929c64779e2SAndrii Nakryiko unsigned int str_sec_size, 3930c64779e2SAndrii Nakryiko unsigned int *btf_size, 3931c64779e2SAndrii Nakryiko const char **ret_next_str) 3932c64779e2SAndrii Nakryiko { 3933c64779e2SAndrii Nakryiko const char *next_str = str, *end_str = str + str_sec_size; 3934c64779e2SAndrii Nakryiko const char **strs_idx = NULL, **tmp_strs_idx; 3935c64779e2SAndrii Nakryiko int strs_cap = 0, strs_cnt = 0, next_str_idx = 0; 3936c64779e2SAndrii Nakryiko unsigned int size_needed, offset; 3937c64779e2SAndrii Nakryiko struct btf_header *ret_hdr; 3938c64779e2SAndrii Nakryiko int i, type_sec_size, err = 0; 3939c64779e2SAndrii Nakryiko uint32_t *ret_types; 3940c64779e2SAndrii Nakryiko void *raw_btf = NULL; 3941c64779e2SAndrii Nakryiko 3942c64779e2SAndrii Nakryiko type_sec_size = get_raw_sec_size(raw_types); 3943c64779e2SAndrii Nakryiko if (CHECK(type_sec_size < 0, "Cannot get nr_raw_types")) 3944c64779e2SAndrii Nakryiko return NULL; 3945c64779e2SAndrii Nakryiko 3946c64779e2SAndrii Nakryiko size_needed = sizeof(*hdr) + type_sec_size + str_sec_size; 3947c64779e2SAndrii Nakryiko raw_btf = malloc(size_needed); 3948c64779e2SAndrii Nakryiko if (CHECK(!raw_btf, "Cannot allocate memory for raw_btf")) 3949c64779e2SAndrii Nakryiko return NULL; 3950c64779e2SAndrii Nakryiko 3951c64779e2SAndrii Nakryiko /* Copy header */ 3952c64779e2SAndrii Nakryiko memcpy(raw_btf, hdr, sizeof(*hdr)); 3953c64779e2SAndrii Nakryiko offset = sizeof(*hdr); 3954c64779e2SAndrii Nakryiko 3955c64779e2SAndrii Nakryiko /* Index strings */ 3956c64779e2SAndrii Nakryiko while ((next_str = get_next_str(next_str, end_str))) { 3957c64779e2SAndrii Nakryiko if (strs_cnt == strs_cap) { 3958c64779e2SAndrii Nakryiko strs_cap += max(16, strs_cap / 2); 3959c64779e2SAndrii Nakryiko tmp_strs_idx = realloc(strs_idx, 3960c64779e2SAndrii Nakryiko sizeof(*strs_idx) * strs_cap); 3961c64779e2SAndrii Nakryiko if (CHECK(!tmp_strs_idx, 3962c64779e2SAndrii Nakryiko "Cannot allocate memory for strs_idx")) { 3963c64779e2SAndrii Nakryiko err = -1; 3964c64779e2SAndrii Nakryiko goto done; 3965c64779e2SAndrii Nakryiko } 3966c64779e2SAndrii Nakryiko strs_idx = tmp_strs_idx; 3967c64779e2SAndrii Nakryiko } 3968c64779e2SAndrii Nakryiko strs_idx[strs_cnt++] = next_str; 3969c64779e2SAndrii Nakryiko next_str += strlen(next_str); 3970c64779e2SAndrii Nakryiko } 3971c64779e2SAndrii Nakryiko 3972c64779e2SAndrii Nakryiko /* Copy type section */ 3973c64779e2SAndrii Nakryiko ret_types = raw_btf + offset; 3974c64779e2SAndrii Nakryiko for (i = 0; i < type_sec_size / sizeof(raw_types[0]); i++) { 3975c64779e2SAndrii Nakryiko if (raw_types[i] == NAME_TBD) { 3976c64779e2SAndrii Nakryiko if (CHECK(next_str_idx == strs_cnt, 3977c64779e2SAndrii Nakryiko "Error in getting next_str #%d", 3978c64779e2SAndrii Nakryiko next_str_idx)) { 3979c64779e2SAndrii Nakryiko err = -1; 3980c64779e2SAndrii Nakryiko goto done; 3981c64779e2SAndrii Nakryiko } 3982c64779e2SAndrii Nakryiko ret_types[i] = strs_idx[next_str_idx++] - str; 3983c64779e2SAndrii Nakryiko } else if (IS_NAME_NTH(raw_types[i])) { 3984c64779e2SAndrii Nakryiko int idx = GET_NAME_NTH_IDX(raw_types[i]); 3985c64779e2SAndrii Nakryiko 3986c64779e2SAndrii Nakryiko if (CHECK(idx <= 0 || idx > strs_cnt, 3987c64779e2SAndrii Nakryiko "Error getting string #%d, strs_cnt:%d", 3988c64779e2SAndrii Nakryiko idx, strs_cnt)) { 3989c64779e2SAndrii Nakryiko err = -1; 3990c64779e2SAndrii Nakryiko goto done; 3991c64779e2SAndrii Nakryiko } 3992c64779e2SAndrii Nakryiko ret_types[i] = strs_idx[idx-1] - str; 3993c64779e2SAndrii Nakryiko } else { 3994c64779e2SAndrii Nakryiko ret_types[i] = raw_types[i]; 3995c64779e2SAndrii Nakryiko } 3996c64779e2SAndrii Nakryiko } 3997c64779e2SAndrii Nakryiko offset += type_sec_size; 3998c64779e2SAndrii Nakryiko 3999c64779e2SAndrii Nakryiko /* Copy string section */ 4000c64779e2SAndrii Nakryiko memcpy(raw_btf + offset, str, str_sec_size); 4001c64779e2SAndrii Nakryiko 4002c64779e2SAndrii Nakryiko ret_hdr = (struct btf_header *)raw_btf; 4003c64779e2SAndrii Nakryiko ret_hdr->type_len = type_sec_size; 4004c64779e2SAndrii Nakryiko ret_hdr->str_off = type_sec_size; 4005c64779e2SAndrii Nakryiko ret_hdr->str_len = str_sec_size; 4006c64779e2SAndrii Nakryiko 4007c64779e2SAndrii Nakryiko *btf_size = size_needed; 4008c64779e2SAndrii Nakryiko if (ret_next_str) 4009c64779e2SAndrii Nakryiko *ret_next_str = 4010c64779e2SAndrii Nakryiko next_str_idx < strs_cnt ? strs_idx[next_str_idx] : NULL; 4011c64779e2SAndrii Nakryiko 4012c64779e2SAndrii Nakryiko done: 4013c64779e2SAndrii Nakryiko if (err) { 4014c64779e2SAndrii Nakryiko if (raw_btf) 4015c64779e2SAndrii Nakryiko free(raw_btf); 4016c64779e2SAndrii Nakryiko if (strs_idx) 4017c64779e2SAndrii Nakryiko free(strs_idx); 4018c64779e2SAndrii Nakryiko return NULL; 4019c64779e2SAndrii Nakryiko } 4020c64779e2SAndrii Nakryiko return raw_btf; 4021c64779e2SAndrii Nakryiko } 4022c64779e2SAndrii Nakryiko 4023c64779e2SAndrii Nakryiko static void do_test_raw(unsigned int test_num) 4024c64779e2SAndrii Nakryiko { 4025c64779e2SAndrii Nakryiko struct btf_raw_test *test = &raw_tests[test_num - 1]; 4026c64779e2SAndrii Nakryiko struct bpf_create_map_attr create_attr = {}; 4027c64779e2SAndrii Nakryiko int map_fd = -1, btf_fd = -1; 4028c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4029c64779e2SAndrii Nakryiko struct btf_header *hdr; 4030c64779e2SAndrii Nakryiko void *raw_btf; 4031c64779e2SAndrii Nakryiko int err; 4032c64779e2SAndrii Nakryiko 4033c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 4034c64779e2SAndrii Nakryiko return; 4035c64779e2SAndrii Nakryiko 4036c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4037c64779e2SAndrii Nakryiko test->raw_types, 4038c64779e2SAndrii Nakryiko test->str_sec, 4039c64779e2SAndrii Nakryiko test->str_sec_size, 4040c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4041c64779e2SAndrii Nakryiko if (!raw_btf) 4042c64779e2SAndrii Nakryiko return; 4043c64779e2SAndrii Nakryiko 4044c64779e2SAndrii Nakryiko hdr = raw_btf; 4045c64779e2SAndrii Nakryiko 4046c64779e2SAndrii Nakryiko hdr->hdr_len = (int)hdr->hdr_len + test->hdr_len_delta; 4047c64779e2SAndrii Nakryiko hdr->type_off = (int)hdr->type_off + test->type_off_delta; 4048c64779e2SAndrii Nakryiko hdr->str_off = (int)hdr->str_off + test->str_off_delta; 4049c64779e2SAndrii Nakryiko hdr->str_len = (int)hdr->str_len + test->str_len_delta; 4050c64779e2SAndrii Nakryiko 4051c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4052c64779e2SAndrii Nakryiko btf_fd = bpf_load_btf(raw_btf, raw_btf_size, 4053c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 4054c64779e2SAndrii Nakryiko always_log); 4055c64779e2SAndrii Nakryiko free(raw_btf); 4056c64779e2SAndrii Nakryiko 4057bad2e478SAndrii Nakryiko err = ((btf_fd < 0) != test->btf_load_err); 4058c64779e2SAndrii Nakryiko if (CHECK(err, "btf_fd:%d test->btf_load_err:%u", 4059c64779e2SAndrii Nakryiko btf_fd, test->btf_load_err) || 4060c64779e2SAndrii Nakryiko CHECK(test->err_str && !strstr(btf_log_buf, test->err_str), 4061c64779e2SAndrii Nakryiko "expected err_str:%s", test->err_str)) { 4062c64779e2SAndrii Nakryiko err = -1; 4063c64779e2SAndrii Nakryiko goto done; 4064c64779e2SAndrii Nakryiko } 4065c64779e2SAndrii Nakryiko 4066bad2e478SAndrii Nakryiko if (err || btf_fd < 0) 4067c64779e2SAndrii Nakryiko goto done; 4068c64779e2SAndrii Nakryiko 4069c64779e2SAndrii Nakryiko create_attr.name = test->map_name; 4070c64779e2SAndrii Nakryiko create_attr.map_type = test->map_type; 4071c64779e2SAndrii Nakryiko create_attr.key_size = test->key_size; 4072c64779e2SAndrii Nakryiko create_attr.value_size = test->value_size; 4073c64779e2SAndrii Nakryiko create_attr.max_entries = test->max_entries; 4074c64779e2SAndrii Nakryiko create_attr.btf_fd = btf_fd; 4075c64779e2SAndrii Nakryiko create_attr.btf_key_type_id = test->key_type_id; 4076c64779e2SAndrii Nakryiko create_attr.btf_value_type_id = test->value_type_id; 4077c64779e2SAndrii Nakryiko 4078c64779e2SAndrii Nakryiko map_fd = bpf_create_map_xattr(&create_attr); 4079c64779e2SAndrii Nakryiko 4080bad2e478SAndrii Nakryiko err = ((map_fd < 0) != test->map_create_err); 4081c64779e2SAndrii Nakryiko CHECK(err, "map_fd:%d test->map_create_err:%u", 4082c64779e2SAndrii Nakryiko map_fd, test->map_create_err); 4083c64779e2SAndrii Nakryiko 4084c64779e2SAndrii Nakryiko done: 4085c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4086c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4087bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4088c64779e2SAndrii Nakryiko close(btf_fd); 4089bad2e478SAndrii Nakryiko if (map_fd >= 0) 4090c64779e2SAndrii Nakryiko close(map_fd); 4091c64779e2SAndrii Nakryiko } 4092c64779e2SAndrii Nakryiko 4093c64779e2SAndrii Nakryiko struct btf_get_info_test { 4094c64779e2SAndrii Nakryiko const char *descr; 4095c64779e2SAndrii Nakryiko const char *str_sec; 4096c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 4097c64779e2SAndrii Nakryiko __u32 str_sec_size; 4098c64779e2SAndrii Nakryiko int btf_size_delta; 4099c64779e2SAndrii Nakryiko int (*special_test)(unsigned int test_num); 4100c64779e2SAndrii Nakryiko }; 4101c64779e2SAndrii Nakryiko 4102c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num); 4103c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num); 4104c64779e2SAndrii Nakryiko 4105c64779e2SAndrii Nakryiko const struct btf_get_info_test get_info_tests[] = { 4106c64779e2SAndrii Nakryiko { 4107c64779e2SAndrii Nakryiko .descr = "== raw_btf_size+1", 4108c64779e2SAndrii Nakryiko .raw_types = { 4109c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4110c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4111c64779e2SAndrii Nakryiko BTF_END_RAW, 4112c64779e2SAndrii Nakryiko }, 4113c64779e2SAndrii Nakryiko .str_sec = "", 4114c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4115c64779e2SAndrii Nakryiko .btf_size_delta = 1, 4116c64779e2SAndrii Nakryiko }, 4117c64779e2SAndrii Nakryiko { 4118c64779e2SAndrii Nakryiko .descr = "== raw_btf_size-3", 4119c64779e2SAndrii Nakryiko .raw_types = { 4120c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4121c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4122c64779e2SAndrii Nakryiko BTF_END_RAW, 4123c64779e2SAndrii Nakryiko }, 4124c64779e2SAndrii Nakryiko .str_sec = "", 4125c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4126c64779e2SAndrii Nakryiko .btf_size_delta = -3, 4127c64779e2SAndrii Nakryiko }, 4128c64779e2SAndrii Nakryiko { 4129c64779e2SAndrii Nakryiko .descr = "Large bpf_btf_info", 4130c64779e2SAndrii Nakryiko .raw_types = { 4131c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4132c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4133c64779e2SAndrii Nakryiko BTF_END_RAW, 4134c64779e2SAndrii Nakryiko }, 4135c64779e2SAndrii Nakryiko .str_sec = "", 4136c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4137c64779e2SAndrii Nakryiko .special_test = test_big_btf_info, 4138c64779e2SAndrii Nakryiko }, 4139c64779e2SAndrii Nakryiko { 4140c64779e2SAndrii Nakryiko .descr = "BTF ID", 4141c64779e2SAndrii Nakryiko .raw_types = { 4142c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4143c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4144c64779e2SAndrii Nakryiko /* unsigned int */ /* [2] */ 4145c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), 4146c64779e2SAndrii Nakryiko BTF_END_RAW, 4147c64779e2SAndrii Nakryiko }, 4148c64779e2SAndrii Nakryiko .str_sec = "", 4149c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4150c64779e2SAndrii Nakryiko .special_test = test_btf_id, 4151c64779e2SAndrii Nakryiko }, 4152c64779e2SAndrii Nakryiko }; 4153c64779e2SAndrii Nakryiko 4154c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num) 4155c64779e2SAndrii Nakryiko { 4156c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 4157c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf = NULL; 4158c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4159c64779e2SAndrii Nakryiko struct { 4160c64779e2SAndrii Nakryiko struct bpf_btf_info info; 4161c64779e2SAndrii Nakryiko uint64_t garbage; 4162c64779e2SAndrii Nakryiko } info_garbage; 4163c64779e2SAndrii Nakryiko struct bpf_btf_info *info; 4164c64779e2SAndrii Nakryiko int btf_fd = -1, err; 4165c64779e2SAndrii Nakryiko uint32_t info_len; 4166c64779e2SAndrii Nakryiko 4167c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4168c64779e2SAndrii Nakryiko test->raw_types, 4169c64779e2SAndrii Nakryiko test->str_sec, 4170c64779e2SAndrii Nakryiko test->str_sec_size, 4171c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4172c64779e2SAndrii Nakryiko 4173c64779e2SAndrii Nakryiko if (!raw_btf) 4174c64779e2SAndrii Nakryiko return -1; 4175c64779e2SAndrii Nakryiko 4176c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4177c64779e2SAndrii Nakryiko 4178c64779e2SAndrii Nakryiko user_btf = malloc(raw_btf_size); 4179c64779e2SAndrii Nakryiko if (CHECK(!user_btf, "!user_btf")) { 4180c64779e2SAndrii Nakryiko err = -1; 4181c64779e2SAndrii Nakryiko goto done; 4182c64779e2SAndrii Nakryiko } 4183c64779e2SAndrii Nakryiko 4184c64779e2SAndrii Nakryiko btf_fd = bpf_load_btf(raw_btf, raw_btf_size, 4185c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 4186c64779e2SAndrii Nakryiko always_log); 4187bad2e478SAndrii Nakryiko if (CHECK(btf_fd < 0, "errno:%d", errno)) { 4188c64779e2SAndrii Nakryiko err = -1; 4189c64779e2SAndrii Nakryiko goto done; 4190c64779e2SAndrii Nakryiko } 4191c64779e2SAndrii Nakryiko 4192c64779e2SAndrii Nakryiko /* 4193c64779e2SAndrii Nakryiko * GET_INFO should error out if the userspace info 4194c64779e2SAndrii Nakryiko * has non zero tailing bytes. 4195c64779e2SAndrii Nakryiko */ 4196c64779e2SAndrii Nakryiko info = &info_garbage.info; 4197c64779e2SAndrii Nakryiko memset(info, 0, sizeof(*info)); 4198c64779e2SAndrii Nakryiko info_garbage.garbage = 0xdeadbeef; 4199c64779e2SAndrii Nakryiko info_len = sizeof(info_garbage); 4200c64779e2SAndrii Nakryiko info->btf = ptr_to_u64(user_btf); 4201c64779e2SAndrii Nakryiko info->btf_size = raw_btf_size; 4202c64779e2SAndrii Nakryiko 4203c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len); 4204c64779e2SAndrii Nakryiko if (CHECK(!err, "!err")) { 4205c64779e2SAndrii Nakryiko err = -1; 4206c64779e2SAndrii Nakryiko goto done; 4207c64779e2SAndrii Nakryiko } 4208c64779e2SAndrii Nakryiko 4209c64779e2SAndrii Nakryiko /* 4210c64779e2SAndrii Nakryiko * GET_INFO should succeed even info_len is larger than 4211c64779e2SAndrii Nakryiko * the kernel supported as long as tailing bytes are zero. 4212c64779e2SAndrii Nakryiko * The kernel supported info len should also be returned 4213c64779e2SAndrii Nakryiko * to userspace. 4214c64779e2SAndrii Nakryiko */ 4215c64779e2SAndrii Nakryiko info_garbage.garbage = 0; 4216c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len); 4217c64779e2SAndrii Nakryiko if (CHECK(err || info_len != sizeof(*info), 4218c64779e2SAndrii Nakryiko "err:%d errno:%d info_len:%u sizeof(*info):%zu", 4219c64779e2SAndrii Nakryiko err, errno, info_len, sizeof(*info))) { 4220c64779e2SAndrii Nakryiko err = -1; 4221c64779e2SAndrii Nakryiko goto done; 4222c64779e2SAndrii Nakryiko } 4223c64779e2SAndrii Nakryiko 4224c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4225c64779e2SAndrii Nakryiko 4226c64779e2SAndrii Nakryiko done: 4227c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4228c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4229c64779e2SAndrii Nakryiko 4230c64779e2SAndrii Nakryiko free(raw_btf); 4231c64779e2SAndrii Nakryiko free(user_btf); 4232c64779e2SAndrii Nakryiko 4233bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4234c64779e2SAndrii Nakryiko close(btf_fd); 4235c64779e2SAndrii Nakryiko 4236c64779e2SAndrii Nakryiko return err; 4237c64779e2SAndrii Nakryiko } 4238c64779e2SAndrii Nakryiko 4239c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num) 4240c64779e2SAndrii Nakryiko { 4241c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 4242c64779e2SAndrii Nakryiko struct bpf_create_map_attr create_attr = {}; 4243c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf[2] = {}; 4244c64779e2SAndrii Nakryiko int btf_fd[2] = {-1, -1}, map_fd = -1; 4245c64779e2SAndrii Nakryiko struct bpf_map_info map_info = {}; 4246c64779e2SAndrii Nakryiko struct bpf_btf_info info[2] = {}; 4247c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4248c64779e2SAndrii Nakryiko uint32_t info_len; 4249c64779e2SAndrii Nakryiko int err, i, ret; 4250c64779e2SAndrii Nakryiko 4251c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4252c64779e2SAndrii Nakryiko test->raw_types, 4253c64779e2SAndrii Nakryiko test->str_sec, 4254c64779e2SAndrii Nakryiko test->str_sec_size, 4255c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4256c64779e2SAndrii Nakryiko 4257c64779e2SAndrii Nakryiko if (!raw_btf) 4258c64779e2SAndrii Nakryiko return -1; 4259c64779e2SAndrii Nakryiko 4260c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4261c64779e2SAndrii Nakryiko 4262c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4263c64779e2SAndrii Nakryiko user_btf[i] = malloc(raw_btf_size); 4264c64779e2SAndrii Nakryiko if (CHECK(!user_btf[i], "!user_btf[%d]", i)) { 4265c64779e2SAndrii Nakryiko err = -1; 4266c64779e2SAndrii Nakryiko goto done; 4267c64779e2SAndrii Nakryiko } 4268c64779e2SAndrii Nakryiko info[i].btf = ptr_to_u64(user_btf[i]); 4269c64779e2SAndrii Nakryiko info[i].btf_size = raw_btf_size; 4270c64779e2SAndrii Nakryiko } 4271c64779e2SAndrii Nakryiko 4272c64779e2SAndrii Nakryiko btf_fd[0] = bpf_load_btf(raw_btf, raw_btf_size, 4273c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 4274c64779e2SAndrii Nakryiko always_log); 4275bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) { 4276c64779e2SAndrii Nakryiko err = -1; 4277c64779e2SAndrii Nakryiko goto done; 4278c64779e2SAndrii Nakryiko } 4279c64779e2SAndrii Nakryiko 4280c64779e2SAndrii Nakryiko /* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */ 4281c64779e2SAndrii Nakryiko info_len = sizeof(info[0]); 4282c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd[0], &info[0], &info_len); 4283c64779e2SAndrii Nakryiko if (CHECK(err, "errno:%d", errno)) { 4284c64779e2SAndrii Nakryiko err = -1; 4285c64779e2SAndrii Nakryiko goto done; 4286c64779e2SAndrii Nakryiko } 4287c64779e2SAndrii Nakryiko 4288c64779e2SAndrii Nakryiko btf_fd[1] = bpf_btf_get_fd_by_id(info[0].id); 4289bad2e478SAndrii Nakryiko if (CHECK(btf_fd[1] < 0, "errno:%d", errno)) { 4290c64779e2SAndrii Nakryiko err = -1; 4291c64779e2SAndrii Nakryiko goto done; 4292c64779e2SAndrii Nakryiko } 4293c64779e2SAndrii Nakryiko 4294c64779e2SAndrii Nakryiko ret = 0; 4295c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd[1], &info[1], &info_len); 4296c64779e2SAndrii Nakryiko if (CHECK(err || info[0].id != info[1].id || 4297c64779e2SAndrii Nakryiko info[0].btf_size != info[1].btf_size || 4298c64779e2SAndrii Nakryiko (ret = memcmp(user_btf[0], user_btf[1], info[0].btf_size)), 4299c64779e2SAndrii Nakryiko "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d", 4300c64779e2SAndrii Nakryiko err, errno, info[0].id, info[1].id, 4301c64779e2SAndrii Nakryiko info[0].btf_size, info[1].btf_size, ret)) { 4302c64779e2SAndrii Nakryiko err = -1; 4303c64779e2SAndrii Nakryiko goto done; 4304c64779e2SAndrii Nakryiko } 4305c64779e2SAndrii Nakryiko 4306c64779e2SAndrii Nakryiko /* Test btf members in struct bpf_map_info */ 4307c64779e2SAndrii Nakryiko create_attr.name = "test_btf_id"; 4308c64779e2SAndrii Nakryiko create_attr.map_type = BPF_MAP_TYPE_ARRAY; 4309c64779e2SAndrii Nakryiko create_attr.key_size = sizeof(int); 4310c64779e2SAndrii Nakryiko create_attr.value_size = sizeof(unsigned int); 4311c64779e2SAndrii Nakryiko create_attr.max_entries = 4; 4312c64779e2SAndrii Nakryiko create_attr.btf_fd = btf_fd[0]; 4313c64779e2SAndrii Nakryiko create_attr.btf_key_type_id = 1; 4314c64779e2SAndrii Nakryiko create_attr.btf_value_type_id = 2; 4315c64779e2SAndrii Nakryiko 4316c64779e2SAndrii Nakryiko map_fd = bpf_create_map_xattr(&create_attr); 4317bad2e478SAndrii Nakryiko if (CHECK(map_fd < 0, "errno:%d", errno)) { 4318c64779e2SAndrii Nakryiko err = -1; 4319c64779e2SAndrii Nakryiko goto done; 4320c64779e2SAndrii Nakryiko } 4321c64779e2SAndrii Nakryiko 4322c64779e2SAndrii Nakryiko info_len = sizeof(map_info); 4323c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(map_fd, &map_info, &info_len); 4324c64779e2SAndrii Nakryiko if (CHECK(err || map_info.btf_id != info[0].id || 4325c64779e2SAndrii Nakryiko map_info.btf_key_type_id != 1 || map_info.btf_value_type_id != 2, 4326c64779e2SAndrii Nakryiko "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u", 4327c64779e2SAndrii Nakryiko err, errno, info[0].id, map_info.btf_id, map_info.btf_key_type_id, 4328c64779e2SAndrii Nakryiko map_info.btf_value_type_id)) { 4329c64779e2SAndrii Nakryiko err = -1; 4330c64779e2SAndrii Nakryiko goto done; 4331c64779e2SAndrii Nakryiko } 4332c64779e2SAndrii Nakryiko 4333c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4334c64779e2SAndrii Nakryiko close(btf_fd[i]); 4335c64779e2SAndrii Nakryiko btf_fd[i] = -1; 4336c64779e2SAndrii Nakryiko } 4337c64779e2SAndrii Nakryiko 4338c64779e2SAndrii Nakryiko /* Test BTF ID is removed from the kernel */ 4339c64779e2SAndrii Nakryiko btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id); 4340bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) { 4341c64779e2SAndrii Nakryiko err = -1; 4342c64779e2SAndrii Nakryiko goto done; 4343c64779e2SAndrii Nakryiko } 4344c64779e2SAndrii Nakryiko close(btf_fd[0]); 4345c64779e2SAndrii Nakryiko btf_fd[0] = -1; 4346c64779e2SAndrii Nakryiko 4347c64779e2SAndrii Nakryiko /* The map holds the last ref to BTF and its btf_id */ 4348c64779e2SAndrii Nakryiko close(map_fd); 4349c64779e2SAndrii Nakryiko map_fd = -1; 4350c64779e2SAndrii Nakryiko btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id); 4351bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] >= 0, "BTF lingers")) { 4352c64779e2SAndrii Nakryiko err = -1; 4353c64779e2SAndrii Nakryiko goto done; 4354c64779e2SAndrii Nakryiko } 4355c64779e2SAndrii Nakryiko 4356c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4357c64779e2SAndrii Nakryiko 4358c64779e2SAndrii Nakryiko done: 4359c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4360c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4361c64779e2SAndrii Nakryiko 4362c64779e2SAndrii Nakryiko free(raw_btf); 4363bad2e478SAndrii Nakryiko if (map_fd >= 0) 4364c64779e2SAndrii Nakryiko close(map_fd); 4365c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4366c64779e2SAndrii Nakryiko free(user_btf[i]); 4367bad2e478SAndrii Nakryiko if (btf_fd[i] >= 0) 4368c64779e2SAndrii Nakryiko close(btf_fd[i]); 4369c64779e2SAndrii Nakryiko } 4370c64779e2SAndrii Nakryiko 4371c64779e2SAndrii Nakryiko return err; 4372c64779e2SAndrii Nakryiko } 4373c64779e2SAndrii Nakryiko 4374c64779e2SAndrii Nakryiko static void do_test_get_info(unsigned int test_num) 4375c64779e2SAndrii Nakryiko { 4376c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 4377c64779e2SAndrii Nakryiko unsigned int raw_btf_size, user_btf_size, expected_nbytes; 4378c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf = NULL; 4379c64779e2SAndrii Nakryiko struct bpf_btf_info info = {}; 4380c64779e2SAndrii Nakryiko int btf_fd = -1, err, ret; 4381c64779e2SAndrii Nakryiko uint32_t info_len; 4382c64779e2SAndrii Nakryiko 4383c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 4384c64779e2SAndrii Nakryiko return; 4385c64779e2SAndrii Nakryiko 4386c64779e2SAndrii Nakryiko if (test->special_test) { 4387c64779e2SAndrii Nakryiko err = test->special_test(test_num); 4388c64779e2SAndrii Nakryiko if (CHECK(err, "failed: %d\n", err)) 4389c64779e2SAndrii Nakryiko return; 4390c64779e2SAndrii Nakryiko } 4391c64779e2SAndrii Nakryiko 4392c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4393c64779e2SAndrii Nakryiko test->raw_types, 4394c64779e2SAndrii Nakryiko test->str_sec, 4395c64779e2SAndrii Nakryiko test->str_sec_size, 4396c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4397c64779e2SAndrii Nakryiko 4398c64779e2SAndrii Nakryiko if (!raw_btf) 4399c64779e2SAndrii Nakryiko return; 4400c64779e2SAndrii Nakryiko 4401c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4402c64779e2SAndrii Nakryiko 4403c64779e2SAndrii Nakryiko user_btf = malloc(raw_btf_size); 4404c64779e2SAndrii Nakryiko if (CHECK(!user_btf, "!user_btf")) { 4405c64779e2SAndrii Nakryiko err = -1; 4406c64779e2SAndrii Nakryiko goto done; 4407c64779e2SAndrii Nakryiko } 4408c64779e2SAndrii Nakryiko 4409c64779e2SAndrii Nakryiko btf_fd = bpf_load_btf(raw_btf, raw_btf_size, 4410c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 4411c64779e2SAndrii Nakryiko always_log); 4412bad2e478SAndrii Nakryiko if (CHECK(btf_fd <= 0, "errno:%d", errno)) { 4413c64779e2SAndrii Nakryiko err = -1; 4414c64779e2SAndrii Nakryiko goto done; 4415c64779e2SAndrii Nakryiko } 4416c64779e2SAndrii Nakryiko 4417c64779e2SAndrii Nakryiko user_btf_size = (int)raw_btf_size + test->btf_size_delta; 4418c64779e2SAndrii Nakryiko expected_nbytes = min(raw_btf_size, user_btf_size); 4419c64779e2SAndrii Nakryiko if (raw_btf_size > expected_nbytes) 4420c64779e2SAndrii Nakryiko memset(user_btf + expected_nbytes, 0xff, 4421c64779e2SAndrii Nakryiko raw_btf_size - expected_nbytes); 4422c64779e2SAndrii Nakryiko 4423c64779e2SAndrii Nakryiko info_len = sizeof(info); 4424c64779e2SAndrii Nakryiko info.btf = ptr_to_u64(user_btf); 4425c64779e2SAndrii Nakryiko info.btf_size = user_btf_size; 4426c64779e2SAndrii Nakryiko 4427c64779e2SAndrii Nakryiko ret = 0; 4428c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, &info, &info_len); 4429c64779e2SAndrii Nakryiko if (CHECK(err || !info.id || info_len != sizeof(info) || 4430c64779e2SAndrii Nakryiko info.btf_size != raw_btf_size || 4431c64779e2SAndrii Nakryiko (ret = memcmp(raw_btf, user_btf, expected_nbytes)), 4432c64779e2SAndrii 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", 4433c64779e2SAndrii Nakryiko err, errno, info.id, info_len, sizeof(info), 4434c64779e2SAndrii Nakryiko raw_btf_size, info.btf_size, expected_nbytes, ret)) { 4435c64779e2SAndrii Nakryiko err = -1; 4436c64779e2SAndrii Nakryiko goto done; 4437c64779e2SAndrii Nakryiko } 4438c64779e2SAndrii Nakryiko 4439c64779e2SAndrii Nakryiko while (expected_nbytes < raw_btf_size) { 4440c64779e2SAndrii Nakryiko fprintf(stderr, "%u...", expected_nbytes); 4441c64779e2SAndrii Nakryiko if (CHECK(user_btf[expected_nbytes++] != 0xff, 4442c64779e2SAndrii Nakryiko "user_btf[%u]:%x != 0xff", expected_nbytes - 1, 4443c64779e2SAndrii Nakryiko user_btf[expected_nbytes - 1])) { 4444c64779e2SAndrii Nakryiko err = -1; 4445c64779e2SAndrii Nakryiko goto done; 4446c64779e2SAndrii Nakryiko } 4447c64779e2SAndrii Nakryiko } 4448c64779e2SAndrii Nakryiko 4449c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4450c64779e2SAndrii Nakryiko 4451c64779e2SAndrii Nakryiko done: 4452c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4453c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4454c64779e2SAndrii Nakryiko 4455c64779e2SAndrii Nakryiko free(raw_btf); 4456c64779e2SAndrii Nakryiko free(user_btf); 4457c64779e2SAndrii Nakryiko 4458bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4459c64779e2SAndrii Nakryiko close(btf_fd); 4460c64779e2SAndrii Nakryiko } 4461c64779e2SAndrii Nakryiko 4462c64779e2SAndrii Nakryiko struct btf_file_test { 4463c64779e2SAndrii Nakryiko const char *file; 4464c64779e2SAndrii Nakryiko bool btf_kv_notfound; 4465c64779e2SAndrii Nakryiko }; 4466c64779e2SAndrii Nakryiko 4467c64779e2SAndrii Nakryiko static struct btf_file_test file_tests[] = { 4468c64779e2SAndrii Nakryiko { .file = "test_btf_haskv.o", }, 4469c64779e2SAndrii Nakryiko { .file = "test_btf_newkv.o", }, 4470c64779e2SAndrii Nakryiko { .file = "test_btf_nokv.o", .btf_kv_notfound = true, }, 4471c64779e2SAndrii Nakryiko }; 4472c64779e2SAndrii Nakryiko 4473c64779e2SAndrii Nakryiko static void do_test_file(unsigned int test_num) 4474c64779e2SAndrii Nakryiko { 4475c64779e2SAndrii Nakryiko const struct btf_file_test *test = &file_tests[test_num - 1]; 4476c64779e2SAndrii Nakryiko const char *expected_fnames[] = {"_dummy_tracepoint", 4477c64779e2SAndrii Nakryiko "test_long_fname_1", 4478c64779e2SAndrii Nakryiko "test_long_fname_2"}; 4479c64779e2SAndrii Nakryiko struct btf_ext *btf_ext = NULL; 4480c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 4481c64779e2SAndrii Nakryiko struct bpf_object *obj = NULL; 4482c64779e2SAndrii Nakryiko struct bpf_func_info *finfo; 4483c64779e2SAndrii Nakryiko struct bpf_program *prog; 4484c64779e2SAndrii Nakryiko __u32 info_len, rec_size; 4485c64779e2SAndrii Nakryiko bool has_btf_ext = false; 4486c64779e2SAndrii Nakryiko struct btf *btf = NULL; 4487c64779e2SAndrii Nakryiko void *func_info = NULL; 4488c64779e2SAndrii Nakryiko struct bpf_map *map; 4489c64779e2SAndrii Nakryiko int i, err, prog_fd; 4490c64779e2SAndrii Nakryiko 4491c64779e2SAndrii Nakryiko if (!test__start_subtest(test->file)) 4492c64779e2SAndrii Nakryiko return; 4493c64779e2SAndrii Nakryiko 4494c64779e2SAndrii Nakryiko btf = btf__parse_elf(test->file, &btf_ext); 4495bad2e478SAndrii Nakryiko err = libbpf_get_error(btf); 4496bad2e478SAndrii Nakryiko if (err) { 4497bad2e478SAndrii Nakryiko if (err == -ENOENT) { 4498c64779e2SAndrii Nakryiko printf("%s:SKIP: No ELF %s found", __func__, BTF_ELF_SEC); 4499c64779e2SAndrii Nakryiko test__skip(); 4500c64779e2SAndrii Nakryiko return; 4501c64779e2SAndrii Nakryiko } 4502c64779e2SAndrii Nakryiko return; 4503c64779e2SAndrii Nakryiko } 4504c64779e2SAndrii Nakryiko btf__free(btf); 4505c64779e2SAndrii Nakryiko 4506c64779e2SAndrii Nakryiko has_btf_ext = btf_ext != NULL; 4507c64779e2SAndrii Nakryiko btf_ext__free(btf_ext); 4508c64779e2SAndrii Nakryiko 4509c64779e2SAndrii Nakryiko obj = bpf_object__open(test->file); 4510bad2e478SAndrii Nakryiko err = libbpf_get_error(obj); 4511bad2e478SAndrii Nakryiko if (CHECK(err, "obj: %d", err)) 4512c64779e2SAndrii Nakryiko return; 4513c64779e2SAndrii Nakryiko 45146f2b219bSHengqi Chen prog = bpf_object__next_program(obj, NULL); 4515c64779e2SAndrii Nakryiko if (CHECK(!prog, "Cannot find bpf_prog")) { 4516c64779e2SAndrii Nakryiko err = -1; 4517c64779e2SAndrii Nakryiko goto done; 4518c64779e2SAndrii Nakryiko } 4519c64779e2SAndrii Nakryiko 4520c64779e2SAndrii Nakryiko bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT); 4521c64779e2SAndrii Nakryiko err = bpf_object__load(obj); 4522c64779e2SAndrii Nakryiko if (CHECK(err < 0, "bpf_object__load: %d", err)) 4523c64779e2SAndrii Nakryiko goto done; 4524c64779e2SAndrii Nakryiko prog_fd = bpf_program__fd(prog); 4525c64779e2SAndrii Nakryiko 4526c64779e2SAndrii Nakryiko map = bpf_object__find_map_by_name(obj, "btf_map"); 4527c64779e2SAndrii Nakryiko if (CHECK(!map, "btf_map not found")) { 4528c64779e2SAndrii Nakryiko err = -1; 4529c64779e2SAndrii Nakryiko goto done; 4530c64779e2SAndrii Nakryiko } 4531c64779e2SAndrii Nakryiko 4532c64779e2SAndrii Nakryiko err = (bpf_map__btf_key_type_id(map) == 0 || bpf_map__btf_value_type_id(map) == 0) 4533c64779e2SAndrii Nakryiko != test->btf_kv_notfound; 4534c64779e2SAndrii Nakryiko if (CHECK(err, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u", 4535c64779e2SAndrii Nakryiko bpf_map__btf_key_type_id(map), bpf_map__btf_value_type_id(map), 4536c64779e2SAndrii Nakryiko test->btf_kv_notfound)) 4537c64779e2SAndrii Nakryiko goto done; 4538c64779e2SAndrii Nakryiko 4539c64779e2SAndrii Nakryiko if (!has_btf_ext) 4540c64779e2SAndrii Nakryiko goto skip; 4541c64779e2SAndrii Nakryiko 4542c64779e2SAndrii Nakryiko /* get necessary program info */ 4543c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 4544c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 4545c64779e2SAndrii Nakryiko 4546bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) { 4547c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 4548c64779e2SAndrii Nakryiko err = -1; 4549c64779e2SAndrii Nakryiko goto done; 4550c64779e2SAndrii Nakryiko } 4551c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != 3, 4552c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (1st) %d", 4553c64779e2SAndrii Nakryiko info.nr_func_info)) { 4554c64779e2SAndrii Nakryiko err = -1; 4555c64779e2SAndrii Nakryiko goto done; 4556c64779e2SAndrii Nakryiko } 4557c64779e2SAndrii Nakryiko rec_size = info.func_info_rec_size; 4558c64779e2SAndrii Nakryiko if (CHECK(rec_size != sizeof(struct bpf_func_info), 4559c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (1st) %d\n", rec_size)) { 4560c64779e2SAndrii Nakryiko err = -1; 4561c64779e2SAndrii Nakryiko goto done; 4562c64779e2SAndrii Nakryiko } 4563c64779e2SAndrii Nakryiko 4564c64779e2SAndrii Nakryiko func_info = malloc(info.nr_func_info * rec_size); 4565c64779e2SAndrii Nakryiko if (CHECK(!func_info, "out of memory")) { 4566c64779e2SAndrii Nakryiko err = -1; 4567c64779e2SAndrii Nakryiko goto done; 4568c64779e2SAndrii Nakryiko } 4569c64779e2SAndrii Nakryiko 4570c64779e2SAndrii Nakryiko /* reset info to only retrieve func_info related data */ 4571c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 4572c64779e2SAndrii Nakryiko info.nr_func_info = 3; 4573c64779e2SAndrii Nakryiko info.func_info_rec_size = rec_size; 4574c64779e2SAndrii Nakryiko info.func_info = ptr_to_u64(func_info); 4575c64779e2SAndrii Nakryiko 4576c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 4577c64779e2SAndrii Nakryiko 4578bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) { 4579c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 4580c64779e2SAndrii Nakryiko err = -1; 4581c64779e2SAndrii Nakryiko goto done; 4582c64779e2SAndrii Nakryiko } 4583c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != 3, 4584c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (2nd) %d", 4585c64779e2SAndrii Nakryiko info.nr_func_info)) { 4586c64779e2SAndrii Nakryiko err = -1; 4587c64779e2SAndrii Nakryiko goto done; 4588c64779e2SAndrii Nakryiko } 4589c64779e2SAndrii Nakryiko if (CHECK(info.func_info_rec_size != rec_size, 4590c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (2nd) %d", 4591c64779e2SAndrii Nakryiko info.func_info_rec_size)) { 4592c64779e2SAndrii Nakryiko err = -1; 4593c64779e2SAndrii Nakryiko goto done; 4594c64779e2SAndrii Nakryiko } 4595c64779e2SAndrii Nakryiko 459686f4b7f2SQuentin Monnet btf = btf__load_from_kernel_by_id(info.btf_id); 459786f4b7f2SQuentin Monnet err = libbpf_get_error(btf); 4598c64779e2SAndrii Nakryiko if (CHECK(err, "cannot get btf from kernel, err: %d", err)) 4599c64779e2SAndrii Nakryiko goto done; 4600c64779e2SAndrii Nakryiko 4601c64779e2SAndrii Nakryiko /* check three functions */ 4602c64779e2SAndrii Nakryiko finfo = func_info; 4603c64779e2SAndrii Nakryiko for (i = 0; i < 3; i++) { 4604c64779e2SAndrii Nakryiko const struct btf_type *t; 4605c64779e2SAndrii Nakryiko const char *fname; 4606c64779e2SAndrii Nakryiko 4607c64779e2SAndrii Nakryiko t = btf__type_by_id(btf, finfo->type_id); 4608c64779e2SAndrii Nakryiko if (CHECK(!t, "btf__type_by_id failure: id %u", 4609c64779e2SAndrii Nakryiko finfo->type_id)) { 4610c64779e2SAndrii Nakryiko err = -1; 4611c64779e2SAndrii Nakryiko goto done; 4612c64779e2SAndrii Nakryiko } 4613c64779e2SAndrii Nakryiko 4614c64779e2SAndrii Nakryiko fname = btf__name_by_offset(btf, t->name_off); 4615c64779e2SAndrii Nakryiko err = strcmp(fname, expected_fnames[i]); 4616c64779e2SAndrii Nakryiko /* for the second and third functions in .text section, 4617c64779e2SAndrii Nakryiko * the compiler may order them either way. 4618c64779e2SAndrii Nakryiko */ 4619c64779e2SAndrii Nakryiko if (i && err) 4620c64779e2SAndrii Nakryiko err = strcmp(fname, expected_fnames[3 - i]); 4621c64779e2SAndrii Nakryiko if (CHECK(err, "incorrect fname %s", fname ? : "")) { 4622c64779e2SAndrii Nakryiko err = -1; 4623c64779e2SAndrii Nakryiko goto done; 4624c64779e2SAndrii Nakryiko } 4625c64779e2SAndrii Nakryiko 4626c64779e2SAndrii Nakryiko finfo = (void *)finfo + rec_size; 4627c64779e2SAndrii Nakryiko } 4628c64779e2SAndrii Nakryiko 4629c64779e2SAndrii Nakryiko skip: 4630c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4631c64779e2SAndrii Nakryiko 4632c64779e2SAndrii Nakryiko done: 4633369e955bSQuentin Monnet btf__free(btf); 4634c64779e2SAndrii Nakryiko free(func_info); 4635c64779e2SAndrii Nakryiko bpf_object__close(obj); 4636c64779e2SAndrii Nakryiko } 4637c64779e2SAndrii Nakryiko 4638c64779e2SAndrii Nakryiko const char *pprint_enum_str[] = { 4639c64779e2SAndrii Nakryiko "ENUM_ZERO", 4640c64779e2SAndrii Nakryiko "ENUM_ONE", 4641c64779e2SAndrii Nakryiko "ENUM_TWO", 4642c64779e2SAndrii Nakryiko "ENUM_THREE", 4643c64779e2SAndrii Nakryiko }; 4644c64779e2SAndrii Nakryiko 4645c64779e2SAndrii Nakryiko struct pprint_mapv { 4646c64779e2SAndrii Nakryiko uint32_t ui32; 4647c64779e2SAndrii Nakryiko uint16_t ui16; 4648c64779e2SAndrii Nakryiko /* 2 bytes hole */ 4649c64779e2SAndrii Nakryiko int32_t si32; 4650c64779e2SAndrii Nakryiko uint32_t unused_bits2a:2, 4651c64779e2SAndrii Nakryiko bits28:28, 4652c64779e2SAndrii Nakryiko unused_bits2b:2; 4653c64779e2SAndrii Nakryiko union { 4654c64779e2SAndrii Nakryiko uint64_t ui64; 4655c64779e2SAndrii Nakryiko uint8_t ui8a[8]; 4656c64779e2SAndrii Nakryiko }; 4657c64779e2SAndrii Nakryiko enum { 4658c64779e2SAndrii Nakryiko ENUM_ZERO, 4659c64779e2SAndrii Nakryiko ENUM_ONE, 4660c64779e2SAndrii Nakryiko ENUM_TWO, 4661c64779e2SAndrii Nakryiko ENUM_THREE, 4662c64779e2SAndrii Nakryiko } aenum; 4663c64779e2SAndrii Nakryiko uint32_t ui32b; 4664c64779e2SAndrii Nakryiko uint32_t bits2c:2; 4665c64779e2SAndrii Nakryiko uint8_t si8_4[2][2]; 4666c64779e2SAndrii Nakryiko }; 4667c64779e2SAndrii Nakryiko 4668c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 4669c64779e2SAndrii Nakryiko struct pprint_mapv_int128 { 4670c64779e2SAndrii Nakryiko __int128 si128a; 4671c64779e2SAndrii Nakryiko __int128 si128b; 4672c64779e2SAndrii Nakryiko unsigned __int128 bits3:3; 4673c64779e2SAndrii Nakryiko unsigned __int128 bits80:80; 4674c64779e2SAndrii Nakryiko unsigned __int128 ui128; 4675c64779e2SAndrii Nakryiko }; 4676c64779e2SAndrii Nakryiko #endif 4677c64779e2SAndrii Nakryiko 4678c64779e2SAndrii Nakryiko static struct btf_raw_test pprint_test_template[] = { 4679c64779e2SAndrii Nakryiko { 4680c64779e2SAndrii Nakryiko .raw_types = { 4681c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 4682c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 4683c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 4684c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 4685c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 4686c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4687c64779e2SAndrii Nakryiko /* int */ /* [4] */ 4688c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 4689c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 4690c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 4691c64779e2SAndrii Nakryiko /* 2 bits */ /* [6] */ 4692c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 2, 2), 4693c64779e2SAndrii Nakryiko /* 28 bits */ /* [7] */ 4694c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 28, 4), 4695c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 4696c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 4697c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 4698c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 4699c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 4700c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 4701c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 4702c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 4703c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 4704c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 4705c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 4706c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 4707c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 4708c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 4709c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 4710c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 4711c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 4712c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 4713c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 4714c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 4715c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 4716c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 4717c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 4718c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 11), 40), 4719c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, 0), /* uint32_t ui32 */ 4720c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, 32), /* uint16_t ui16 */ 4721c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, 64), /* int32_t si32 */ 4722c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 96), /* unused_bits2a */ 4723c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, 98), /* bits28 */ 4724c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 126), /* unused_bits2b */ 4725c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, 128), /* union (anon) */ 4726c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, 192), /* aenum */ 4727c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, 224), /* uint32_t ui32b */ 4728c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 256), /* bits2c */ 4729c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */ 4730c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */ 4731c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */ 4732c64779e2SAndrii Nakryiko BTF_END_RAW, 4733c64779e2SAndrii Nakryiko }, 4734c64779e2SAndrii 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"), 4735c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 4736c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 4737c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 4738c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 4739c64779e2SAndrii Nakryiko .max_entries = 128, 4740c64779e2SAndrii Nakryiko }, 4741c64779e2SAndrii Nakryiko 4742c64779e2SAndrii Nakryiko { 4743c64779e2SAndrii Nakryiko /* this type will have the same type as the 4744c64779e2SAndrii Nakryiko * first .raw_types definition, but struct type will 4745c64779e2SAndrii Nakryiko * be encoded with kind_flag set. 4746c64779e2SAndrii Nakryiko */ 4747c64779e2SAndrii Nakryiko .raw_types = { 4748c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 4749c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 4750c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 4751c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 4752c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 4753c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4754c64779e2SAndrii Nakryiko /* int */ /* [4] */ 4755c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 4756c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 4757c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 4758c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */ 4759c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */ 4760c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 4761c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 4762c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 4763c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 4764c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 4765c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 4766c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 4767c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 4768c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 4769c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 4770c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 4771c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 4772c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 4773c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 4774c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 4775c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 4776c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 4777c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 4778c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 4779c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 4780c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 4781c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 4782c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 4783c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40), 4784c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */ 4785c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */ 4786c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */ 4787c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */ 4788c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */ 4789c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)), /* unused_bits2b */ 4790c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */ 4791c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */ 4792c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */ 4793c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */ 4794c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */ 4795c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */ 4796c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */ 4797c64779e2SAndrii Nakryiko BTF_END_RAW, 4798c64779e2SAndrii Nakryiko }, 4799c64779e2SAndrii 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"), 4800c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 4801c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 4802c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 4803c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 4804c64779e2SAndrii Nakryiko .max_entries = 128, 4805c64779e2SAndrii Nakryiko }, 4806c64779e2SAndrii Nakryiko 4807c64779e2SAndrii Nakryiko { 4808c64779e2SAndrii Nakryiko /* this type will have the same layout as the 4809c64779e2SAndrii Nakryiko * first .raw_types definition. The struct type will 4810c64779e2SAndrii Nakryiko * be encoded with kind_flag set, bitfield members 4811c64779e2SAndrii Nakryiko * are added typedef/const/volatile, and bitfield members 4812c64779e2SAndrii Nakryiko * will have both int and enum types. 4813c64779e2SAndrii Nakryiko */ 4814c64779e2SAndrii Nakryiko .raw_types = { 4815c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 4816c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 4817c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 4818c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 4819c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 4820c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4821c64779e2SAndrii Nakryiko /* int */ /* [4] */ 4822c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 4823c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 4824c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 4825c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */ 4826c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */ 4827c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 4828c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 4829c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 4830c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 4831c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 4832c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 4833c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 4834c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 4835c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 4836c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 4837c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 4838c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 4839c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 4840c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 4841c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 4842c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 4843c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 4844c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 4845c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 4846c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 4847c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 4848c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 4849c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 4850c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40), 4851c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */ 4852c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */ 4853c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */ 4854c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */ 4855c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */ 4856c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */ 4857c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */ 4858c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */ 4859c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */ 4860c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */ 4861c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 20, BTF_MEMBER_OFFSET(0, 264)), /* si8_4 */ 4862c64779e2SAndrii Nakryiko /* typedef unsigned int ___int */ /* [17] */ 4863c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 18), 4864c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6), /* [18] */ 4865c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15), /* [19] */ 4866c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(21, 1, 2), /* [20] */ 4867c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [21] */ 4868c64779e2SAndrii Nakryiko BTF_END_RAW, 4869c64779e2SAndrii Nakryiko }, 4870c64779e2SAndrii 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"), 4871c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 4872c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 4873c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 4874c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 4875c64779e2SAndrii Nakryiko .max_entries = 128, 4876c64779e2SAndrii Nakryiko }, 4877c64779e2SAndrii Nakryiko 4878c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 4879c64779e2SAndrii Nakryiko { 4880c64779e2SAndrii Nakryiko /* test int128 */ 4881c64779e2SAndrii Nakryiko .raw_types = { 4882c64779e2SAndrii Nakryiko /* unsigned int */ /* [1] */ 4883c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4884c64779e2SAndrii Nakryiko /* __int128 */ /* [2] */ 4885c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 128, 16), 4886c64779e2SAndrii Nakryiko /* unsigned __int128 */ /* [3] */ 4887c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 128, 16), 4888c64779e2SAndrii Nakryiko /* struct pprint_mapv_int128 */ /* [4] */ 4889c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 5), 64), 4890c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), /* si128a */ 4891c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 128)), /* si128b */ 4892c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(3, 256)), /* bits3 */ 4893c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(80, 259)), /* bits80 */ 4894c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(0, 384)), /* ui128 */ 4895c64779e2SAndrii Nakryiko BTF_END_RAW, 4896c64779e2SAndrii Nakryiko }, 4897c64779e2SAndrii Nakryiko BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"), 4898c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 4899c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv_int128), 4900c64779e2SAndrii Nakryiko .key_type_id = 1, 4901c64779e2SAndrii Nakryiko .value_type_id = 4, 4902c64779e2SAndrii Nakryiko .max_entries = 128, 4903c64779e2SAndrii Nakryiko .mapv_kind = PPRINT_MAPV_KIND_INT128, 4904c64779e2SAndrii Nakryiko }, 4905c64779e2SAndrii Nakryiko #endif 4906c64779e2SAndrii Nakryiko 4907c64779e2SAndrii Nakryiko }; 4908c64779e2SAndrii Nakryiko 4909c64779e2SAndrii Nakryiko static struct btf_pprint_test_meta { 4910c64779e2SAndrii Nakryiko const char *descr; 4911c64779e2SAndrii Nakryiko enum bpf_map_type map_type; 4912c64779e2SAndrii Nakryiko const char *map_name; 4913c64779e2SAndrii Nakryiko bool ordered_map; 4914c64779e2SAndrii Nakryiko bool lossless_map; 4915c64779e2SAndrii Nakryiko bool percpu_map; 4916c64779e2SAndrii Nakryiko } pprint_tests_meta[] = { 4917c64779e2SAndrii Nakryiko { 4918c64779e2SAndrii Nakryiko .descr = "BTF pretty print array", 4919c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 4920c64779e2SAndrii Nakryiko .map_name = "pprint_test_array", 4921c64779e2SAndrii Nakryiko .ordered_map = true, 4922c64779e2SAndrii Nakryiko .lossless_map = true, 4923c64779e2SAndrii Nakryiko .percpu_map = false, 4924c64779e2SAndrii Nakryiko }, 4925c64779e2SAndrii Nakryiko 4926c64779e2SAndrii Nakryiko { 4927c64779e2SAndrii Nakryiko .descr = "BTF pretty print hash", 4928c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_HASH, 4929c64779e2SAndrii Nakryiko .map_name = "pprint_test_hash", 4930c64779e2SAndrii Nakryiko .ordered_map = false, 4931c64779e2SAndrii Nakryiko .lossless_map = true, 4932c64779e2SAndrii Nakryiko .percpu_map = false, 4933c64779e2SAndrii Nakryiko }, 4934c64779e2SAndrii Nakryiko 4935c64779e2SAndrii Nakryiko { 4936c64779e2SAndrii Nakryiko .descr = "BTF pretty print lru hash", 4937c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_LRU_HASH, 4938c64779e2SAndrii Nakryiko .map_name = "pprint_test_lru_hash", 4939c64779e2SAndrii Nakryiko .ordered_map = false, 4940c64779e2SAndrii Nakryiko .lossless_map = false, 4941c64779e2SAndrii Nakryiko .percpu_map = false, 4942c64779e2SAndrii Nakryiko }, 4943c64779e2SAndrii Nakryiko 4944c64779e2SAndrii Nakryiko { 4945c64779e2SAndrii Nakryiko .descr = "BTF pretty print percpu array", 4946c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_PERCPU_ARRAY, 4947c64779e2SAndrii Nakryiko .map_name = "pprint_test_percpu_array", 4948c64779e2SAndrii Nakryiko .ordered_map = true, 4949c64779e2SAndrii Nakryiko .lossless_map = true, 4950c64779e2SAndrii Nakryiko .percpu_map = true, 4951c64779e2SAndrii Nakryiko }, 4952c64779e2SAndrii Nakryiko 4953c64779e2SAndrii Nakryiko { 4954c64779e2SAndrii Nakryiko .descr = "BTF pretty print percpu hash", 4955c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_PERCPU_HASH, 4956c64779e2SAndrii Nakryiko .map_name = "pprint_test_percpu_hash", 4957c64779e2SAndrii Nakryiko .ordered_map = false, 4958c64779e2SAndrii Nakryiko .lossless_map = true, 4959c64779e2SAndrii Nakryiko .percpu_map = true, 4960c64779e2SAndrii Nakryiko }, 4961c64779e2SAndrii Nakryiko 4962c64779e2SAndrii Nakryiko { 4963c64779e2SAndrii Nakryiko .descr = "BTF pretty print lru percpu hash", 4964c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_LRU_PERCPU_HASH, 4965c64779e2SAndrii Nakryiko .map_name = "pprint_test_lru_percpu_hash", 4966c64779e2SAndrii Nakryiko .ordered_map = false, 4967c64779e2SAndrii Nakryiko .lossless_map = false, 4968c64779e2SAndrii Nakryiko .percpu_map = true, 4969c64779e2SAndrii Nakryiko }, 4970c64779e2SAndrii Nakryiko 4971c64779e2SAndrii Nakryiko }; 4972c64779e2SAndrii Nakryiko 4973c64779e2SAndrii Nakryiko static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind) 4974c64779e2SAndrii Nakryiko { 4975c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) 4976c64779e2SAndrii Nakryiko return sizeof(struct pprint_mapv); 4977c64779e2SAndrii Nakryiko 4978c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 4979c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) 4980c64779e2SAndrii Nakryiko return sizeof(struct pprint_mapv_int128); 4981c64779e2SAndrii Nakryiko #endif 4982c64779e2SAndrii Nakryiko 4983c64779e2SAndrii Nakryiko assert(0); 4984c64779e2SAndrii Nakryiko } 4985c64779e2SAndrii Nakryiko 4986c64779e2SAndrii Nakryiko static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind, 4987c64779e2SAndrii Nakryiko void *mapv, uint32_t i, 4988c64779e2SAndrii Nakryiko int num_cpus, int rounded_value_size) 4989c64779e2SAndrii Nakryiko { 4990c64779e2SAndrii Nakryiko int cpu; 4991c64779e2SAndrii Nakryiko 4992c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) { 4993c64779e2SAndrii Nakryiko struct pprint_mapv *v = mapv; 4994c64779e2SAndrii Nakryiko 4995c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 4996c64779e2SAndrii Nakryiko v->ui32 = i + cpu; 4997c64779e2SAndrii Nakryiko v->si32 = -i; 4998c64779e2SAndrii Nakryiko v->unused_bits2a = 3; 4999c64779e2SAndrii Nakryiko v->bits28 = i; 5000c64779e2SAndrii Nakryiko v->unused_bits2b = 3; 5001c64779e2SAndrii Nakryiko v->ui64 = i; 5002c64779e2SAndrii Nakryiko v->aenum = i & 0x03; 5003c64779e2SAndrii Nakryiko v->ui32b = 4; 5004c64779e2SAndrii Nakryiko v->bits2c = 1; 5005c64779e2SAndrii Nakryiko v->si8_4[0][0] = (cpu + i) & 0xff; 5006c64779e2SAndrii Nakryiko v->si8_4[0][1] = (cpu + i + 1) & 0xff; 5007c64779e2SAndrii Nakryiko v->si8_4[1][0] = (cpu + i + 2) & 0xff; 5008c64779e2SAndrii Nakryiko v->si8_4[1][1] = (cpu + i + 3) & 0xff; 5009c64779e2SAndrii Nakryiko v = (void *)v + rounded_value_size; 5010c64779e2SAndrii Nakryiko } 5011c64779e2SAndrii Nakryiko } 5012c64779e2SAndrii Nakryiko 5013c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5014c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) { 5015c64779e2SAndrii Nakryiko struct pprint_mapv_int128 *v = mapv; 5016c64779e2SAndrii Nakryiko 5017c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 5018c64779e2SAndrii Nakryiko v->si128a = i; 5019c64779e2SAndrii Nakryiko v->si128b = -i; 5020c64779e2SAndrii Nakryiko v->bits3 = i & 0x07; 5021c64779e2SAndrii Nakryiko v->bits80 = (((unsigned __int128)1) << 64) + i; 5022c64779e2SAndrii Nakryiko v->ui128 = (((unsigned __int128)2) << 64) + i; 5023c64779e2SAndrii Nakryiko v = (void *)v + rounded_value_size; 5024c64779e2SAndrii Nakryiko } 5025c64779e2SAndrii Nakryiko } 5026c64779e2SAndrii Nakryiko #endif 5027c64779e2SAndrii Nakryiko } 5028c64779e2SAndrii Nakryiko 5029c64779e2SAndrii Nakryiko ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind, 5030c64779e2SAndrii Nakryiko char *expected_line, ssize_t line_size, 5031c64779e2SAndrii Nakryiko bool percpu_map, unsigned int next_key, 5032c64779e2SAndrii Nakryiko int cpu, void *mapv) 5033c64779e2SAndrii Nakryiko { 5034c64779e2SAndrii Nakryiko ssize_t nexpected_line = -1; 5035c64779e2SAndrii Nakryiko 5036c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) { 5037c64779e2SAndrii Nakryiko struct pprint_mapv *v = mapv; 5038c64779e2SAndrii Nakryiko 5039c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, line_size, 5040c64779e2SAndrii Nakryiko "%s%u: {%u,0,%d,0x%x,0x%x,0x%x," 5041c64779e2SAndrii Nakryiko "{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s," 5042c64779e2SAndrii Nakryiko "%u,0x%x,[[%d,%d],[%d,%d]]}\n", 5043c64779e2SAndrii Nakryiko percpu_map ? "\tcpu" : "", 5044c64779e2SAndrii Nakryiko percpu_map ? cpu : next_key, 5045c64779e2SAndrii Nakryiko v->ui32, v->si32, 5046c64779e2SAndrii Nakryiko v->unused_bits2a, 5047c64779e2SAndrii Nakryiko v->bits28, 5048c64779e2SAndrii Nakryiko v->unused_bits2b, 5049c64779e2SAndrii Nakryiko (__u64)v->ui64, 5050c64779e2SAndrii Nakryiko v->ui8a[0], v->ui8a[1], 5051c64779e2SAndrii Nakryiko v->ui8a[2], v->ui8a[3], 5052c64779e2SAndrii Nakryiko v->ui8a[4], v->ui8a[5], 5053c64779e2SAndrii Nakryiko v->ui8a[6], v->ui8a[7], 5054c64779e2SAndrii Nakryiko pprint_enum_str[v->aenum], 5055c64779e2SAndrii Nakryiko v->ui32b, 5056c64779e2SAndrii Nakryiko v->bits2c, 5057c64779e2SAndrii Nakryiko v->si8_4[0][0], v->si8_4[0][1], 5058c64779e2SAndrii Nakryiko v->si8_4[1][0], v->si8_4[1][1]); 5059c64779e2SAndrii Nakryiko } 5060c64779e2SAndrii Nakryiko 5061c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5062c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) { 5063c64779e2SAndrii Nakryiko struct pprint_mapv_int128 *v = mapv; 5064c64779e2SAndrii Nakryiko 5065c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, line_size, 5066c64779e2SAndrii Nakryiko "%s%u: {0x%lx,0x%lx,0x%lx," 5067c64779e2SAndrii Nakryiko "0x%lx%016lx,0x%lx%016lx}\n", 5068c64779e2SAndrii Nakryiko percpu_map ? "\tcpu" : "", 5069c64779e2SAndrii Nakryiko percpu_map ? cpu : next_key, 5070c64779e2SAndrii Nakryiko (uint64_t)v->si128a, 5071c64779e2SAndrii Nakryiko (uint64_t)v->si128b, 5072c64779e2SAndrii Nakryiko (uint64_t)v->bits3, 5073c64779e2SAndrii Nakryiko (uint64_t)(v->bits80 >> 64), 5074c64779e2SAndrii Nakryiko (uint64_t)v->bits80, 5075c64779e2SAndrii Nakryiko (uint64_t)(v->ui128 >> 64), 5076c64779e2SAndrii Nakryiko (uint64_t)v->ui128); 5077c64779e2SAndrii Nakryiko } 5078c64779e2SAndrii Nakryiko #endif 5079c64779e2SAndrii Nakryiko 5080c64779e2SAndrii Nakryiko return nexpected_line; 5081c64779e2SAndrii Nakryiko } 5082c64779e2SAndrii Nakryiko 5083c64779e2SAndrii Nakryiko static int check_line(const char *expected_line, int nexpected_line, 5084c64779e2SAndrii Nakryiko int expected_line_len, const char *line) 5085c64779e2SAndrii Nakryiko { 5086c64779e2SAndrii Nakryiko if (CHECK(nexpected_line == expected_line_len, 5087c64779e2SAndrii Nakryiko "expected_line is too long")) 5088c64779e2SAndrii Nakryiko return -1; 5089c64779e2SAndrii Nakryiko 5090c64779e2SAndrii Nakryiko if (strcmp(expected_line, line)) { 5091c64779e2SAndrii Nakryiko fprintf(stderr, "unexpected pprint output\n"); 5092c64779e2SAndrii Nakryiko fprintf(stderr, "expected: %s", expected_line); 5093c64779e2SAndrii Nakryiko fprintf(stderr, " read: %s", line); 5094c64779e2SAndrii Nakryiko return -1; 5095c64779e2SAndrii Nakryiko } 5096c64779e2SAndrii Nakryiko 5097c64779e2SAndrii Nakryiko return 0; 5098c64779e2SAndrii Nakryiko } 5099c64779e2SAndrii Nakryiko 5100c64779e2SAndrii Nakryiko 5101c64779e2SAndrii Nakryiko static void do_test_pprint(int test_num) 5102c64779e2SAndrii Nakryiko { 5103c64779e2SAndrii Nakryiko const struct btf_raw_test *test = &pprint_test_template[test_num]; 5104c64779e2SAndrii Nakryiko enum pprint_mapv_kind_t mapv_kind = test->mapv_kind; 5105c64779e2SAndrii Nakryiko struct bpf_create_map_attr create_attr = {}; 5106c64779e2SAndrii Nakryiko bool ordered_map, lossless_map, percpu_map; 5107c64779e2SAndrii Nakryiko int err, ret, num_cpus, rounded_value_size; 5108c64779e2SAndrii Nakryiko unsigned int key, nr_read_elems; 5109c64779e2SAndrii Nakryiko int map_fd = -1, btf_fd = -1; 5110c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 5111c64779e2SAndrii Nakryiko char expected_line[255]; 5112c64779e2SAndrii Nakryiko FILE *pin_file = NULL; 5113c64779e2SAndrii Nakryiko char pin_path[255]; 5114c64779e2SAndrii Nakryiko size_t line_len = 0; 5115c64779e2SAndrii Nakryiko char *line = NULL; 5116c64779e2SAndrii Nakryiko void *mapv = NULL; 5117c64779e2SAndrii Nakryiko uint8_t *raw_btf; 5118c64779e2SAndrii Nakryiko ssize_t nread; 5119c64779e2SAndrii Nakryiko 5120c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 5121c64779e2SAndrii Nakryiko return; 5122c64779e2SAndrii Nakryiko 5123c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types, 5124c64779e2SAndrii Nakryiko test->str_sec, test->str_sec_size, 5125c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 5126c64779e2SAndrii Nakryiko 5127c64779e2SAndrii Nakryiko if (!raw_btf) 5128c64779e2SAndrii Nakryiko return; 5129c64779e2SAndrii Nakryiko 5130c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 5131c64779e2SAndrii Nakryiko btf_fd = bpf_load_btf(raw_btf, raw_btf_size, 5132c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 5133c64779e2SAndrii Nakryiko always_log); 5134c64779e2SAndrii Nakryiko free(raw_btf); 5135c64779e2SAndrii Nakryiko 5136bad2e478SAndrii Nakryiko if (CHECK(btf_fd < 0, "errno:%d", errno)) { 5137c64779e2SAndrii Nakryiko err = -1; 5138c64779e2SAndrii Nakryiko goto done; 5139c64779e2SAndrii Nakryiko } 5140c64779e2SAndrii Nakryiko 5141c64779e2SAndrii Nakryiko create_attr.name = test->map_name; 5142c64779e2SAndrii Nakryiko create_attr.map_type = test->map_type; 5143c64779e2SAndrii Nakryiko create_attr.key_size = test->key_size; 5144c64779e2SAndrii Nakryiko create_attr.value_size = test->value_size; 5145c64779e2SAndrii Nakryiko create_attr.max_entries = test->max_entries; 5146c64779e2SAndrii Nakryiko create_attr.btf_fd = btf_fd; 5147c64779e2SAndrii Nakryiko create_attr.btf_key_type_id = test->key_type_id; 5148c64779e2SAndrii Nakryiko create_attr.btf_value_type_id = test->value_type_id; 5149c64779e2SAndrii Nakryiko 5150c64779e2SAndrii Nakryiko map_fd = bpf_create_map_xattr(&create_attr); 5151bad2e478SAndrii Nakryiko if (CHECK(map_fd < 0, "errno:%d", errno)) { 5152c64779e2SAndrii Nakryiko err = -1; 5153c64779e2SAndrii Nakryiko goto done; 5154c64779e2SAndrii Nakryiko } 5155c64779e2SAndrii Nakryiko 5156c64779e2SAndrii Nakryiko ret = snprintf(pin_path, sizeof(pin_path), "%s/%s", 5157c64779e2SAndrii Nakryiko "/sys/fs/bpf", test->map_name); 5158c64779e2SAndrii Nakryiko 5159c64779e2SAndrii Nakryiko if (CHECK(ret == sizeof(pin_path), "pin_path %s/%s is too long", 5160c64779e2SAndrii Nakryiko "/sys/fs/bpf", test->map_name)) { 5161c64779e2SAndrii Nakryiko err = -1; 5162c64779e2SAndrii Nakryiko goto done; 5163c64779e2SAndrii Nakryiko } 5164c64779e2SAndrii Nakryiko 5165c64779e2SAndrii Nakryiko err = bpf_obj_pin(map_fd, pin_path); 5166c64779e2SAndrii Nakryiko if (CHECK(err, "bpf_obj_pin(%s): errno:%d.", pin_path, errno)) 5167c64779e2SAndrii Nakryiko goto done; 5168c64779e2SAndrii Nakryiko 5169c64779e2SAndrii Nakryiko percpu_map = test->percpu_map; 5170c64779e2SAndrii Nakryiko num_cpus = percpu_map ? bpf_num_possible_cpus() : 1; 5171c64779e2SAndrii Nakryiko rounded_value_size = round_up(get_pprint_mapv_size(mapv_kind), 8); 5172c64779e2SAndrii Nakryiko mapv = calloc(num_cpus, rounded_value_size); 5173c64779e2SAndrii Nakryiko if (CHECK(!mapv, "mapv allocation failure")) { 5174c64779e2SAndrii Nakryiko err = -1; 5175c64779e2SAndrii Nakryiko goto done; 5176c64779e2SAndrii Nakryiko } 5177c64779e2SAndrii Nakryiko 5178c64779e2SAndrii Nakryiko for (key = 0; key < test->max_entries; key++) { 5179c64779e2SAndrii Nakryiko set_pprint_mapv(mapv_kind, mapv, key, num_cpus, rounded_value_size); 5180c64779e2SAndrii Nakryiko bpf_map_update_elem(map_fd, &key, mapv, 0); 5181c64779e2SAndrii Nakryiko } 5182c64779e2SAndrii Nakryiko 5183c64779e2SAndrii Nakryiko pin_file = fopen(pin_path, "r"); 5184c64779e2SAndrii Nakryiko if (CHECK(!pin_file, "fopen(%s): errno:%d", pin_path, errno)) { 5185c64779e2SAndrii Nakryiko err = -1; 5186c64779e2SAndrii Nakryiko goto done; 5187c64779e2SAndrii Nakryiko } 5188c64779e2SAndrii Nakryiko 5189c64779e2SAndrii Nakryiko /* Skip lines start with '#' */ 5190c64779e2SAndrii Nakryiko while ((nread = getline(&line, &line_len, pin_file)) > 0 && 5191c64779e2SAndrii Nakryiko *line == '#') 5192c64779e2SAndrii Nakryiko ; 5193c64779e2SAndrii Nakryiko 5194c64779e2SAndrii Nakryiko if (CHECK(nread <= 0, "Unexpected EOF")) { 5195c64779e2SAndrii Nakryiko err = -1; 5196c64779e2SAndrii Nakryiko goto done; 5197c64779e2SAndrii Nakryiko } 5198c64779e2SAndrii Nakryiko 5199c64779e2SAndrii Nakryiko nr_read_elems = 0; 5200c64779e2SAndrii Nakryiko ordered_map = test->ordered_map; 5201c64779e2SAndrii Nakryiko lossless_map = test->lossless_map; 5202c64779e2SAndrii Nakryiko do { 5203c64779e2SAndrii Nakryiko ssize_t nexpected_line; 5204c64779e2SAndrii Nakryiko unsigned int next_key; 5205c64779e2SAndrii Nakryiko void *cmapv; 5206c64779e2SAndrii Nakryiko int cpu; 5207c64779e2SAndrii Nakryiko 5208c64779e2SAndrii Nakryiko next_key = ordered_map ? nr_read_elems : atoi(line); 5209c64779e2SAndrii Nakryiko set_pprint_mapv(mapv_kind, mapv, next_key, num_cpus, rounded_value_size); 5210c64779e2SAndrii Nakryiko cmapv = mapv; 5211c64779e2SAndrii Nakryiko 5212c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 5213c64779e2SAndrii Nakryiko if (percpu_map) { 5214c64779e2SAndrii Nakryiko /* for percpu map, the format looks like: 5215c64779e2SAndrii Nakryiko * <key>: { 5216c64779e2SAndrii Nakryiko * cpu0: <value_on_cpu0> 5217c64779e2SAndrii Nakryiko * cpu1: <value_on_cpu1> 5218c64779e2SAndrii Nakryiko * ... 5219c64779e2SAndrii Nakryiko * cpun: <value_on_cpun> 5220c64779e2SAndrii Nakryiko * } 5221c64779e2SAndrii Nakryiko * 5222c64779e2SAndrii Nakryiko * let us verify the line containing the key here. 5223c64779e2SAndrii Nakryiko */ 5224c64779e2SAndrii Nakryiko if (cpu == 0) { 5225c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, 5226c64779e2SAndrii Nakryiko sizeof(expected_line), 5227c64779e2SAndrii Nakryiko "%u: {\n", 5228c64779e2SAndrii Nakryiko next_key); 5229c64779e2SAndrii Nakryiko 5230c64779e2SAndrii Nakryiko err = check_line(expected_line, nexpected_line, 5231c64779e2SAndrii Nakryiko sizeof(expected_line), line); 5232bad2e478SAndrii Nakryiko if (err < 0) 5233c64779e2SAndrii Nakryiko goto done; 5234c64779e2SAndrii Nakryiko } 5235c64779e2SAndrii Nakryiko 5236c64779e2SAndrii Nakryiko /* read value@cpu */ 5237c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5238c64779e2SAndrii Nakryiko if (nread < 0) 5239c64779e2SAndrii Nakryiko break; 5240c64779e2SAndrii Nakryiko } 5241c64779e2SAndrii Nakryiko 5242c64779e2SAndrii Nakryiko nexpected_line = get_pprint_expected_line(mapv_kind, expected_line, 5243c64779e2SAndrii Nakryiko sizeof(expected_line), 5244c64779e2SAndrii Nakryiko percpu_map, next_key, 5245c64779e2SAndrii Nakryiko cpu, cmapv); 5246c64779e2SAndrii Nakryiko err = check_line(expected_line, nexpected_line, 5247c64779e2SAndrii Nakryiko sizeof(expected_line), line); 5248bad2e478SAndrii Nakryiko if (err < 0) 5249c64779e2SAndrii Nakryiko goto done; 5250c64779e2SAndrii Nakryiko 5251c64779e2SAndrii Nakryiko cmapv = cmapv + rounded_value_size; 5252c64779e2SAndrii Nakryiko } 5253c64779e2SAndrii Nakryiko 5254c64779e2SAndrii Nakryiko if (percpu_map) { 5255c64779e2SAndrii Nakryiko /* skip the last bracket for the percpu map */ 5256c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5257c64779e2SAndrii Nakryiko if (nread < 0) 5258c64779e2SAndrii Nakryiko break; 5259c64779e2SAndrii Nakryiko } 5260c64779e2SAndrii Nakryiko 5261c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5262c64779e2SAndrii Nakryiko } while (++nr_read_elems < test->max_entries && nread > 0); 5263c64779e2SAndrii Nakryiko 5264c64779e2SAndrii Nakryiko if (lossless_map && 5265c64779e2SAndrii Nakryiko CHECK(nr_read_elems < test->max_entries, 5266c64779e2SAndrii Nakryiko "Unexpected EOF. nr_read_elems:%u test->max_entries:%u", 5267c64779e2SAndrii Nakryiko nr_read_elems, test->max_entries)) { 5268c64779e2SAndrii Nakryiko err = -1; 5269c64779e2SAndrii Nakryiko goto done; 5270c64779e2SAndrii Nakryiko } 5271c64779e2SAndrii Nakryiko 5272c64779e2SAndrii Nakryiko if (CHECK(nread > 0, "Unexpected extra pprint output: %s", line)) { 5273c64779e2SAndrii Nakryiko err = -1; 5274c64779e2SAndrii Nakryiko goto done; 5275c64779e2SAndrii Nakryiko } 5276c64779e2SAndrii Nakryiko 5277c64779e2SAndrii Nakryiko err = 0; 5278c64779e2SAndrii Nakryiko 5279c64779e2SAndrii Nakryiko done: 5280c64779e2SAndrii Nakryiko if (mapv) 5281c64779e2SAndrii Nakryiko free(mapv); 5282c64779e2SAndrii Nakryiko if (!err) 5283c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 5284c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 5285c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 5286bad2e478SAndrii Nakryiko if (btf_fd >= 0) 5287c64779e2SAndrii Nakryiko close(btf_fd); 5288bad2e478SAndrii Nakryiko if (map_fd >= 0) 5289c64779e2SAndrii Nakryiko close(map_fd); 5290c64779e2SAndrii Nakryiko if (pin_file) 5291c64779e2SAndrii Nakryiko fclose(pin_file); 5292c64779e2SAndrii Nakryiko unlink(pin_path); 5293c64779e2SAndrii Nakryiko free(line); 5294c64779e2SAndrii Nakryiko } 5295c64779e2SAndrii Nakryiko 5296c64779e2SAndrii Nakryiko static void test_pprint(void) 5297c64779e2SAndrii Nakryiko { 5298c64779e2SAndrii Nakryiko unsigned int i; 5299c64779e2SAndrii Nakryiko 5300c64779e2SAndrii Nakryiko /* test various maps with the first test template */ 5301c64779e2SAndrii Nakryiko for (i = 0; i < ARRAY_SIZE(pprint_tests_meta); i++) { 5302c64779e2SAndrii Nakryiko pprint_test_template[0].descr = pprint_tests_meta[i].descr; 5303c64779e2SAndrii Nakryiko pprint_test_template[0].map_type = pprint_tests_meta[i].map_type; 5304c64779e2SAndrii Nakryiko pprint_test_template[0].map_name = pprint_tests_meta[i].map_name; 5305c64779e2SAndrii Nakryiko pprint_test_template[0].ordered_map = pprint_tests_meta[i].ordered_map; 5306c64779e2SAndrii Nakryiko pprint_test_template[0].lossless_map = pprint_tests_meta[i].lossless_map; 5307c64779e2SAndrii Nakryiko pprint_test_template[0].percpu_map = pprint_tests_meta[i].percpu_map; 5308c64779e2SAndrii Nakryiko 5309c64779e2SAndrii Nakryiko do_test_pprint(0); 5310c64779e2SAndrii Nakryiko } 5311c64779e2SAndrii Nakryiko 5312c64779e2SAndrii Nakryiko /* test rest test templates with the first map */ 5313c64779e2SAndrii Nakryiko for (i = 1; i < ARRAY_SIZE(pprint_test_template); i++) { 5314c64779e2SAndrii Nakryiko pprint_test_template[i].descr = pprint_tests_meta[0].descr; 5315c64779e2SAndrii Nakryiko pprint_test_template[i].map_type = pprint_tests_meta[0].map_type; 5316c64779e2SAndrii Nakryiko pprint_test_template[i].map_name = pprint_tests_meta[0].map_name; 5317c64779e2SAndrii Nakryiko pprint_test_template[i].ordered_map = pprint_tests_meta[0].ordered_map; 5318c64779e2SAndrii Nakryiko pprint_test_template[i].lossless_map = pprint_tests_meta[0].lossless_map; 5319c64779e2SAndrii Nakryiko pprint_test_template[i].percpu_map = pprint_tests_meta[0].percpu_map; 5320c64779e2SAndrii Nakryiko do_test_pprint(i); 5321c64779e2SAndrii Nakryiko } 5322c64779e2SAndrii Nakryiko } 5323c64779e2SAndrii Nakryiko 5324c64779e2SAndrii Nakryiko #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \ 5325c64779e2SAndrii Nakryiko (insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff)) 5326c64779e2SAndrii Nakryiko 5327c64779e2SAndrii Nakryiko static struct prog_info_raw_test { 5328c64779e2SAndrii Nakryiko const char *descr; 5329c64779e2SAndrii Nakryiko const char *str_sec; 5330c64779e2SAndrii Nakryiko const char *err_str; 5331c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 5332c64779e2SAndrii Nakryiko __u32 str_sec_size; 5333c64779e2SAndrii Nakryiko struct bpf_insn insns[MAX_INSNS]; 5334c64779e2SAndrii Nakryiko __u32 prog_type; 5335c64779e2SAndrii Nakryiko __u32 func_info[MAX_SUBPROGS][2]; 5336c64779e2SAndrii Nakryiko __u32 func_info_rec_size; 5337c64779e2SAndrii Nakryiko __u32 func_info_cnt; 5338c64779e2SAndrii Nakryiko __u32 line_info[MAX_NR_RAW_U32]; 5339c64779e2SAndrii Nakryiko __u32 line_info_rec_size; 5340c64779e2SAndrii Nakryiko __u32 nr_jited_ksyms; 5341c64779e2SAndrii Nakryiko bool expected_prog_load_failure; 5342c64779e2SAndrii Nakryiko __u32 dead_code_cnt; 5343c64779e2SAndrii Nakryiko __u32 dead_code_mask; 5344c64779e2SAndrii Nakryiko __u32 dead_func_cnt; 5345c64779e2SAndrii Nakryiko __u32 dead_func_mask; 5346c64779e2SAndrii Nakryiko } info_raw_tests[] = { 5347c64779e2SAndrii Nakryiko { 5348c64779e2SAndrii Nakryiko .descr = "func_type (main func + one sub)", 5349c64779e2SAndrii Nakryiko .raw_types = { 5350c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5351c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5352c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5353c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5354c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5355c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5356c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5357c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5358c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5359c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5360c64779e2SAndrii Nakryiko BTF_END_RAW, 5361c64779e2SAndrii Nakryiko }, 5362c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5363c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5364c64779e2SAndrii Nakryiko .insns = { 5365c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5366c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5367c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5368c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5369c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5370c64779e2SAndrii Nakryiko }, 5371c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5372c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5373c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5374c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5375c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5376c64779e2SAndrii Nakryiko }, 5377c64779e2SAndrii Nakryiko 5378c64779e2SAndrii Nakryiko { 5379c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect func_info_rec_size)", 5380c64779e2SAndrii Nakryiko .raw_types = { 5381c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5382c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5383c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5384c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5385c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5386c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5387c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5388c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5389c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5390c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5391c64779e2SAndrii Nakryiko BTF_END_RAW, 5392c64779e2SAndrii Nakryiko }, 5393c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5394c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5395c64779e2SAndrii Nakryiko .insns = { 5396c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5397c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5398c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5399c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5400c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5401c64779e2SAndrii Nakryiko }, 5402c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5403c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5404c64779e2SAndrii Nakryiko .func_info_rec_size = 4, 5405c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5406c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5407c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5408c64779e2SAndrii Nakryiko }, 5409c64779e2SAndrii Nakryiko 5410c64779e2SAndrii Nakryiko { 5411c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect func_info_cnt)", 5412c64779e2SAndrii Nakryiko .raw_types = { 5413c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5414c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5415c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5416c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5417c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5418c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5419c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5420c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5421c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5422c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5423c64779e2SAndrii Nakryiko BTF_END_RAW, 5424c64779e2SAndrii Nakryiko }, 5425c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5426c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5427c64779e2SAndrii Nakryiko .insns = { 5428c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5429c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5430c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5431c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5432c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5433c64779e2SAndrii Nakryiko }, 5434c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5435c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5436c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5437c64779e2SAndrii Nakryiko .func_info_cnt = 1, 5438c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5439c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5440c64779e2SAndrii Nakryiko }, 5441c64779e2SAndrii Nakryiko 5442c64779e2SAndrii Nakryiko { 5443c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect bpf_func_info.insn_off)", 5444c64779e2SAndrii Nakryiko .raw_types = { 5445c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5446c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5447c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5448c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5449c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5450c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5451c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5452c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5453c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5454c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5455c64779e2SAndrii Nakryiko BTF_END_RAW, 5456c64779e2SAndrii Nakryiko }, 5457c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5458c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5459c64779e2SAndrii Nakryiko .insns = { 5460c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5461c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5462c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5463c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5464c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5465c64779e2SAndrii Nakryiko }, 5466c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5467c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {2, 6} }, 5468c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5469c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5470c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5471c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5472c64779e2SAndrii Nakryiko }, 5473c64779e2SAndrii Nakryiko 5474c64779e2SAndrii Nakryiko { 5475c64779e2SAndrii Nakryiko .descr = "line_info (No subprog)", 5476c64779e2SAndrii Nakryiko .raw_types = { 5477c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5478c64779e2SAndrii Nakryiko BTF_END_RAW, 5479c64779e2SAndrii Nakryiko }, 5480c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5481c64779e2SAndrii Nakryiko .insns = { 5482c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5483c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5484c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5485c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5486c64779e2SAndrii Nakryiko }, 5487c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5488c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5489c64779e2SAndrii Nakryiko .line_info = { 5490c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5491c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5492c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5493c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5494c64779e2SAndrii Nakryiko BTF_END_RAW, 5495c64779e2SAndrii Nakryiko }, 5496c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5497c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5498c64779e2SAndrii Nakryiko }, 5499c64779e2SAndrii Nakryiko 5500c64779e2SAndrii Nakryiko { 5501c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. insn_off >= prog->len)", 5502c64779e2SAndrii Nakryiko .raw_types = { 5503c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5504c64779e2SAndrii Nakryiko BTF_END_RAW, 5505c64779e2SAndrii Nakryiko }, 5506c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5507c64779e2SAndrii Nakryiko .insns = { 5508c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5509c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5510c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5511c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5512c64779e2SAndrii Nakryiko }, 5513c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5514c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5515c64779e2SAndrii Nakryiko .line_info = { 5516c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5517c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5518c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5519c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5520c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, 0, 5, 6), 5521c64779e2SAndrii Nakryiko BTF_END_RAW, 5522c64779e2SAndrii Nakryiko }, 5523c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5524c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5525c64779e2SAndrii Nakryiko .err_str = "line_info[4].insn_off", 5526c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5527c64779e2SAndrii Nakryiko }, 5528c64779e2SAndrii Nakryiko 5529c64779e2SAndrii Nakryiko { 5530c64779e2SAndrii Nakryiko .descr = "line_info (Zero bpf insn code)", 5531c64779e2SAndrii Nakryiko .raw_types = { 5532c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5533c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), /* [2] */ 5534c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [3] */ 5535c64779e2SAndrii Nakryiko BTF_END_RAW, 5536c64779e2SAndrii Nakryiko }, 5537c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"), 5538c64779e2SAndrii Nakryiko .insns = { 5539c64779e2SAndrii Nakryiko BPF_LD_IMM64(BPF_REG_0, 1), 5540c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5541c64779e2SAndrii Nakryiko }, 5542c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5543c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5544c64779e2SAndrii Nakryiko .line_info = { 5545c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5546c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, 0, 2, 9), 5547c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5548c64779e2SAndrii Nakryiko BTF_END_RAW, 5549c64779e2SAndrii Nakryiko }, 5550c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5551c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5552c64779e2SAndrii Nakryiko .err_str = "Invalid insn code at line_info[1]", 5553c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5554c64779e2SAndrii Nakryiko }, 5555c64779e2SAndrii Nakryiko 5556c64779e2SAndrii Nakryiko { 5557c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. zero tailing line_info", 5558c64779e2SAndrii Nakryiko .raw_types = { 5559c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5560c64779e2SAndrii Nakryiko BTF_END_RAW, 5561c64779e2SAndrii Nakryiko }, 5562c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5563c64779e2SAndrii Nakryiko .insns = { 5564c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5565c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5566c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5567c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5568c64779e2SAndrii Nakryiko }, 5569c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5570c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5571c64779e2SAndrii Nakryiko .line_info = { 5572c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0, 5573c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0, 5574c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0, 5575c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 0, 5576c64779e2SAndrii Nakryiko BTF_END_RAW, 5577c64779e2SAndrii Nakryiko }, 5578c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32), 5579c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5580c64779e2SAndrii Nakryiko }, 5581c64779e2SAndrii Nakryiko 5582c64779e2SAndrii Nakryiko { 5583c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. nonzero tailing line_info)", 5584c64779e2SAndrii Nakryiko .raw_types = { 5585c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5586c64779e2SAndrii Nakryiko BTF_END_RAW, 5587c64779e2SAndrii Nakryiko }, 5588c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5589c64779e2SAndrii Nakryiko .insns = { 5590c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5591c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5592c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5593c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5594c64779e2SAndrii Nakryiko }, 5595c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5596c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5597c64779e2SAndrii Nakryiko .line_info = { 5598c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0, 5599c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0, 5600c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0, 5601c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 1, 5602c64779e2SAndrii Nakryiko BTF_END_RAW, 5603c64779e2SAndrii Nakryiko }, 5604c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32), 5605c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5606c64779e2SAndrii Nakryiko .err_str = "nonzero tailing record in line_info", 5607c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5608c64779e2SAndrii Nakryiko }, 5609c64779e2SAndrii Nakryiko 5610c64779e2SAndrii Nakryiko { 5611c64779e2SAndrii Nakryiko .descr = "line_info (subprog)", 5612c64779e2SAndrii Nakryiko .raw_types = { 5613c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5614c64779e2SAndrii Nakryiko BTF_END_RAW, 5615c64779e2SAndrii Nakryiko }, 5616c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5617c64779e2SAndrii Nakryiko .insns = { 5618c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5619c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5620c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5621c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5622c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5623c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5624c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5625c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5626c64779e2SAndrii Nakryiko }, 5627c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5628c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5629c64779e2SAndrii Nakryiko .line_info = { 5630c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5631c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5632c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5633c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5634c64779e2SAndrii Nakryiko BTF_END_RAW, 5635c64779e2SAndrii Nakryiko }, 5636c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5637c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5638c64779e2SAndrii Nakryiko }, 5639c64779e2SAndrii Nakryiko 5640c64779e2SAndrii Nakryiko { 5641c64779e2SAndrii Nakryiko .descr = "line_info (subprog + func_info)", 5642c64779e2SAndrii Nakryiko .raw_types = { 5643c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5644c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5645c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5646c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5647c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 5648c64779e2SAndrii Nakryiko BTF_END_RAW, 5649c64779e2SAndrii Nakryiko }, 5650c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0sub\0main\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 = 2, 5663c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5664c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {5, 3} }, 5665c64779e2SAndrii Nakryiko .line_info = { 5666c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5667c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5668c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5669c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5670c64779e2SAndrii Nakryiko BTF_END_RAW, 5671c64779e2SAndrii Nakryiko }, 5672c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5673c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5674c64779e2SAndrii Nakryiko }, 5675c64779e2SAndrii Nakryiko 5676c64779e2SAndrii Nakryiko { 5677c64779e2SAndrii Nakryiko .descr = "line_info (subprog. missing 1st func line info)", 5678c64779e2SAndrii Nakryiko .raw_types = { 5679c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5680c64779e2SAndrii Nakryiko BTF_END_RAW, 5681c64779e2SAndrii Nakryiko }, 5682c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5683c64779e2SAndrii Nakryiko .insns = { 5684c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5685c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5686c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5687c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5688c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5689c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5690c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5691c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5692c64779e2SAndrii Nakryiko }, 5693c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5694c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5695c64779e2SAndrii Nakryiko .line_info = { 5696c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 1, 10), 5697c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5698c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5699c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5700c64779e2SAndrii Nakryiko BTF_END_RAW, 5701c64779e2SAndrii Nakryiko }, 5702c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5703c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5704c64779e2SAndrii Nakryiko .err_str = "missing bpf_line_info for func#0", 5705c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5706c64779e2SAndrii Nakryiko }, 5707c64779e2SAndrii Nakryiko 5708c64779e2SAndrii Nakryiko { 5709c64779e2SAndrii Nakryiko .descr = "line_info (subprog. missing 2nd func line info)", 5710c64779e2SAndrii Nakryiko .raw_types = { 5711c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5712c64779e2SAndrii Nakryiko BTF_END_RAW, 5713c64779e2SAndrii Nakryiko }, 5714c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5715c64779e2SAndrii Nakryiko .insns = { 5716c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5717c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5718c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5719c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5720c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5721c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5722c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5723c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5724c64779e2SAndrii Nakryiko }, 5725c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5726c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5727c64779e2SAndrii Nakryiko .line_info = { 5728c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5729c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5730c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 3, 8), 5731c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5732c64779e2SAndrii Nakryiko BTF_END_RAW, 5733c64779e2SAndrii Nakryiko }, 5734c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5735c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5736c64779e2SAndrii Nakryiko .err_str = "missing bpf_line_info for func#1", 5737c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5738c64779e2SAndrii Nakryiko }, 5739c64779e2SAndrii Nakryiko 5740c64779e2SAndrii Nakryiko { 5741c64779e2SAndrii Nakryiko .descr = "line_info (subprog. unordered insn offset)", 5742c64779e2SAndrii Nakryiko .raw_types = { 5743c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5744c64779e2SAndrii Nakryiko BTF_END_RAW, 5745c64779e2SAndrii Nakryiko }, 5746c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5747c64779e2SAndrii Nakryiko .insns = { 5748c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5749c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5750c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5751c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5752c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5753c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5754c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5755c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5756c64779e2SAndrii Nakryiko }, 5757c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5758c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5759c64779e2SAndrii Nakryiko .line_info = { 5760c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5761c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 2, 9), 5762c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5763c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5764c64779e2SAndrii Nakryiko BTF_END_RAW, 5765c64779e2SAndrii Nakryiko }, 5766c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5767c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5768c64779e2SAndrii Nakryiko .err_str = "Invalid line_info[2].insn_off", 5769c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5770c64779e2SAndrii Nakryiko }, 5771c64779e2SAndrii Nakryiko 5772c64779e2SAndrii Nakryiko { 5773c64779e2SAndrii Nakryiko .descr = "line_info (dead start)", 5774c64779e2SAndrii Nakryiko .raw_types = { 5775c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5776c64779e2SAndrii Nakryiko BTF_END_RAW, 5777c64779e2SAndrii Nakryiko }, 5778c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5779c64779e2SAndrii Nakryiko .insns = { 5780c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 5781c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5782c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5783c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5784c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5785c64779e2SAndrii Nakryiko }, 5786c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5787c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5788c64779e2SAndrii Nakryiko .line_info = { 5789c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5790c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5791c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5792c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5793c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 6), 5794c64779e2SAndrii Nakryiko BTF_END_RAW, 5795c64779e2SAndrii Nakryiko }, 5796c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5797c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5798c64779e2SAndrii Nakryiko .dead_code_cnt = 1, 5799c64779e2SAndrii Nakryiko .dead_code_mask = 0x01, 5800c64779e2SAndrii Nakryiko }, 5801c64779e2SAndrii Nakryiko 5802c64779e2SAndrii Nakryiko { 5803c64779e2SAndrii Nakryiko .descr = "line_info (dead end)", 5804c64779e2SAndrii Nakryiko .raw_types = { 5805c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5806c64779e2SAndrii Nakryiko BTF_END_RAW, 5807c64779e2SAndrii Nakryiko }, 5808c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"), 5809c64779e2SAndrii Nakryiko .insns = { 5810c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5811c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5812c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5813c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1), 5814c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5815c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5816c64779e2SAndrii Nakryiko }, 5817c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5818c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5819c64779e2SAndrii Nakryiko .line_info = { 5820c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 12), 5821c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 11), 5822c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 10), 5823c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 9), 5824c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 8), 5825c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 6, 7), 5826c64779e2SAndrii Nakryiko BTF_END_RAW, 5827c64779e2SAndrii Nakryiko }, 5828c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5829c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5830c64779e2SAndrii Nakryiko .dead_code_cnt = 2, 5831c64779e2SAndrii Nakryiko .dead_code_mask = 0x28, 5832c64779e2SAndrii Nakryiko }, 5833c64779e2SAndrii Nakryiko 5834c64779e2SAndrii Nakryiko { 5835c64779e2SAndrii Nakryiko .descr = "line_info (dead code + subprog + func_info)", 5836c64779e2SAndrii Nakryiko .raw_types = { 5837c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5838c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5839c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5840c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5841c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 5842c64779e2SAndrii Nakryiko BTF_END_RAW, 5843c64779e2SAndrii Nakryiko }, 5844c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */" 5845c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 5846c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 5847c64779e2SAndrii Nakryiko "\0return func(a);\0b+=1;\0return b;"), 5848c64779e2SAndrii Nakryiko .insns = { 5849c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5850c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5851c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5852c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 8), 5853c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5854c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5855c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5856c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5857c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5858c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5859c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5860c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5861c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5862c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5863c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5864c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5865c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5866c64779e2SAndrii Nakryiko }, 5867c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5868c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5869c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5870c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {14, 3} }, 5871c64779e2SAndrii Nakryiko .line_info = { 5872c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5873c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 5874c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 5875c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 5876c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 5877c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 5878c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 5879c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 5880c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 5881c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 5882c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 5883c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(14, 0, NAME_TBD, 3, 8), 5884c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(16, 0, NAME_TBD, 4, 7), 5885c64779e2SAndrii Nakryiko BTF_END_RAW, 5886c64779e2SAndrii Nakryiko }, 5887c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5888c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5889c64779e2SAndrii Nakryiko .dead_code_cnt = 9, 5890c64779e2SAndrii Nakryiko .dead_code_mask = 0x3fe, 5891c64779e2SAndrii Nakryiko }, 5892c64779e2SAndrii Nakryiko 5893c64779e2SAndrii Nakryiko { 5894c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog)", 5895c64779e2SAndrii Nakryiko .raw_types = { 5896c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5897c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5898c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5899c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5900c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 5901c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 5902c64779e2SAndrii Nakryiko BTF_END_RAW, 5903c64779e2SAndrii Nakryiko }, 5904c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */" 5905c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0/* dead */\0/* dead */" 5906c64779e2SAndrii Nakryiko "\0/* dead */\0return bla + 1;\0return bla + 1;" 5907c64779e2SAndrii Nakryiko "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"), 5908c64779e2SAndrii Nakryiko .insns = { 5909c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5910c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 5911c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 5912c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 5913c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 5914c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5915c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 5916c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5917c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5918c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 5919c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5920c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5921c64779e2SAndrii Nakryiko }, 5922c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5923c64779e2SAndrii Nakryiko .func_info_cnt = 3, 5924c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5925c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {6, 3}, {9, 5} }, 5926c64779e2SAndrii Nakryiko .line_info = { 5927c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5928c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 5929c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 5930c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 5931c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 5932c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 5933c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 5934c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 5935c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 5936c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 5937c64779e2SAndrii Nakryiko BTF_END_RAW, 5938c64779e2SAndrii Nakryiko }, 5939c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5940c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5941c64779e2SAndrii Nakryiko .dead_code_cnt = 3, 5942c64779e2SAndrii Nakryiko .dead_code_mask = 0x70, 5943c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 5944c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 5945c64779e2SAndrii Nakryiko }, 5946c64779e2SAndrii Nakryiko 5947c64779e2SAndrii Nakryiko { 5948c64779e2SAndrii Nakryiko .descr = "line_info (dead last subprog)", 5949c64779e2SAndrii Nakryiko .raw_types = { 5950c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5951c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5952c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5953c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5954c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 5955c64779e2SAndrii Nakryiko BTF_END_RAW, 5956c64779e2SAndrii Nakryiko }, 5957c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */" 5958c64779e2SAndrii Nakryiko "\0return 0;\0/* dead */\0/* dead */"), 5959c64779e2SAndrii Nakryiko .insns = { 5960c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5961c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 5962c64779e2SAndrii Nakryiko BPF_CALL_REL(2), 5963c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 5964c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5965c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 5966c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5967c64779e2SAndrii Nakryiko }, 5968c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5969c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5970c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5971c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {5, 3} }, 5972c64779e2SAndrii Nakryiko .line_info = { 5973c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5974c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 5975c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 5976c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 5977c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 5978c64779e2SAndrii Nakryiko BTF_END_RAW, 5979c64779e2SAndrii Nakryiko }, 5980c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5981c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5982c64779e2SAndrii Nakryiko .dead_code_cnt = 2, 5983c64779e2SAndrii Nakryiko .dead_code_mask = 0x18, 5984c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 5985c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 5986c64779e2SAndrii Nakryiko }, 5987c64779e2SAndrii Nakryiko 5988c64779e2SAndrii Nakryiko { 5989c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog + dead start)", 5990c64779e2SAndrii Nakryiko .raw_types = { 5991c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5992c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5993c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5994c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5995c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 5996c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 5997c64779e2SAndrii Nakryiko BTF_END_RAW, 5998c64779e2SAndrii Nakryiko }, 5999c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */" 6000c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0return 0;" 6001c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 6002c64779e2SAndrii Nakryiko "\0return b + 1;\0return b + 1;\0return b + 1;"), 6003c64779e2SAndrii Nakryiko .insns = { 6004c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6005c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6006c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6007c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6008c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 6009c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6010c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6011c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6012c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6013c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6014c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6015c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 6016c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6017c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6018c64779e2SAndrii Nakryiko }, 6019c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6020c64779e2SAndrii Nakryiko .func_info_cnt = 3, 6021c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6022c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {7, 3}, {10, 5} }, 6023c64779e2SAndrii Nakryiko .line_info = { 6024c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6025c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6026c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6027c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6028c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6029c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6030c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6031c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6032c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 6033c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 6034c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 6035c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(13, 0, NAME_TBD, 2, 9), 6036c64779e2SAndrii Nakryiko BTF_END_RAW, 6037c64779e2SAndrii Nakryiko }, 6038c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6039c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6040c64779e2SAndrii Nakryiko .dead_code_cnt = 5, 6041c64779e2SAndrii Nakryiko .dead_code_mask = 0x1e2, 6042c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6043c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6044c64779e2SAndrii Nakryiko }, 6045c64779e2SAndrii Nakryiko 6046c64779e2SAndrii Nakryiko { 6047c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog + dead start w/ move)", 6048c64779e2SAndrii Nakryiko .raw_types = { 6049c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6050c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6051c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6052c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6053c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6054c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 6055c64779e2SAndrii Nakryiko BTF_END_RAW, 6056c64779e2SAndrii Nakryiko }, 6057c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */" 6058c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0/* dead */\0/* dead */" 6059c64779e2SAndrii Nakryiko "\0/* dead */\0return bla + 1;\0return bla + 1;" 6060c64779e2SAndrii Nakryiko "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"), 6061c64779e2SAndrii Nakryiko .insns = { 6062c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6063c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6064c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6065c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 6066c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6067c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6068c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6069c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6070c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6071c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6072c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 6073c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6074c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6075c64779e2SAndrii Nakryiko }, 6076c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6077c64779e2SAndrii Nakryiko .func_info_cnt = 3, 6078c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6079c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {6, 3}, {9, 5} }, 6080c64779e2SAndrii Nakryiko .line_info = { 6081c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6082c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6083c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6084c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6085c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6086c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6087c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6088c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6089c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 1, 10), 6090c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 6091c64779e2SAndrii Nakryiko BTF_END_RAW, 6092c64779e2SAndrii Nakryiko }, 6093c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6094c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6095c64779e2SAndrii Nakryiko .dead_code_cnt = 3, 6096c64779e2SAndrii Nakryiko .dead_code_mask = 0x70, 6097c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6098c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6099c64779e2SAndrii Nakryiko }, 6100c64779e2SAndrii Nakryiko 6101c64779e2SAndrii Nakryiko { 6102c64779e2SAndrii Nakryiko .descr = "line_info (dead end + subprog start w/ no linfo)", 6103c64779e2SAndrii Nakryiko .raw_types = { 6104c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6105c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6106c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6107c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6108c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6109c64779e2SAndrii Nakryiko BTF_END_RAW, 6110c64779e2SAndrii Nakryiko }, 6111c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"), 6112c64779e2SAndrii Nakryiko .insns = { 6113c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6114c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 1, 3), 6115c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6116c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6117c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6118c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6119c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6120c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6121c64779e2SAndrii Nakryiko }, 6122c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6123c64779e2SAndrii Nakryiko .func_info_cnt = 2, 6124c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6125c64779e2SAndrii Nakryiko .func_info = { {0, 3}, {6, 4}, }, 6126c64779e2SAndrii Nakryiko .line_info = { 6127c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6128c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6129c64779e2SAndrii Nakryiko BTF_END_RAW, 6130c64779e2SAndrii Nakryiko }, 6131c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6132c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6133c64779e2SAndrii Nakryiko }, 6134c64779e2SAndrii Nakryiko 6135c64779e2SAndrii Nakryiko }; 6136c64779e2SAndrii Nakryiko 6137c64779e2SAndrii Nakryiko static size_t probe_prog_length(const struct bpf_insn *fp) 6138c64779e2SAndrii Nakryiko { 6139c64779e2SAndrii Nakryiko size_t len; 6140c64779e2SAndrii Nakryiko 6141c64779e2SAndrii Nakryiko for (len = MAX_INSNS - 1; len > 0; --len) 6142c64779e2SAndrii Nakryiko if (fp[len].code != 0 || fp[len].imm != 0) 6143c64779e2SAndrii Nakryiko break; 6144c64779e2SAndrii Nakryiko return len + 1; 6145c64779e2SAndrii Nakryiko } 6146c64779e2SAndrii Nakryiko 6147c64779e2SAndrii Nakryiko static __u32 *patch_name_tbd(const __u32 *raw_u32, 6148c64779e2SAndrii Nakryiko const char *str, __u32 str_off, 6149c64779e2SAndrii Nakryiko unsigned int str_sec_size, 6150c64779e2SAndrii Nakryiko unsigned int *ret_size) 6151c64779e2SAndrii Nakryiko { 6152c64779e2SAndrii Nakryiko int i, raw_u32_size = get_raw_sec_size(raw_u32); 6153c64779e2SAndrii Nakryiko const char *end_str = str + str_sec_size; 6154c64779e2SAndrii Nakryiko const char *next_str = str + str_off; 6155c64779e2SAndrii Nakryiko __u32 *new_u32 = NULL; 6156c64779e2SAndrii Nakryiko 6157c64779e2SAndrii Nakryiko if (raw_u32_size == -1) 6158c64779e2SAndrii Nakryiko return ERR_PTR(-EINVAL); 6159c64779e2SAndrii Nakryiko 6160c64779e2SAndrii Nakryiko if (!raw_u32_size) { 6161c64779e2SAndrii Nakryiko *ret_size = 0; 6162c64779e2SAndrii Nakryiko return NULL; 6163c64779e2SAndrii Nakryiko } 6164c64779e2SAndrii Nakryiko 6165c64779e2SAndrii Nakryiko new_u32 = malloc(raw_u32_size); 6166c64779e2SAndrii Nakryiko if (!new_u32) 6167c64779e2SAndrii Nakryiko return ERR_PTR(-ENOMEM); 6168c64779e2SAndrii Nakryiko 6169c64779e2SAndrii Nakryiko for (i = 0; i < raw_u32_size / sizeof(raw_u32[0]); i++) { 6170c64779e2SAndrii Nakryiko if (raw_u32[i] == NAME_TBD) { 6171c64779e2SAndrii Nakryiko next_str = get_next_str(next_str, end_str); 6172c64779e2SAndrii Nakryiko if (CHECK(!next_str, "Error in getting next_str\n")) { 6173c64779e2SAndrii Nakryiko free(new_u32); 6174c64779e2SAndrii Nakryiko return ERR_PTR(-EINVAL); 6175c64779e2SAndrii Nakryiko } 6176c64779e2SAndrii Nakryiko new_u32[i] = next_str - str; 6177c64779e2SAndrii Nakryiko next_str += strlen(next_str); 6178c64779e2SAndrii Nakryiko } else { 6179c64779e2SAndrii Nakryiko new_u32[i] = raw_u32[i]; 6180c64779e2SAndrii Nakryiko } 6181c64779e2SAndrii Nakryiko } 6182c64779e2SAndrii Nakryiko 6183c64779e2SAndrii Nakryiko *ret_size = raw_u32_size; 6184c64779e2SAndrii Nakryiko return new_u32; 6185c64779e2SAndrii Nakryiko } 6186c64779e2SAndrii Nakryiko 6187c64779e2SAndrii Nakryiko static int test_get_finfo(const struct prog_info_raw_test *test, 6188c64779e2SAndrii Nakryiko int prog_fd) 6189c64779e2SAndrii Nakryiko { 6190c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 6191c64779e2SAndrii Nakryiko struct bpf_func_info *finfo; 6192c64779e2SAndrii Nakryiko __u32 info_len, rec_size, i; 6193c64779e2SAndrii Nakryiko void *func_info = NULL; 6194c64779e2SAndrii Nakryiko __u32 nr_func_info; 6195c64779e2SAndrii Nakryiko int err; 6196c64779e2SAndrii Nakryiko 6197c64779e2SAndrii Nakryiko /* get necessary lens */ 6198c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 6199c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6200bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) { 6201c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 6202c64779e2SAndrii Nakryiko return -1; 6203c64779e2SAndrii Nakryiko } 6204c64779e2SAndrii Nakryiko nr_func_info = test->func_info_cnt - test->dead_func_cnt; 6205c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != nr_func_info, 6206c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (1st) %d", 6207c64779e2SAndrii Nakryiko info.nr_func_info)) { 6208c64779e2SAndrii Nakryiko return -1; 6209c64779e2SAndrii Nakryiko } 6210c64779e2SAndrii Nakryiko 6211c64779e2SAndrii Nakryiko rec_size = info.func_info_rec_size; 6212c64779e2SAndrii Nakryiko if (CHECK(rec_size != sizeof(struct bpf_func_info), 6213c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (1st) %d", rec_size)) { 6214c64779e2SAndrii Nakryiko return -1; 6215c64779e2SAndrii Nakryiko } 6216c64779e2SAndrii Nakryiko 6217c64779e2SAndrii Nakryiko if (!info.nr_func_info) 6218c64779e2SAndrii Nakryiko return 0; 6219c64779e2SAndrii Nakryiko 6220c64779e2SAndrii Nakryiko func_info = malloc(info.nr_func_info * rec_size); 6221c64779e2SAndrii Nakryiko if (CHECK(!func_info, "out of memory")) 6222c64779e2SAndrii Nakryiko return -1; 6223c64779e2SAndrii Nakryiko 6224c64779e2SAndrii Nakryiko /* reset info to only retrieve func_info related data */ 6225c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 6226c64779e2SAndrii Nakryiko info.nr_func_info = nr_func_info; 6227c64779e2SAndrii Nakryiko info.func_info_rec_size = rec_size; 6228c64779e2SAndrii Nakryiko info.func_info = ptr_to_u64(func_info); 6229c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6230bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) { 6231c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 6232c64779e2SAndrii Nakryiko err = -1; 6233c64779e2SAndrii Nakryiko goto done; 6234c64779e2SAndrii Nakryiko } 6235c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != nr_func_info, 6236c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (2nd) %d", 6237c64779e2SAndrii Nakryiko info.nr_func_info)) { 6238c64779e2SAndrii Nakryiko err = -1; 6239c64779e2SAndrii Nakryiko goto done; 6240c64779e2SAndrii Nakryiko } 6241c64779e2SAndrii Nakryiko if (CHECK(info.func_info_rec_size != rec_size, 6242c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (2nd) %d", 6243c64779e2SAndrii Nakryiko info.func_info_rec_size)) { 6244c64779e2SAndrii Nakryiko err = -1; 6245c64779e2SAndrii Nakryiko goto done; 6246c64779e2SAndrii Nakryiko } 6247c64779e2SAndrii Nakryiko 6248c64779e2SAndrii Nakryiko finfo = func_info; 6249c64779e2SAndrii Nakryiko for (i = 0; i < nr_func_info; i++) { 6250c64779e2SAndrii Nakryiko if (test->dead_func_mask & (1 << i)) 6251c64779e2SAndrii Nakryiko continue; 6252c64779e2SAndrii Nakryiko if (CHECK(finfo->type_id != test->func_info[i][1], 6253c64779e2SAndrii Nakryiko "incorrect func_type %u expected %u", 6254c64779e2SAndrii Nakryiko finfo->type_id, test->func_info[i][1])) { 6255c64779e2SAndrii Nakryiko err = -1; 6256c64779e2SAndrii Nakryiko goto done; 6257c64779e2SAndrii Nakryiko } 6258c64779e2SAndrii Nakryiko finfo = (void *)finfo + rec_size; 6259c64779e2SAndrii Nakryiko } 6260c64779e2SAndrii Nakryiko 6261c64779e2SAndrii Nakryiko err = 0; 6262c64779e2SAndrii Nakryiko 6263c64779e2SAndrii Nakryiko done: 6264c64779e2SAndrii Nakryiko free(func_info); 6265c64779e2SAndrii Nakryiko return err; 6266c64779e2SAndrii Nakryiko } 6267c64779e2SAndrii Nakryiko 6268c64779e2SAndrii Nakryiko static int test_get_linfo(const struct prog_info_raw_test *test, 6269c64779e2SAndrii Nakryiko const void *patched_linfo, 6270c64779e2SAndrii Nakryiko __u32 cnt, int prog_fd) 6271c64779e2SAndrii Nakryiko { 6272c64779e2SAndrii Nakryiko __u32 i, info_len, nr_jited_ksyms, nr_jited_func_lens; 6273c64779e2SAndrii Nakryiko __u64 *jited_linfo = NULL, *jited_ksyms = NULL; 6274c64779e2SAndrii Nakryiko __u32 rec_size, jited_rec_size, jited_cnt; 6275c64779e2SAndrii Nakryiko struct bpf_line_info *linfo = NULL; 6276c64779e2SAndrii Nakryiko __u32 cur_func_len, ksyms_found; 6277c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 6278c64779e2SAndrii Nakryiko __u32 *jited_func_lens = NULL; 6279c64779e2SAndrii Nakryiko __u64 cur_func_ksyms; 6280c64779e2SAndrii Nakryiko __u32 dead_insns; 6281c64779e2SAndrii Nakryiko int err; 6282c64779e2SAndrii Nakryiko 6283c64779e2SAndrii Nakryiko jited_cnt = cnt; 6284c64779e2SAndrii Nakryiko rec_size = sizeof(*linfo); 6285c64779e2SAndrii Nakryiko jited_rec_size = sizeof(*jited_linfo); 6286c64779e2SAndrii Nakryiko if (test->nr_jited_ksyms) 6287c64779e2SAndrii Nakryiko nr_jited_ksyms = test->nr_jited_ksyms; 6288c64779e2SAndrii Nakryiko else 6289c64779e2SAndrii Nakryiko nr_jited_ksyms = test->func_info_cnt - test->dead_func_cnt; 6290c64779e2SAndrii Nakryiko nr_jited_func_lens = nr_jited_ksyms; 6291c64779e2SAndrii Nakryiko 6292c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 6293c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6294bad2e478SAndrii Nakryiko if (CHECK(err < 0, "err:%d errno:%d", err, errno)) { 6295c64779e2SAndrii Nakryiko err = -1; 6296c64779e2SAndrii Nakryiko goto done; 6297c64779e2SAndrii Nakryiko } 6298c64779e2SAndrii Nakryiko 6299c64779e2SAndrii Nakryiko if (!info.jited_prog_len) { 6300c64779e2SAndrii Nakryiko /* prog is not jited */ 6301c64779e2SAndrii Nakryiko jited_cnt = 0; 6302c64779e2SAndrii Nakryiko nr_jited_ksyms = 1; 6303c64779e2SAndrii Nakryiko nr_jited_func_lens = 1; 6304c64779e2SAndrii Nakryiko } 6305c64779e2SAndrii Nakryiko 6306c64779e2SAndrii Nakryiko if (CHECK(info.nr_line_info != cnt || 6307c64779e2SAndrii Nakryiko info.nr_jited_line_info != jited_cnt || 6308c64779e2SAndrii Nakryiko info.nr_jited_ksyms != nr_jited_ksyms || 6309c64779e2SAndrii Nakryiko info.nr_jited_func_lens != nr_jited_func_lens || 6310c64779e2SAndrii Nakryiko (!info.nr_line_info && info.nr_jited_line_info), 6311c64779e2SAndrii 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)", 6312c64779e2SAndrii Nakryiko info.nr_line_info, cnt, 6313c64779e2SAndrii Nakryiko info.nr_jited_line_info, jited_cnt, 6314c64779e2SAndrii Nakryiko info.nr_jited_ksyms, nr_jited_ksyms, 6315c64779e2SAndrii Nakryiko info.nr_jited_func_lens, nr_jited_func_lens)) { 6316c64779e2SAndrii Nakryiko err = -1; 6317c64779e2SAndrii Nakryiko goto done; 6318c64779e2SAndrii Nakryiko } 6319c64779e2SAndrii Nakryiko 6320c64779e2SAndrii Nakryiko if (CHECK(info.line_info_rec_size != sizeof(struct bpf_line_info) || 6321c64779e2SAndrii Nakryiko info.jited_line_info_rec_size != sizeof(__u64), 6322c64779e2SAndrii Nakryiko "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)", 6323c64779e2SAndrii Nakryiko info.line_info_rec_size, rec_size, 6324c64779e2SAndrii Nakryiko info.jited_line_info_rec_size, jited_rec_size)) { 6325c64779e2SAndrii Nakryiko err = -1; 6326c64779e2SAndrii Nakryiko goto done; 6327c64779e2SAndrii Nakryiko } 6328c64779e2SAndrii Nakryiko 6329c64779e2SAndrii Nakryiko if (!cnt) 6330c64779e2SAndrii Nakryiko return 0; 6331c64779e2SAndrii Nakryiko 6332c64779e2SAndrii Nakryiko rec_size = info.line_info_rec_size; 6333c64779e2SAndrii Nakryiko jited_rec_size = info.jited_line_info_rec_size; 6334c64779e2SAndrii Nakryiko 6335c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 6336c64779e2SAndrii Nakryiko 6337c64779e2SAndrii Nakryiko linfo = calloc(cnt, rec_size); 6338c64779e2SAndrii Nakryiko if (CHECK(!linfo, "!linfo")) { 6339c64779e2SAndrii Nakryiko err = -1; 6340c64779e2SAndrii Nakryiko goto done; 6341c64779e2SAndrii Nakryiko } 6342c64779e2SAndrii Nakryiko info.nr_line_info = cnt; 6343c64779e2SAndrii Nakryiko info.line_info_rec_size = rec_size; 6344c64779e2SAndrii Nakryiko info.line_info = ptr_to_u64(linfo); 6345c64779e2SAndrii Nakryiko 6346c64779e2SAndrii Nakryiko if (jited_cnt) { 6347c64779e2SAndrii Nakryiko jited_linfo = calloc(jited_cnt, jited_rec_size); 6348c64779e2SAndrii Nakryiko jited_ksyms = calloc(nr_jited_ksyms, sizeof(*jited_ksyms)); 6349c64779e2SAndrii Nakryiko jited_func_lens = calloc(nr_jited_func_lens, 6350c64779e2SAndrii Nakryiko sizeof(*jited_func_lens)); 6351c64779e2SAndrii Nakryiko if (CHECK(!jited_linfo || !jited_ksyms || !jited_func_lens, 6352c64779e2SAndrii Nakryiko "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p", 6353c64779e2SAndrii Nakryiko jited_linfo, jited_ksyms, jited_func_lens)) { 6354c64779e2SAndrii Nakryiko err = -1; 6355c64779e2SAndrii Nakryiko goto done; 6356c64779e2SAndrii Nakryiko } 6357c64779e2SAndrii Nakryiko 6358c64779e2SAndrii Nakryiko info.nr_jited_line_info = jited_cnt; 6359c64779e2SAndrii Nakryiko info.jited_line_info_rec_size = jited_rec_size; 6360c64779e2SAndrii Nakryiko info.jited_line_info = ptr_to_u64(jited_linfo); 6361c64779e2SAndrii Nakryiko info.nr_jited_ksyms = nr_jited_ksyms; 6362c64779e2SAndrii Nakryiko info.jited_ksyms = ptr_to_u64(jited_ksyms); 6363c64779e2SAndrii Nakryiko info.nr_jited_func_lens = nr_jited_func_lens; 6364c64779e2SAndrii Nakryiko info.jited_func_lens = ptr_to_u64(jited_func_lens); 6365c64779e2SAndrii Nakryiko } 6366c64779e2SAndrii Nakryiko 6367c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6368c64779e2SAndrii Nakryiko 6369c64779e2SAndrii Nakryiko /* 6370c64779e2SAndrii Nakryiko * Only recheck the info.*line_info* fields. 6371c64779e2SAndrii Nakryiko * Other fields are not the concern of this test. 6372c64779e2SAndrii Nakryiko */ 6373bad2e478SAndrii Nakryiko if (CHECK(err < 0 || 6374c64779e2SAndrii Nakryiko info.nr_line_info != cnt || 6375c64779e2SAndrii Nakryiko (jited_cnt && !info.jited_line_info) || 6376c64779e2SAndrii Nakryiko info.nr_jited_line_info != jited_cnt || 6377c64779e2SAndrii Nakryiko info.line_info_rec_size != rec_size || 6378c64779e2SAndrii Nakryiko info.jited_line_info_rec_size != jited_rec_size, 6379c64779e2SAndrii 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", 6380c64779e2SAndrii Nakryiko err, errno, 6381c64779e2SAndrii Nakryiko info.nr_line_info, cnt, 6382c64779e2SAndrii Nakryiko info.nr_jited_line_info, jited_cnt, 6383c64779e2SAndrii Nakryiko info.line_info_rec_size, rec_size, 6384c64779e2SAndrii Nakryiko info.jited_line_info_rec_size, jited_rec_size, 6385c64779e2SAndrii Nakryiko (void *)(long)info.line_info, 6386c64779e2SAndrii Nakryiko (void *)(long)info.jited_line_info)) { 6387c64779e2SAndrii Nakryiko err = -1; 6388c64779e2SAndrii Nakryiko goto done; 6389c64779e2SAndrii Nakryiko } 6390c64779e2SAndrii Nakryiko 6391c64779e2SAndrii Nakryiko dead_insns = 0; 6392c64779e2SAndrii Nakryiko while (test->dead_code_mask & (1 << dead_insns)) 6393c64779e2SAndrii Nakryiko dead_insns++; 6394c64779e2SAndrii Nakryiko 6395c64779e2SAndrii Nakryiko CHECK(linfo[0].insn_off, "linfo[0].insn_off:%u", 6396c64779e2SAndrii Nakryiko linfo[0].insn_off); 6397c64779e2SAndrii Nakryiko for (i = 1; i < cnt; i++) { 6398c64779e2SAndrii Nakryiko const struct bpf_line_info *expected_linfo; 6399c64779e2SAndrii Nakryiko 6400c64779e2SAndrii Nakryiko while (test->dead_code_mask & (1 << (i + dead_insns))) 6401c64779e2SAndrii Nakryiko dead_insns++; 6402c64779e2SAndrii Nakryiko 6403c64779e2SAndrii Nakryiko expected_linfo = patched_linfo + 6404c64779e2SAndrii Nakryiko ((i + dead_insns) * test->line_info_rec_size); 6405c64779e2SAndrii Nakryiko if (CHECK(linfo[i].insn_off <= linfo[i - 1].insn_off, 6406c64779e2SAndrii Nakryiko "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u", 6407c64779e2SAndrii Nakryiko i, linfo[i].insn_off, 6408c64779e2SAndrii Nakryiko i - 1, linfo[i - 1].insn_off)) { 6409c64779e2SAndrii Nakryiko err = -1; 6410c64779e2SAndrii Nakryiko goto done; 6411c64779e2SAndrii Nakryiko } 6412c64779e2SAndrii Nakryiko if (CHECK(linfo[i].file_name_off != expected_linfo->file_name_off || 6413c64779e2SAndrii Nakryiko linfo[i].line_off != expected_linfo->line_off || 6414c64779e2SAndrii Nakryiko linfo[i].line_col != expected_linfo->line_col, 6415c64779e2SAndrii Nakryiko "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i, 6416c64779e2SAndrii Nakryiko linfo[i].file_name_off, 6417c64779e2SAndrii Nakryiko linfo[i].line_off, 6418c64779e2SAndrii Nakryiko linfo[i].line_col, 6419c64779e2SAndrii Nakryiko expected_linfo->file_name_off, 6420c64779e2SAndrii Nakryiko expected_linfo->line_off, 6421c64779e2SAndrii Nakryiko expected_linfo->line_col)) { 6422c64779e2SAndrii Nakryiko err = -1; 6423c64779e2SAndrii Nakryiko goto done; 6424c64779e2SAndrii Nakryiko } 6425c64779e2SAndrii Nakryiko } 6426c64779e2SAndrii Nakryiko 6427c64779e2SAndrii Nakryiko if (!jited_cnt) { 6428c64779e2SAndrii Nakryiko fprintf(stderr, "not jited. skipping jited_line_info check. "); 6429c64779e2SAndrii Nakryiko err = 0; 6430c64779e2SAndrii Nakryiko goto done; 6431c64779e2SAndrii Nakryiko } 6432c64779e2SAndrii Nakryiko 6433c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[0] != jited_ksyms[0], 6434c64779e2SAndrii Nakryiko "jited_linfo[0]:%lx != jited_ksyms[0]:%lx", 6435c64779e2SAndrii Nakryiko (long)(jited_linfo[0]), (long)(jited_ksyms[0]))) { 6436c64779e2SAndrii Nakryiko err = -1; 6437c64779e2SAndrii Nakryiko goto done; 6438c64779e2SAndrii Nakryiko } 6439c64779e2SAndrii Nakryiko 6440c64779e2SAndrii Nakryiko ksyms_found = 1; 6441c64779e2SAndrii Nakryiko cur_func_len = jited_func_lens[0]; 6442c64779e2SAndrii Nakryiko cur_func_ksyms = jited_ksyms[0]; 6443c64779e2SAndrii Nakryiko for (i = 1; i < jited_cnt; i++) { 6444c64779e2SAndrii Nakryiko if (ksyms_found < nr_jited_ksyms && 6445c64779e2SAndrii Nakryiko jited_linfo[i] == jited_ksyms[ksyms_found]) { 6446c64779e2SAndrii Nakryiko cur_func_ksyms = jited_ksyms[ksyms_found]; 6447c64779e2SAndrii Nakryiko cur_func_len = jited_ksyms[ksyms_found]; 6448c64779e2SAndrii Nakryiko ksyms_found++; 6449c64779e2SAndrii Nakryiko continue; 6450c64779e2SAndrii Nakryiko } 6451c64779e2SAndrii Nakryiko 6452c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[i] <= jited_linfo[i - 1], 6453c64779e2SAndrii Nakryiko "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx", 6454c64779e2SAndrii Nakryiko i, (long)jited_linfo[i], 6455c64779e2SAndrii Nakryiko i - 1, (long)(jited_linfo[i - 1]))) { 6456c64779e2SAndrii Nakryiko err = -1; 6457c64779e2SAndrii Nakryiko goto done; 6458c64779e2SAndrii Nakryiko } 6459c64779e2SAndrii Nakryiko 6460c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[i] - cur_func_ksyms > cur_func_len, 6461c64779e2SAndrii Nakryiko "jited_linfo[%u]:%lx - %lx > %u", 6462c64779e2SAndrii Nakryiko i, (long)jited_linfo[i], (long)cur_func_ksyms, 6463c64779e2SAndrii Nakryiko cur_func_len)) { 6464c64779e2SAndrii Nakryiko err = -1; 6465c64779e2SAndrii Nakryiko goto done; 6466c64779e2SAndrii Nakryiko } 6467c64779e2SAndrii Nakryiko } 6468c64779e2SAndrii Nakryiko 6469c64779e2SAndrii Nakryiko if (CHECK(ksyms_found != nr_jited_ksyms, 6470c64779e2SAndrii Nakryiko "ksyms_found:%u != nr_jited_ksyms:%u", 6471c64779e2SAndrii Nakryiko ksyms_found, nr_jited_ksyms)) { 6472c64779e2SAndrii Nakryiko err = -1; 6473c64779e2SAndrii Nakryiko goto done; 6474c64779e2SAndrii Nakryiko } 6475c64779e2SAndrii Nakryiko 6476c64779e2SAndrii Nakryiko err = 0; 6477c64779e2SAndrii Nakryiko 6478c64779e2SAndrii Nakryiko done: 6479c64779e2SAndrii Nakryiko free(linfo); 6480c64779e2SAndrii Nakryiko free(jited_linfo); 6481c64779e2SAndrii Nakryiko free(jited_ksyms); 6482c64779e2SAndrii Nakryiko free(jited_func_lens); 6483c64779e2SAndrii Nakryiko return err; 6484c64779e2SAndrii Nakryiko } 6485c64779e2SAndrii Nakryiko 6486c64779e2SAndrii Nakryiko static void do_test_info_raw(unsigned int test_num) 6487c64779e2SAndrii Nakryiko { 6488c64779e2SAndrii Nakryiko const struct prog_info_raw_test *test = &info_raw_tests[test_num - 1]; 6489c64779e2SAndrii Nakryiko unsigned int raw_btf_size, linfo_str_off, linfo_size; 6490c64779e2SAndrii Nakryiko int btf_fd = -1, prog_fd = -1, err = 0; 6491c64779e2SAndrii Nakryiko void *raw_btf, *patched_linfo = NULL; 6492c64779e2SAndrii Nakryiko const char *ret_next_str; 6493c64779e2SAndrii Nakryiko union bpf_attr attr = {}; 6494c64779e2SAndrii Nakryiko 6495c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 6496c64779e2SAndrii Nakryiko return; 6497c64779e2SAndrii Nakryiko 6498c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types, 6499c64779e2SAndrii Nakryiko test->str_sec, test->str_sec_size, 6500c64779e2SAndrii Nakryiko &raw_btf_size, &ret_next_str); 6501c64779e2SAndrii Nakryiko if (!raw_btf) 6502c64779e2SAndrii Nakryiko return; 6503c64779e2SAndrii Nakryiko 6504c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 6505c64779e2SAndrii Nakryiko btf_fd = bpf_load_btf(raw_btf, raw_btf_size, 6506c64779e2SAndrii Nakryiko btf_log_buf, BTF_LOG_BUF_SIZE, 6507c64779e2SAndrii Nakryiko always_log); 6508c64779e2SAndrii Nakryiko free(raw_btf); 6509c64779e2SAndrii Nakryiko 6510bad2e478SAndrii Nakryiko if (CHECK(btf_fd < 0, "invalid btf_fd errno:%d", errno)) { 6511c64779e2SAndrii Nakryiko err = -1; 6512c64779e2SAndrii Nakryiko goto done; 6513c64779e2SAndrii Nakryiko } 6514c64779e2SAndrii Nakryiko 6515c64779e2SAndrii Nakryiko if (*btf_log_buf && always_log) 6516c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 6517c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 6518c64779e2SAndrii Nakryiko 6519c64779e2SAndrii Nakryiko linfo_str_off = ret_next_str - test->str_sec; 6520c64779e2SAndrii Nakryiko patched_linfo = patch_name_tbd(test->line_info, 6521c64779e2SAndrii Nakryiko test->str_sec, linfo_str_off, 6522c64779e2SAndrii Nakryiko test->str_sec_size, &linfo_size); 6523bad2e478SAndrii Nakryiko err = libbpf_get_error(patched_linfo); 6524bad2e478SAndrii Nakryiko if (err) { 6525c64779e2SAndrii Nakryiko fprintf(stderr, "error in creating raw bpf_line_info"); 6526c64779e2SAndrii Nakryiko err = -1; 6527c64779e2SAndrii Nakryiko goto done; 6528c64779e2SAndrii Nakryiko } 6529c64779e2SAndrii Nakryiko 6530c64779e2SAndrii Nakryiko attr.prog_type = test->prog_type; 6531c64779e2SAndrii Nakryiko attr.insns = ptr_to_u64(test->insns); 6532c64779e2SAndrii Nakryiko attr.insn_cnt = probe_prog_length(test->insns); 6533c64779e2SAndrii Nakryiko attr.license = ptr_to_u64("GPL"); 6534c64779e2SAndrii Nakryiko attr.prog_btf_fd = btf_fd; 6535c64779e2SAndrii Nakryiko attr.func_info_rec_size = test->func_info_rec_size; 6536c64779e2SAndrii Nakryiko attr.func_info_cnt = test->func_info_cnt; 6537c64779e2SAndrii Nakryiko attr.func_info = ptr_to_u64(test->func_info); 6538c64779e2SAndrii Nakryiko attr.log_buf = ptr_to_u64(btf_log_buf); 6539c64779e2SAndrii Nakryiko attr.log_size = BTF_LOG_BUF_SIZE; 6540c64779e2SAndrii Nakryiko attr.log_level = 1; 6541c64779e2SAndrii Nakryiko if (linfo_size) { 6542c64779e2SAndrii Nakryiko attr.line_info_rec_size = test->line_info_rec_size; 6543c64779e2SAndrii Nakryiko attr.line_info = ptr_to_u64(patched_linfo); 6544c64779e2SAndrii Nakryiko attr.line_info_cnt = linfo_size / attr.line_info_rec_size; 6545c64779e2SAndrii Nakryiko } 6546c64779e2SAndrii Nakryiko 6547c64779e2SAndrii Nakryiko prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr)); 6548bad2e478SAndrii Nakryiko err = ((prog_fd < 0) != test->expected_prog_load_failure); 6549c64779e2SAndrii Nakryiko if (CHECK(err, "prog_fd:%d expected_prog_load_failure:%u errno:%d", 6550c64779e2SAndrii Nakryiko prog_fd, test->expected_prog_load_failure, errno) || 6551c64779e2SAndrii Nakryiko CHECK(test->err_str && !strstr(btf_log_buf, test->err_str), 6552c64779e2SAndrii Nakryiko "expected err_str:%s", test->err_str)) { 6553c64779e2SAndrii Nakryiko err = -1; 6554c64779e2SAndrii Nakryiko goto done; 6555c64779e2SAndrii Nakryiko } 6556c64779e2SAndrii Nakryiko 6557bad2e478SAndrii Nakryiko if (prog_fd < 0) 6558c64779e2SAndrii Nakryiko goto done; 6559c64779e2SAndrii Nakryiko 6560c64779e2SAndrii Nakryiko err = test_get_finfo(test, prog_fd); 6561c64779e2SAndrii Nakryiko if (err) 6562c64779e2SAndrii Nakryiko goto done; 6563c64779e2SAndrii Nakryiko 6564c64779e2SAndrii Nakryiko err = test_get_linfo(test, patched_linfo, 6565c64779e2SAndrii Nakryiko attr.line_info_cnt - test->dead_code_cnt, 6566c64779e2SAndrii Nakryiko prog_fd); 6567c64779e2SAndrii Nakryiko if (err) 6568c64779e2SAndrii Nakryiko goto done; 6569c64779e2SAndrii Nakryiko 6570c64779e2SAndrii Nakryiko done: 6571c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 6572c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 6573c64779e2SAndrii Nakryiko 6574bad2e478SAndrii Nakryiko if (btf_fd >= 0) 6575c64779e2SAndrii Nakryiko close(btf_fd); 6576bad2e478SAndrii Nakryiko if (prog_fd >= 0) 6577c64779e2SAndrii Nakryiko close(prog_fd); 6578c64779e2SAndrii Nakryiko 6579bad2e478SAndrii Nakryiko if (!libbpf_get_error(patched_linfo)) 6580c64779e2SAndrii Nakryiko free(patched_linfo); 6581c64779e2SAndrii Nakryiko } 6582c64779e2SAndrii Nakryiko 6583c64779e2SAndrii Nakryiko struct btf_raw_data { 6584c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 6585c64779e2SAndrii Nakryiko const char *str_sec; 6586c64779e2SAndrii Nakryiko __u32 str_sec_size; 6587c64779e2SAndrii Nakryiko }; 6588c64779e2SAndrii Nakryiko 6589c64779e2SAndrii Nakryiko struct btf_dedup_test { 6590c64779e2SAndrii Nakryiko const char *descr; 6591c64779e2SAndrii Nakryiko struct btf_raw_data input; 6592c64779e2SAndrii Nakryiko struct btf_raw_data expect; 6593c64779e2SAndrii Nakryiko struct btf_dedup_opts opts; 6594c64779e2SAndrii Nakryiko }; 6595c64779e2SAndrii Nakryiko 6596c64779e2SAndrii Nakryiko const struct btf_dedup_test dedup_tests[] = { 6597c64779e2SAndrii Nakryiko 6598c64779e2SAndrii Nakryiko { 6599c64779e2SAndrii Nakryiko .descr = "dedup: unused strings filtering", 6600c64779e2SAndrii Nakryiko .input = { 6601c64779e2SAndrii Nakryiko .raw_types = { 6602c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 4), 6603c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 64, 8), 6604c64779e2SAndrii Nakryiko BTF_END_RAW, 6605c64779e2SAndrii Nakryiko }, 6606c64779e2SAndrii Nakryiko BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"), 6607c64779e2SAndrii Nakryiko }, 6608c64779e2SAndrii Nakryiko .expect = { 6609c64779e2SAndrii Nakryiko .raw_types = { 6610c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6611c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6612c64779e2SAndrii Nakryiko BTF_END_RAW, 6613c64779e2SAndrii Nakryiko }, 6614c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long"), 6615c64779e2SAndrii Nakryiko }, 6616c64779e2SAndrii Nakryiko .opts = { 6617c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6618c64779e2SAndrii Nakryiko }, 6619c64779e2SAndrii Nakryiko }, 6620c64779e2SAndrii Nakryiko { 6621c64779e2SAndrii Nakryiko .descr = "dedup: strings deduplication", 6622c64779e2SAndrii Nakryiko .input = { 6623c64779e2SAndrii Nakryiko .raw_types = { 6624c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6625c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6626c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED, 0, 32, 4), 6627c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 64, 8), 6628c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4), 6629c64779e2SAndrii Nakryiko BTF_END_RAW, 6630c64779e2SAndrii Nakryiko }, 6631c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long int\0int\0long int\0int"), 6632c64779e2SAndrii Nakryiko }, 6633c64779e2SAndrii Nakryiko .expect = { 6634c64779e2SAndrii Nakryiko .raw_types = { 6635c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6636c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6637c64779e2SAndrii Nakryiko BTF_END_RAW, 6638c64779e2SAndrii Nakryiko }, 6639c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long int"), 6640c64779e2SAndrii Nakryiko }, 6641c64779e2SAndrii Nakryiko .opts = { 6642c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6643c64779e2SAndrii Nakryiko }, 6644c64779e2SAndrii Nakryiko }, 6645c64779e2SAndrii Nakryiko { 6646c64779e2SAndrii Nakryiko .descr = "dedup: struct example #1", 6647c64779e2SAndrii Nakryiko /* 6648c64779e2SAndrii Nakryiko * struct s { 6649c64779e2SAndrii Nakryiko * struct s *next; 6650c64779e2SAndrii Nakryiko * const int *a; 6651c64779e2SAndrii Nakryiko * int b[16]; 6652c64779e2SAndrii Nakryiko * int c; 6653c64779e2SAndrii Nakryiko * } 6654c64779e2SAndrii Nakryiko */ 6655c64779e2SAndrii Nakryiko .input = { 6656c64779e2SAndrii Nakryiko .raw_types = { 6657c64779e2SAndrii Nakryiko /* int */ 6658c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6659c64779e2SAndrii Nakryiko /* int[16] */ 6660c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */ 6661c64779e2SAndrii Nakryiko /* struct s { */ 66627999cf7dSIlya Leoshkevich BTF_STRUCT_ENC(NAME_NTH(2), 5, 88), /* [3] */ 6663c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(3), 4, 0), /* struct s *next; */ 6664c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(4), 5, 64), /* const int *a; */ 6665c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(5), 2, 128), /* int b[16]; */ 6666c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(6), 1, 640), /* int c; */ 6667ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(8), 15, 672), /* float d; */ 6668c64779e2SAndrii Nakryiko /* ptr -> [3] struct s */ 6669c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [4] */ 6670c64779e2SAndrii Nakryiko /* ptr -> [6] const int */ 6671c64779e2SAndrii Nakryiko BTF_PTR_ENC(6), /* [5] */ 6672c64779e2SAndrii Nakryiko /* const -> [1] int */ 6673c64779e2SAndrii Nakryiko BTF_CONST_ENC(1), /* [6] */ 6674ad526474SYonghong Song /* tag -> [3] struct s */ 6675223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1), /* [7] */ 6676ad526474SYonghong Song /* tag -> [3] struct s, member 1 */ 6677223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1), /* [8] */ 6678c64779e2SAndrii Nakryiko 6679c64779e2SAndrii Nakryiko /* full copy of the above */ 6680ad526474SYonghong Song BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [9] */ 6681ad526474SYonghong Song BTF_TYPE_ARRAY_ENC(9, 9, 16), /* [10] */ 6682ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(2), 5, 88), /* [11] */ 6683ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 12, 0), 6684ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(4), 13, 64), 6685ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(5), 10, 128), 6686ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(6), 9, 640), 6687ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(8), 15, 672), 6688ad526474SYonghong Song BTF_PTR_ENC(11), /* [12] */ 6689ad526474SYonghong Song BTF_PTR_ENC(14), /* [13] */ 6690ad526474SYonghong Song BTF_CONST_ENC(9), /* [14] */ 6691ad526474SYonghong Song BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4), /* [15] */ 6692223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 11, -1), /* [16] */ 6693223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 11, 1), /* [17] */ 6694c64779e2SAndrii Nakryiko BTF_END_RAW, 6695c64779e2SAndrii Nakryiko }, 66967999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0float\0d"), 6697c64779e2SAndrii Nakryiko }, 6698c64779e2SAndrii Nakryiko .expect = { 6699c64779e2SAndrii Nakryiko .raw_types = { 6700c64779e2SAndrii Nakryiko /* int */ 67017999cf7dSIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6702c64779e2SAndrii Nakryiko /* int[16] */ 6703c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */ 6704c64779e2SAndrii Nakryiko /* struct s { */ 67057999cf7dSIlya Leoshkevich BTF_STRUCT_ENC(NAME_NTH(8), 5, 88), /* [3] */ 67067999cf7dSIlya Leoshkevich BTF_MEMBER_ENC(NAME_NTH(7), 4, 0), /* struct s *next; */ 6707c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(1), 5, 64), /* const int *a; */ 6708c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 128), /* int b[16]; */ 6709c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(3), 1, 640), /* int c; */ 6710ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(4), 9, 672), /* float d; */ 6711c64779e2SAndrii Nakryiko /* ptr -> [3] struct s */ 6712c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [4] */ 6713c64779e2SAndrii Nakryiko /* ptr -> [6] const int */ 6714c64779e2SAndrii Nakryiko BTF_PTR_ENC(6), /* [5] */ 6715c64779e2SAndrii Nakryiko /* const -> [1] int */ 6716c64779e2SAndrii Nakryiko BTF_CONST_ENC(1), /* [6] */ 6717223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1), /* [7] */ 6718223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1), /* [8] */ 6719ad526474SYonghong Song BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4), /* [9] */ 6720c64779e2SAndrii Nakryiko BTF_END_RAW, 6721c64779e2SAndrii Nakryiko }, 67227999cf7dSIlya Leoshkevich BTF_STR_SEC("\0a\0b\0c\0d\0int\0float\0next\0s"), 6723c64779e2SAndrii Nakryiko }, 6724c64779e2SAndrii Nakryiko .opts = { 6725c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6726c64779e2SAndrii Nakryiko }, 6727c64779e2SAndrii Nakryiko }, 6728c64779e2SAndrii Nakryiko { 6729c64779e2SAndrii Nakryiko .descr = "dedup: struct <-> fwd resolution w/ hash collision", 6730c64779e2SAndrii Nakryiko /* 6731c64779e2SAndrii Nakryiko * // CU 1: 6732c64779e2SAndrii Nakryiko * struct x; 6733c64779e2SAndrii Nakryiko * struct s { 6734c64779e2SAndrii Nakryiko * struct x *x; 6735c64779e2SAndrii Nakryiko * }; 6736c64779e2SAndrii Nakryiko * // CU 2: 6737c64779e2SAndrii Nakryiko * struct x {}; 6738c64779e2SAndrii Nakryiko * struct s { 6739c64779e2SAndrii Nakryiko * struct x *x; 6740c64779e2SAndrii Nakryiko * }; 6741c64779e2SAndrii Nakryiko */ 6742c64779e2SAndrii Nakryiko .input = { 6743c64779e2SAndrii Nakryiko .raw_types = { 6744c64779e2SAndrii Nakryiko /* CU 1 */ 6745c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 0 /* struct fwd */), /* [1] fwd x */ 6746c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6747c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [3] struct s */ 6748c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 6749c64779e2SAndrii Nakryiko /* CU 2 */ 6750c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 0, 0), /* [4] struct x */ 6751c64779e2SAndrii Nakryiko BTF_PTR_ENC(4), /* [5] ptr -> [4] */ 6752c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [6] struct s */ 6753c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 5, 0), 6754c64779e2SAndrii Nakryiko BTF_END_RAW, 6755c64779e2SAndrii Nakryiko }, 6756c64779e2SAndrii Nakryiko BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"), 6757c64779e2SAndrii Nakryiko }, 6758c64779e2SAndrii Nakryiko .expect = { 6759c64779e2SAndrii Nakryiko .raw_types = { 6760c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [1] ptr -> [3] */ 6761c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [2] struct s */ 6762c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6763c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(2), 0, 0), /* [3] struct x */ 6764c64779e2SAndrii Nakryiko BTF_END_RAW, 6765c64779e2SAndrii Nakryiko }, 6766c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6767c64779e2SAndrii Nakryiko }, 6768c64779e2SAndrii Nakryiko .opts = { 6769c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6770c64779e2SAndrii Nakryiko .dedup_table_size = 1, /* force hash collisions */ 6771c64779e2SAndrii Nakryiko }, 6772c64779e2SAndrii Nakryiko }, 6773c64779e2SAndrii Nakryiko { 6774c64779e2SAndrii Nakryiko .descr = "dedup: void equiv check", 6775c64779e2SAndrii Nakryiko /* 6776c64779e2SAndrii Nakryiko * // CU 1: 6777c64779e2SAndrii Nakryiko * struct s { 6778c64779e2SAndrii Nakryiko * struct {} *x; 6779c64779e2SAndrii Nakryiko * }; 6780c64779e2SAndrii Nakryiko * // CU 2: 6781c64779e2SAndrii Nakryiko * struct s { 6782c64779e2SAndrii Nakryiko * int *x; 6783c64779e2SAndrii Nakryiko * }; 6784c64779e2SAndrii Nakryiko */ 6785c64779e2SAndrii Nakryiko .input = { 6786c64779e2SAndrii Nakryiko .raw_types = { 6787c64779e2SAndrii Nakryiko /* CU 1 */ 6788c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */ 6789c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6790c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */ 6791c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 6792c64779e2SAndrii Nakryiko /* CU 2 */ 6793c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [4] ptr -> void */ 6794c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */ 6795c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), 6796c64779e2SAndrii Nakryiko BTF_END_RAW, 6797c64779e2SAndrii Nakryiko }, 6798c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6799c64779e2SAndrii Nakryiko }, 6800c64779e2SAndrii Nakryiko .expect = { 6801c64779e2SAndrii Nakryiko .raw_types = { 6802c64779e2SAndrii Nakryiko /* CU 1 */ 6803c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */ 6804c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6805c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */ 6806c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 6807c64779e2SAndrii Nakryiko /* CU 2 */ 6808c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [4] ptr -> void */ 6809c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */ 6810c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), 6811c64779e2SAndrii Nakryiko BTF_END_RAW, 6812c64779e2SAndrii Nakryiko }, 6813c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6814c64779e2SAndrii Nakryiko }, 6815c64779e2SAndrii Nakryiko .opts = { 6816c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6817c64779e2SAndrii Nakryiko .dedup_table_size = 1, /* force hash collisions */ 6818c64779e2SAndrii Nakryiko }, 6819c64779e2SAndrii Nakryiko }, 6820c64779e2SAndrii Nakryiko { 6821c64779e2SAndrii Nakryiko .descr = "dedup: all possible kinds (no duplicates)", 6822c64779e2SAndrii Nakryiko .input = { 6823c64779e2SAndrii Nakryiko .raw_types = { 6824c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */ 6825c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */ 6826c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 6827c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 6828c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */ 6829c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */ 6830c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */ 6831c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6832c64779e2SAndrii Nakryiko BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */ 6833c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6834c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */ 6835c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [8] ptr */ 6836c64779e2SAndrii Nakryiko BTF_CONST_ENC(8), /* [9] const */ 6837c64779e2SAndrii Nakryiko BTF_VOLATILE_ENC(8), /* [10] volatile */ 6838c64779e2SAndrii Nakryiko BTF_RESTRICT_ENC(8), /* [11] restrict */ 6839c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */ 6840c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6841c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8), 6842c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */ 68437999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [14] float */ 6844223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, -1), /* [15] tag */ 6845223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] tag */ 6846c64779e2SAndrii Nakryiko BTF_END_RAW, 6847c64779e2SAndrii Nakryiko }, 6848ad526474SYonghong Song BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"), 6849c64779e2SAndrii Nakryiko }, 6850c64779e2SAndrii Nakryiko .expect = { 6851c64779e2SAndrii Nakryiko .raw_types = { 6852c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */ 6853c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */ 6854c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 6855c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 6856c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */ 6857c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */ 6858c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */ 6859c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6860c64779e2SAndrii Nakryiko BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */ 6861c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6862c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */ 6863c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [8] ptr */ 6864c64779e2SAndrii Nakryiko BTF_CONST_ENC(8), /* [9] const */ 6865c64779e2SAndrii Nakryiko BTF_VOLATILE_ENC(8), /* [10] volatile */ 6866c64779e2SAndrii Nakryiko BTF_RESTRICT_ENC(8), /* [11] restrict */ 6867c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */ 6868c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6869c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8), 6870c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */ 68717999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [14] float */ 6872223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, -1), /* [15] tag */ 6873223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] tag */ 6874c64779e2SAndrii Nakryiko BTF_END_RAW, 6875c64779e2SAndrii Nakryiko }, 6876ad526474SYonghong Song BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"), 6877c64779e2SAndrii Nakryiko }, 6878c64779e2SAndrii Nakryiko .opts = { 6879c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6880c64779e2SAndrii Nakryiko }, 6881c64779e2SAndrii Nakryiko }, 6882c64779e2SAndrii Nakryiko { 68837999cf7dSIlya Leoshkevich .descr = "dedup: no int/float duplicates", 6884c64779e2SAndrii Nakryiko .input = { 6885c64779e2SAndrii Nakryiko .raw_types = { 6886c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8), 6887c64779e2SAndrii Nakryiko /* different name */ 6888c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8), 6889c64779e2SAndrii Nakryiko /* different encoding */ 6890c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8), 6891c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8), 6892c64779e2SAndrii Nakryiko /* different bit offset */ 6893c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8), 6894c64779e2SAndrii Nakryiko /* different bit size */ 6895c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8), 6896c64779e2SAndrii Nakryiko /* different byte size */ 6897c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 68987999cf7dSIlya Leoshkevich /* all allowed sizes */ 68997999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2), 69007999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4), 69017999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8), 69027999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12), 69037999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16), 6904c64779e2SAndrii Nakryiko BTF_END_RAW, 6905c64779e2SAndrii Nakryiko }, 69067999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0some other int\0float"), 6907c64779e2SAndrii Nakryiko }, 6908c64779e2SAndrii Nakryiko .expect = { 6909c64779e2SAndrii Nakryiko .raw_types = { 6910c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8), 6911c64779e2SAndrii Nakryiko /* different name */ 6912c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8), 6913c64779e2SAndrii Nakryiko /* different encoding */ 6914c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8), 6915c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8), 6916c64779e2SAndrii Nakryiko /* different bit offset */ 6917c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8), 6918c64779e2SAndrii Nakryiko /* different bit size */ 6919c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8), 6920c64779e2SAndrii Nakryiko /* different byte size */ 6921c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 69227999cf7dSIlya Leoshkevich /* all allowed sizes */ 69237999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2), 69247999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4), 69257999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8), 69267999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12), 69277999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16), 6928c64779e2SAndrii Nakryiko BTF_END_RAW, 6929c64779e2SAndrii Nakryiko }, 69307999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0some other int\0float"), 6931c64779e2SAndrii Nakryiko }, 6932c64779e2SAndrii Nakryiko .opts = { 6933c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6934c64779e2SAndrii Nakryiko }, 6935c64779e2SAndrii Nakryiko }, 6936c64779e2SAndrii Nakryiko { 6937c64779e2SAndrii Nakryiko .descr = "dedup: enum fwd resolution", 6938c64779e2SAndrii Nakryiko .input = { 6939c64779e2SAndrii Nakryiko .raw_types = { 6940c64779e2SAndrii Nakryiko /* [1] fwd enum 'e1' before full enum */ 6941c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 6942c64779e2SAndrii Nakryiko /* [2] full enum 'e1' after fwd */ 6943c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6944c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 123), 6945c64779e2SAndrii Nakryiko /* [3] full enum 'e2' before fwd */ 6946c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6947c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(4), 456), 6948c64779e2SAndrii Nakryiko /* [4] fwd enum 'e2' after full enum */ 6949c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 6950c64779e2SAndrii Nakryiko /* [5] incompatible fwd enum with different size */ 6951c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), 6952c64779e2SAndrii Nakryiko /* [6] incompatible full enum with different value */ 6953c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6954c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 321), 6955c64779e2SAndrii Nakryiko BTF_END_RAW, 6956c64779e2SAndrii Nakryiko }, 6957c64779e2SAndrii Nakryiko BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 6958c64779e2SAndrii Nakryiko }, 6959c64779e2SAndrii Nakryiko .expect = { 6960c64779e2SAndrii Nakryiko .raw_types = { 6961c64779e2SAndrii Nakryiko /* [1] full enum 'e1' */ 6962c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6963c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 123), 6964c64779e2SAndrii Nakryiko /* [2] full enum 'e2' */ 6965c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6966c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(4), 456), 6967c64779e2SAndrii Nakryiko /* [3] incompatible fwd enum with different size */ 6968c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), 6969c64779e2SAndrii Nakryiko /* [4] incompatible full enum with different value */ 6970c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 6971c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 321), 6972c64779e2SAndrii Nakryiko BTF_END_RAW, 6973c64779e2SAndrii Nakryiko }, 6974c64779e2SAndrii Nakryiko BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 6975c64779e2SAndrii Nakryiko }, 6976c64779e2SAndrii Nakryiko .opts = { 6977c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 6978c64779e2SAndrii Nakryiko }, 6979c64779e2SAndrii Nakryiko }, 6980c64779e2SAndrii Nakryiko { 6981c64779e2SAndrii Nakryiko .descr = "dedup: datasec and vars pass-through", 6982c64779e2SAndrii Nakryiko .input = { 6983c64779e2SAndrii Nakryiko .raw_types = { 6984c64779e2SAndrii Nakryiko /* int */ 6985c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6986c64779e2SAndrii Nakryiko /* static int t */ 6987c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */ 6988c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 6989c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 6990c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 6991c64779e2SAndrii Nakryiko /* int, referenced from [5] */ 6992c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [4] */ 6993c64779e2SAndrii Nakryiko /* another static int t */ 6994c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 4, 0), /* [5] */ 6995c64779e2SAndrii Nakryiko /* another .bss section */ /* [6] */ 6996c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 6997c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(5, 0, 4), 6998c64779e2SAndrii Nakryiko BTF_END_RAW, 6999c64779e2SAndrii Nakryiko }, 7000c64779e2SAndrii Nakryiko BTF_STR_SEC("\0.bss\0t"), 7001c64779e2SAndrii Nakryiko }, 7002c64779e2SAndrii Nakryiko .expect = { 7003c64779e2SAndrii Nakryiko .raw_types = { 7004c64779e2SAndrii Nakryiko /* int */ 7005c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7006c64779e2SAndrii Nakryiko /* static int t */ 7007c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */ 7008c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 7009c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7010c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 7011c64779e2SAndrii Nakryiko /* another static int t */ 7012c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [4] */ 7013c64779e2SAndrii Nakryiko /* another .bss section */ /* [5] */ 7014c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7015c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(4, 0, 4), 7016c64779e2SAndrii Nakryiko BTF_END_RAW, 7017c64779e2SAndrii Nakryiko }, 7018c64779e2SAndrii Nakryiko BTF_STR_SEC("\0.bss\0t"), 7019c64779e2SAndrii Nakryiko }, 7020c64779e2SAndrii Nakryiko .opts = { 7021c64779e2SAndrii Nakryiko .dont_resolve_fwds = false, 7022c64779e2SAndrii Nakryiko .dedup_table_size = 1 7023c64779e2SAndrii Nakryiko }, 7024c64779e2SAndrii Nakryiko }, 7025ad526474SYonghong Song { 7026ad526474SYonghong Song .descr = "dedup: func/func_arg/var tags", 7027ad526474SYonghong Song .input = { 7028ad526474SYonghong Song .raw_types = { 7029ad526474SYonghong Song /* int */ 7030ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7031ad526474SYonghong Song /* static int t */ 7032ad526474SYonghong Song BTF_VAR_ENC(NAME_NTH(1), 1, 0), /* [2] */ 7033ad526474SYonghong Song /* void f(int a1, int a2) */ 7034ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 7035ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7036ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1), 7037ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(4), 2), /* [4] */ 7038ad526474SYonghong Song /* tag -> t */ 7039223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7040223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [6] */ 7041ad526474SYonghong Song /* tag -> func */ 7042223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [7] */ 7043223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [8] */ 7044ad526474SYonghong Song /* tag -> func arg a1 */ 7045223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [9] */ 7046223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [10] */ 7047ad526474SYonghong Song BTF_END_RAW, 7048ad526474SYonghong Song }, 7049ad526474SYonghong Song BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), 7050ad526474SYonghong Song }, 7051ad526474SYonghong Song .expect = { 7052ad526474SYonghong Song .raw_types = { 7053ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7054ad526474SYonghong Song BTF_VAR_ENC(NAME_NTH(1), 1, 0), /* [2] */ 7055ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 7056ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7057ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1), 7058ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(4), 2), /* [4] */ 7059223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7060223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [6] */ 7061223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [7] */ 7062ad526474SYonghong Song BTF_END_RAW, 7063ad526474SYonghong Song }, 7064ad526474SYonghong Song BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), 7065ad526474SYonghong Song }, 7066ad526474SYonghong Song .opts = { 7067ad526474SYonghong Song .dont_resolve_fwds = false, 7068ad526474SYonghong Song }, 7069ad526474SYonghong Song }, 7070ad526474SYonghong Song { 7071ad526474SYonghong Song .descr = "dedup: func/func_param tags", 7072ad526474SYonghong Song .input = { 7073ad526474SYonghong Song .raw_types = { 7074ad526474SYonghong Song /* int */ 7075ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7076ad526474SYonghong Song /* void f(int a1, int a2) */ 7077ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 7078ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7079ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7080ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 2), /* [3] */ 7081ad526474SYonghong Song /* void f(int a1, int a2) */ 7082ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [4] */ 7083ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7084ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7085ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 4), /* [5] */ 7086ad526474SYonghong Song /* tag -> f: tag1, tag2 */ 7087223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [6] */ 7088223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1), /* [7] */ 7089ad526474SYonghong Song /* tag -> f/a2: tag1, tag2 */ 7090223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [8] */ 7091223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1), /* [9] */ 7092ad526474SYonghong Song /* tag -> f: tag1, tag3 */ 7093223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 5, -1), /* [10] */ 7094223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 5, -1), /* [11] */ 7095ad526474SYonghong Song /* tag -> f/a2: tag1, tag3 */ 7096223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 5, 1), /* [12] */ 7097223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 5, 1), /* [13] */ 7098ad526474SYonghong Song BTF_END_RAW, 7099ad526474SYonghong Song }, 7100ad526474SYonghong Song BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), 7101ad526474SYonghong Song }, 7102ad526474SYonghong Song .expect = { 7103ad526474SYonghong Song .raw_types = { 7104ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7105ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 7106ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7107ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7108ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 2), /* [3] */ 7109223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [4] */ 7110223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1), /* [5] */ 7111223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1), /* [6] */ 7112223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [7] */ 7113223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1), /* [8] */ 7114223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1), /* [9] */ 7115ad526474SYonghong Song BTF_END_RAW, 7116ad526474SYonghong Song }, 7117ad526474SYonghong Song BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), 7118ad526474SYonghong Song }, 7119ad526474SYonghong Song .opts = { 7120ad526474SYonghong Song .dont_resolve_fwds = false, 7121ad526474SYonghong Song }, 7122ad526474SYonghong Song }, 7123ad526474SYonghong Song { 7124ad526474SYonghong Song .descr = "dedup: struct/struct_member tags", 7125ad526474SYonghong Song .input = { 7126ad526474SYonghong Song .raw_types = { 7127ad526474SYonghong Song /* int */ 7128ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7129ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [2] */ 7130ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7131ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7132ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [3] */ 7133ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7134ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7135ad526474SYonghong Song /* tag -> t: tag1, tag2 */ 7136223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1), /* [4] */ 7137223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7138ad526474SYonghong Song /* tag -> t/m2: tag1, tag2 */ 7139223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1), /* [6] */ 7140223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1), /* [7] */ 7141ad526474SYonghong Song /* tag -> t: tag1, tag3 */ 7142223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [8] */ 7143223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1), /* [9] */ 7144ad526474SYonghong Song /* tag -> t/m2: tag1, tag3 */ 7145223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [10] */ 7146223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1), /* [11] */ 7147ad526474SYonghong Song BTF_END_RAW, 7148ad526474SYonghong Song }, 7149ad526474SYonghong Song BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), 7150ad526474SYonghong Song }, 7151ad526474SYonghong Song .expect = { 7152ad526474SYonghong Song .raw_types = { 7153ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7154ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [2] */ 7155ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7156ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7157223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1), /* [3] */ 7158223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [4] */ 7159223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 2, -1), /* [5] */ 7160223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1), /* [6] */ 7161223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1), /* [7] */ 7162223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 2, 1), /* [8] */ 7163ad526474SYonghong Song BTF_END_RAW, 7164ad526474SYonghong Song }, 7165ad526474SYonghong Song BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), 7166ad526474SYonghong Song }, 7167ad526474SYonghong Song .opts = { 7168ad526474SYonghong Song .dont_resolve_fwds = false, 7169ad526474SYonghong Song }, 7170ad526474SYonghong Song }, 7171c64779e2SAndrii Nakryiko 7172c64779e2SAndrii Nakryiko }; 7173c64779e2SAndrii Nakryiko 7174c64779e2SAndrii Nakryiko static int btf_type_size(const struct btf_type *t) 7175c64779e2SAndrii Nakryiko { 7176c64779e2SAndrii Nakryiko int base_size = sizeof(struct btf_type); 7177c64779e2SAndrii Nakryiko __u16 vlen = BTF_INFO_VLEN(t->info); 7178c64779e2SAndrii Nakryiko __u16 kind = BTF_INFO_KIND(t->info); 7179c64779e2SAndrii Nakryiko 7180c64779e2SAndrii Nakryiko switch (kind) { 7181c64779e2SAndrii Nakryiko case BTF_KIND_FWD: 7182c64779e2SAndrii Nakryiko case BTF_KIND_CONST: 7183c64779e2SAndrii Nakryiko case BTF_KIND_VOLATILE: 7184c64779e2SAndrii Nakryiko case BTF_KIND_RESTRICT: 7185c64779e2SAndrii Nakryiko case BTF_KIND_PTR: 7186c64779e2SAndrii Nakryiko case BTF_KIND_TYPEDEF: 7187c64779e2SAndrii Nakryiko case BTF_KIND_FUNC: 71887e72aad3SIlya Leoshkevich case BTF_KIND_FLOAT: 7189c64779e2SAndrii Nakryiko return base_size; 7190c64779e2SAndrii Nakryiko case BTF_KIND_INT: 7191c64779e2SAndrii Nakryiko return base_size + sizeof(__u32); 7192c64779e2SAndrii Nakryiko case BTF_KIND_ENUM: 7193c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_enum); 7194c64779e2SAndrii Nakryiko case BTF_KIND_ARRAY: 7195c64779e2SAndrii Nakryiko return base_size + sizeof(struct btf_array); 7196c64779e2SAndrii Nakryiko case BTF_KIND_STRUCT: 7197c64779e2SAndrii Nakryiko case BTF_KIND_UNION: 7198c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_member); 7199c64779e2SAndrii Nakryiko case BTF_KIND_FUNC_PROTO: 7200c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_param); 7201c64779e2SAndrii Nakryiko case BTF_KIND_VAR: 7202c64779e2SAndrii Nakryiko return base_size + sizeof(struct btf_var); 7203c64779e2SAndrii Nakryiko case BTF_KIND_DATASEC: 7204c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_var_secinfo); 7205223f903eSYonghong Song case BTF_KIND_DECL_TAG: 7206223f903eSYonghong Song return base_size + sizeof(struct btf_decl_tag); 7207c64779e2SAndrii Nakryiko default: 7208c64779e2SAndrii Nakryiko fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind); 7209c64779e2SAndrii Nakryiko return -EINVAL; 7210c64779e2SAndrii Nakryiko } 7211c64779e2SAndrii Nakryiko } 7212c64779e2SAndrii Nakryiko 7213c64779e2SAndrii Nakryiko static void dump_btf_strings(const char *strs, __u32 len) 7214c64779e2SAndrii Nakryiko { 7215c64779e2SAndrii Nakryiko const char *cur = strs; 7216c64779e2SAndrii Nakryiko int i = 0; 7217c64779e2SAndrii Nakryiko 7218c64779e2SAndrii Nakryiko while (cur < strs + len) { 7219c64779e2SAndrii Nakryiko fprintf(stderr, "string #%d: '%s'\n", i, cur); 7220c64779e2SAndrii Nakryiko cur += strlen(cur) + 1; 7221c64779e2SAndrii Nakryiko i++; 7222c64779e2SAndrii Nakryiko } 7223c64779e2SAndrii Nakryiko } 7224c64779e2SAndrii Nakryiko 7225c64779e2SAndrii Nakryiko static void do_test_dedup(unsigned int test_num) 7226c64779e2SAndrii Nakryiko { 7227c64779e2SAndrii Nakryiko const struct btf_dedup_test *test = &dedup_tests[test_num - 1]; 7228c64779e2SAndrii Nakryiko __u32 test_nr_types, expect_nr_types, test_btf_size, expect_btf_size; 7229c64779e2SAndrii Nakryiko const struct btf_header *test_hdr, *expect_hdr; 7230c64779e2SAndrii Nakryiko struct btf *test_btf = NULL, *expect_btf = NULL; 7231c64779e2SAndrii Nakryiko const void *test_btf_data, *expect_btf_data; 7232c64779e2SAndrii Nakryiko const char *ret_test_next_str, *ret_expect_next_str; 7233c64779e2SAndrii Nakryiko const char *test_strs, *expect_strs; 7234d9448f94SAndrii Nakryiko const char *test_str_cur; 7235c64779e2SAndrii Nakryiko const char *expect_str_cur, *expect_str_end; 7236c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 7237c64779e2SAndrii Nakryiko void *raw_btf; 7238c64779e2SAndrii Nakryiko int err = 0, i; 7239c64779e2SAndrii Nakryiko 7240c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 7241c64779e2SAndrii Nakryiko return; 7242c64779e2SAndrii Nakryiko 7243c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->input.raw_types, 7244c64779e2SAndrii Nakryiko test->input.str_sec, test->input.str_sec_size, 7245c64779e2SAndrii Nakryiko &raw_btf_size, &ret_test_next_str); 7246c64779e2SAndrii Nakryiko if (!raw_btf) 7247c64779e2SAndrii Nakryiko return; 7248c64779e2SAndrii Nakryiko 7249c64779e2SAndrii Nakryiko test_btf = btf__new((__u8 *)raw_btf, raw_btf_size); 7250bad2e478SAndrii Nakryiko err = libbpf_get_error(test_btf); 7251c64779e2SAndrii Nakryiko free(raw_btf); 7252bad2e478SAndrii Nakryiko if (CHECK(err, "invalid test_btf errno:%d", err)) { 7253c64779e2SAndrii Nakryiko err = -1; 7254c64779e2SAndrii Nakryiko goto done; 7255c64779e2SAndrii Nakryiko } 7256c64779e2SAndrii Nakryiko 7257c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->expect.raw_types, 7258c64779e2SAndrii Nakryiko test->expect.str_sec, 7259c64779e2SAndrii Nakryiko test->expect.str_sec_size, 7260c64779e2SAndrii Nakryiko &raw_btf_size, &ret_expect_next_str); 7261c64779e2SAndrii Nakryiko if (!raw_btf) 7262c64779e2SAndrii Nakryiko return; 7263c64779e2SAndrii Nakryiko expect_btf = btf__new((__u8 *)raw_btf, raw_btf_size); 7264bad2e478SAndrii Nakryiko err = libbpf_get_error(expect_btf); 7265c64779e2SAndrii Nakryiko free(raw_btf); 7266bad2e478SAndrii Nakryiko if (CHECK(err, "invalid expect_btf errno:%d", err)) { 7267c64779e2SAndrii Nakryiko err = -1; 7268c64779e2SAndrii Nakryiko goto done; 7269c64779e2SAndrii Nakryiko } 7270c64779e2SAndrii Nakryiko 7271c64779e2SAndrii Nakryiko err = btf__dedup(test_btf, NULL, &test->opts); 7272c64779e2SAndrii Nakryiko if (CHECK(err, "btf_dedup failed errno:%d", err)) { 7273c64779e2SAndrii Nakryiko err = -1; 7274c64779e2SAndrii Nakryiko goto done; 7275c64779e2SAndrii Nakryiko } 7276c64779e2SAndrii Nakryiko 7277*487ef148SHengqi Chen test_btf_data = btf__raw_data(test_btf, &test_btf_size); 7278*487ef148SHengqi Chen expect_btf_data = btf__raw_data(expect_btf, &expect_btf_size); 7279c64779e2SAndrii Nakryiko if (CHECK(test_btf_size != expect_btf_size, 7280c64779e2SAndrii Nakryiko "test_btf_size:%u != expect_btf_size:%u", 7281c64779e2SAndrii Nakryiko test_btf_size, expect_btf_size)) { 7282c64779e2SAndrii Nakryiko err = -1; 7283c64779e2SAndrii Nakryiko goto done; 7284c64779e2SAndrii Nakryiko } 7285c64779e2SAndrii Nakryiko 7286c64779e2SAndrii Nakryiko test_hdr = test_btf_data; 7287c64779e2SAndrii Nakryiko test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off; 7288c64779e2SAndrii Nakryiko expect_hdr = expect_btf_data; 7289c64779e2SAndrii Nakryiko expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off; 7290c64779e2SAndrii Nakryiko if (CHECK(test_hdr->str_len != expect_hdr->str_len, 7291c64779e2SAndrii Nakryiko "test_hdr->str_len:%u != expect_hdr->str_len:%u", 7292c64779e2SAndrii Nakryiko test_hdr->str_len, expect_hdr->str_len)) { 7293c64779e2SAndrii Nakryiko fprintf(stderr, "\ntest strings:\n"); 7294c64779e2SAndrii Nakryiko dump_btf_strings(test_strs, test_hdr->str_len); 7295c64779e2SAndrii Nakryiko fprintf(stderr, "\nexpected strings:\n"); 7296c64779e2SAndrii Nakryiko dump_btf_strings(expect_strs, expect_hdr->str_len); 7297c64779e2SAndrii Nakryiko err = -1; 7298c64779e2SAndrii Nakryiko goto done; 7299c64779e2SAndrii Nakryiko } 7300c64779e2SAndrii Nakryiko 7301c64779e2SAndrii Nakryiko expect_str_cur = expect_strs; 7302c64779e2SAndrii Nakryiko expect_str_end = expect_strs + expect_hdr->str_len; 7303d9448f94SAndrii Nakryiko while (expect_str_cur < expect_str_end) { 7304c64779e2SAndrii Nakryiko size_t test_len, expect_len; 7305d9448f94SAndrii Nakryiko int off; 7306d9448f94SAndrii Nakryiko 7307d9448f94SAndrii Nakryiko off = btf__find_str(test_btf, expect_str_cur); 7308d9448f94SAndrii Nakryiko if (CHECK(off < 0, "exp str '%s' not found: %d\n", expect_str_cur, off)) { 7309d9448f94SAndrii Nakryiko err = -1; 7310d9448f94SAndrii Nakryiko goto done; 7311d9448f94SAndrii Nakryiko } 7312d9448f94SAndrii Nakryiko test_str_cur = btf__str_by_offset(test_btf, off); 7313c64779e2SAndrii Nakryiko 7314c64779e2SAndrii Nakryiko test_len = strlen(test_str_cur); 7315c64779e2SAndrii Nakryiko expect_len = strlen(expect_str_cur); 7316c64779e2SAndrii Nakryiko if (CHECK(test_len != expect_len, 7317c64779e2SAndrii Nakryiko "test_len:%zu != expect_len:%zu " 7318c64779e2SAndrii Nakryiko "(test_str:%s, expect_str:%s)", 7319c64779e2SAndrii Nakryiko test_len, expect_len, test_str_cur, expect_str_cur)) { 7320c64779e2SAndrii Nakryiko err = -1; 7321c64779e2SAndrii Nakryiko goto done; 7322c64779e2SAndrii Nakryiko } 7323c64779e2SAndrii Nakryiko if (CHECK(strcmp(test_str_cur, expect_str_cur), 7324c64779e2SAndrii Nakryiko "test_str:%s != expect_str:%s", 7325c64779e2SAndrii Nakryiko test_str_cur, expect_str_cur)) { 7326c64779e2SAndrii Nakryiko err = -1; 7327c64779e2SAndrii Nakryiko goto done; 7328c64779e2SAndrii Nakryiko } 7329c64779e2SAndrii Nakryiko expect_str_cur += expect_len + 1; 7330c64779e2SAndrii Nakryiko } 7331c64779e2SAndrii Nakryiko 7332*487ef148SHengqi Chen test_nr_types = btf__type_cnt(test_btf); 7333*487ef148SHengqi Chen expect_nr_types = btf__type_cnt(expect_btf); 7334c64779e2SAndrii Nakryiko if (CHECK(test_nr_types != expect_nr_types, 7335c64779e2SAndrii Nakryiko "test_nr_types:%u != expect_nr_types:%u", 7336c64779e2SAndrii Nakryiko test_nr_types, expect_nr_types)) { 7337c64779e2SAndrii Nakryiko err = -1; 7338c64779e2SAndrii Nakryiko goto done; 7339c64779e2SAndrii Nakryiko } 7340c64779e2SAndrii Nakryiko 7341*487ef148SHengqi Chen for (i = 1; i < test_nr_types; i++) { 7342c64779e2SAndrii Nakryiko const struct btf_type *test_type, *expect_type; 7343c64779e2SAndrii Nakryiko int test_size, expect_size; 7344c64779e2SAndrii Nakryiko 7345c64779e2SAndrii Nakryiko test_type = btf__type_by_id(test_btf, i); 7346c64779e2SAndrii Nakryiko expect_type = btf__type_by_id(expect_btf, i); 7347c64779e2SAndrii Nakryiko test_size = btf_type_size(test_type); 7348c64779e2SAndrii Nakryiko expect_size = btf_type_size(expect_type); 7349c64779e2SAndrii Nakryiko 7350c64779e2SAndrii Nakryiko if (CHECK(test_size != expect_size, 7351c64779e2SAndrii Nakryiko "type #%d: test_size:%d != expect_size:%u", 7352c64779e2SAndrii Nakryiko i, test_size, expect_size)) { 7353c64779e2SAndrii Nakryiko err = -1; 7354c64779e2SAndrii Nakryiko goto done; 7355c64779e2SAndrii Nakryiko } 7356d9448f94SAndrii Nakryiko if (CHECK(btf_kind(test_type) != btf_kind(expect_type), 7357d9448f94SAndrii Nakryiko "type %d kind: exp %d != got %u\n", 7358d9448f94SAndrii Nakryiko i, btf_kind(expect_type), btf_kind(test_type))) { 7359d9448f94SAndrii Nakryiko err = -1; 7360d9448f94SAndrii Nakryiko goto done; 7361d9448f94SAndrii Nakryiko } 7362d9448f94SAndrii Nakryiko if (CHECK(test_type->info != expect_type->info, 7363d9448f94SAndrii Nakryiko "type %d info: exp %d != got %u\n", 7364d9448f94SAndrii Nakryiko i, expect_type->info, test_type->info)) { 7365d9448f94SAndrii Nakryiko err = -1; 7366d9448f94SAndrii Nakryiko goto done; 7367d9448f94SAndrii Nakryiko } 7368d9448f94SAndrii Nakryiko if (CHECK(test_type->size != expect_type->size, 7369d9448f94SAndrii Nakryiko "type %d size/type: exp %d != got %u\n", 7370d9448f94SAndrii Nakryiko i, expect_type->size, test_type->size)) { 7371c64779e2SAndrii Nakryiko err = -1; 7372c64779e2SAndrii Nakryiko goto done; 7373c64779e2SAndrii Nakryiko } 7374c64779e2SAndrii Nakryiko } 7375c64779e2SAndrii Nakryiko 7376c64779e2SAndrii Nakryiko done: 7377c64779e2SAndrii Nakryiko btf__free(test_btf); 7378c64779e2SAndrii Nakryiko btf__free(expect_btf); 7379c64779e2SAndrii Nakryiko } 7380c64779e2SAndrii Nakryiko 7381c64779e2SAndrii Nakryiko void test_btf(void) 7382c64779e2SAndrii Nakryiko { 7383c64779e2SAndrii Nakryiko int i; 7384c64779e2SAndrii Nakryiko 7385c64779e2SAndrii Nakryiko always_log = env.verbosity > VERBOSE_NONE; 7386c64779e2SAndrii Nakryiko 7387c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(raw_tests); i++) 7388c64779e2SAndrii Nakryiko do_test_raw(i); 7389c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(get_info_tests); i++) 7390c64779e2SAndrii Nakryiko do_test_get_info(i); 7391c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(file_tests); i++) 7392c64779e2SAndrii Nakryiko do_test_file(i); 7393c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(info_raw_tests); i++) 7394c64779e2SAndrii Nakryiko do_test_info_raw(i); 7395c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(dedup_tests); i++) 7396c64779e2SAndrii Nakryiko do_test_dedup(i); 7397c64779e2SAndrii Nakryiko test_pprint(); 7398c64779e2SAndrii Nakryiko } 7399