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 <libelf.h> 12c64779e2SAndrii Nakryiko #include <gelf.h> 13c64779e2SAndrii Nakryiko #include <string.h> 14c64779e2SAndrii Nakryiko #include <stdlib.h> 15c64779e2SAndrii Nakryiko #include <stdio.h> 16c64779e2SAndrii Nakryiko #include <stdarg.h> 17c64779e2SAndrii Nakryiko #include <unistd.h> 18c64779e2SAndrii Nakryiko #include <fcntl.h> 19c64779e2SAndrii Nakryiko #include <errno.h> 20c64779e2SAndrii Nakryiko #include <assert.h> 21c64779e2SAndrii Nakryiko #include <bpf/libbpf.h> 22c64779e2SAndrii Nakryiko #include <bpf/btf.h> 23c64779e2SAndrii Nakryiko 24c64779e2SAndrii Nakryiko #include "bpf_util.h" 25c64779e2SAndrii Nakryiko #include "../test_btf.h" 26c64779e2SAndrii Nakryiko #include "test_progs.h" 27c64779e2SAndrii Nakryiko 28c64779e2SAndrii Nakryiko #define MAX_INSNS 512 29c64779e2SAndrii Nakryiko #define MAX_SUBPROGS 16 30c64779e2SAndrii Nakryiko 31c64779e2SAndrii Nakryiko static int duration = 0; 32c64779e2SAndrii Nakryiko static bool always_log; 33c64779e2SAndrii Nakryiko 34c64779e2SAndrii Nakryiko #undef CHECK 35c64779e2SAndrii Nakryiko #define CHECK(condition, format...) _CHECK(condition, "check", duration, format) 36c64779e2SAndrii Nakryiko 37c64779e2SAndrii Nakryiko #define NAME_TBD 0xdeadb33f 38c64779e2SAndrii Nakryiko 393df3bd68SYonghong Song #define NAME_NTH(N) (0xfffe0000 | N) 403df3bd68SYonghong Song #define IS_NAME_NTH(X) ((X & 0xffff0000) == 0xfffe0000) 41c64779e2SAndrii Nakryiko #define GET_NAME_NTH_IDX(X) (X & 0x0000ffff) 42c64779e2SAndrii Nakryiko 43c64779e2SAndrii Nakryiko #define MAX_NR_RAW_U32 1024 44c64779e2SAndrii Nakryiko #define BTF_LOG_BUF_SIZE 65535 45c64779e2SAndrii Nakryiko 46c64779e2SAndrii Nakryiko static char btf_log_buf[BTF_LOG_BUF_SIZE]; 47c64779e2SAndrii Nakryiko 48c64779e2SAndrii Nakryiko static struct btf_header hdr_tmpl = { 49c64779e2SAndrii Nakryiko .magic = BTF_MAGIC, 50c64779e2SAndrii Nakryiko .version = BTF_VERSION, 51c64779e2SAndrii Nakryiko .hdr_len = sizeof(struct btf_header), 52c64779e2SAndrii Nakryiko }; 53c64779e2SAndrii Nakryiko 54c64779e2SAndrii Nakryiko /* several different mapv kinds(types) supported by pprint */ 55c64779e2SAndrii Nakryiko enum pprint_mapv_kind_t { 56c64779e2SAndrii Nakryiko PPRINT_MAPV_KIND_BASIC = 0, 57c64779e2SAndrii Nakryiko PPRINT_MAPV_KIND_INT128, 58c64779e2SAndrii Nakryiko }; 59c64779e2SAndrii Nakryiko 60c64779e2SAndrii Nakryiko struct btf_raw_test { 61c64779e2SAndrii Nakryiko const char *descr; 62c64779e2SAndrii Nakryiko const char *str_sec; 63c64779e2SAndrii Nakryiko const char *map_name; 64c64779e2SAndrii Nakryiko const char *err_str; 65c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 66c64779e2SAndrii Nakryiko __u32 str_sec_size; 67c64779e2SAndrii Nakryiko enum bpf_map_type map_type; 68c64779e2SAndrii Nakryiko __u32 key_size; 69c64779e2SAndrii Nakryiko __u32 value_size; 70c64779e2SAndrii Nakryiko __u32 key_type_id; 71c64779e2SAndrii Nakryiko __u32 value_type_id; 72c64779e2SAndrii Nakryiko __u32 max_entries; 73c64779e2SAndrii Nakryiko bool btf_load_err; 74c64779e2SAndrii Nakryiko bool map_create_err; 75c64779e2SAndrii Nakryiko bool ordered_map; 76c64779e2SAndrii Nakryiko bool lossless_map; 77c64779e2SAndrii Nakryiko bool percpu_map; 78c64779e2SAndrii Nakryiko int hdr_len_delta; 79c64779e2SAndrii Nakryiko int type_off_delta; 80c64779e2SAndrii Nakryiko int str_off_delta; 81c64779e2SAndrii Nakryiko int str_len_delta; 82c64779e2SAndrii Nakryiko enum pprint_mapv_kind_t mapv_kind; 83c64779e2SAndrii Nakryiko }; 84c64779e2SAndrii Nakryiko 85c64779e2SAndrii Nakryiko #define BTF_STR_SEC(str) \ 86c64779e2SAndrii Nakryiko .str_sec = str, .str_sec_size = sizeof(str) 87c64779e2SAndrii Nakryiko 88c64779e2SAndrii Nakryiko static struct btf_raw_test raw_tests[] = { 89c64779e2SAndrii Nakryiko /* enum E { 90c64779e2SAndrii Nakryiko * E0, 91c64779e2SAndrii Nakryiko * E1, 92c64779e2SAndrii Nakryiko * }; 93c64779e2SAndrii Nakryiko * 94c64779e2SAndrii Nakryiko * struct A { 95c64779e2SAndrii Nakryiko * unsigned long long m; 96c64779e2SAndrii Nakryiko * int n; 97c64779e2SAndrii Nakryiko * char o; 98c64779e2SAndrii Nakryiko * [3 bytes hole] 99c64779e2SAndrii Nakryiko * int p[8]; 100c64779e2SAndrii Nakryiko * int q[4][8]; 101c64779e2SAndrii Nakryiko * enum E r; 102c64779e2SAndrii Nakryiko * }; 103c64779e2SAndrii Nakryiko */ 104c64779e2SAndrii Nakryiko { 105c64779e2SAndrii Nakryiko .descr = "struct test #1", 106c64779e2SAndrii Nakryiko .raw_types = { 107c64779e2SAndrii Nakryiko /* int */ 108c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 109c64779e2SAndrii Nakryiko /* unsigned long long */ 110c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 111c64779e2SAndrii Nakryiko /* char */ 112c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 113c64779e2SAndrii Nakryiko /* int[8] */ 114c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 115c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 116c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 6), 180), 117c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 118c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 119c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 120c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 121c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 384),/* int q[4][8] */ 122c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, 1408), /* enum E r */ 123c64779e2SAndrii Nakryiko /* } */ 124c64779e2SAndrii Nakryiko /* int[4][8] */ 125c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [6] */ 126c64779e2SAndrii Nakryiko /* enum E */ /* [7] */ 127c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)), 128c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 129c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 130c64779e2SAndrii Nakryiko BTF_END_RAW, 131c64779e2SAndrii Nakryiko }, 132c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1", 133c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1"), 134c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 135c64779e2SAndrii Nakryiko .map_name = "struct_test1_map", 136c64779e2SAndrii Nakryiko .key_size = sizeof(int), 137c64779e2SAndrii Nakryiko .value_size = 180, 138c64779e2SAndrii Nakryiko .key_type_id = 1, 139c64779e2SAndrii Nakryiko .value_type_id = 5, 140c64779e2SAndrii Nakryiko .max_entries = 4, 141c64779e2SAndrii Nakryiko }, 142c64779e2SAndrii Nakryiko 143c64779e2SAndrii Nakryiko /* typedef struct b Struct_B; 144c64779e2SAndrii Nakryiko * 145c64779e2SAndrii Nakryiko * struct A { 146c64779e2SAndrii Nakryiko * int m; 147c64779e2SAndrii Nakryiko * struct b n[4]; 148c64779e2SAndrii Nakryiko * const Struct_B o[4]; 149c64779e2SAndrii Nakryiko * }; 150c64779e2SAndrii Nakryiko * 151c64779e2SAndrii Nakryiko * struct B { 152c64779e2SAndrii Nakryiko * int m; 153c64779e2SAndrii Nakryiko * int n; 154c64779e2SAndrii Nakryiko * }; 155c64779e2SAndrii Nakryiko */ 156c64779e2SAndrii Nakryiko { 157c64779e2SAndrii Nakryiko .descr = "struct test #2", 158c64779e2SAndrii Nakryiko .raw_types = { 159c64779e2SAndrii Nakryiko /* int */ /* [1] */ 160c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 161c64779e2SAndrii Nakryiko /* struct b [4] */ /* [2] */ 162c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(4, 1, 4), 163c64779e2SAndrii Nakryiko 164c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 165c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 3), 68), 166c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 167c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct B n[4] */ 168c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 288),/* const Struct_B o[4];*/ 169c64779e2SAndrii Nakryiko /* } */ 170c64779e2SAndrii Nakryiko 171c64779e2SAndrii Nakryiko /* struct B { */ /* [4] */ 172c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), 173c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 174c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */ 175c64779e2SAndrii Nakryiko /* } */ 176c64779e2SAndrii Nakryiko 177c64779e2SAndrii Nakryiko /* const int */ /* [5] */ 178c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1), 179c64779e2SAndrii Nakryiko /* typedef struct b Struct_B */ /* [6] */ 180c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 4), 181c64779e2SAndrii Nakryiko /* const Struct_B */ /* [7] */ 182c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 6), 183c64779e2SAndrii Nakryiko /* const Struct_B [4] */ /* [8] */ 184c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(7, 1, 4), 185c64779e2SAndrii Nakryiko BTF_END_RAW, 186c64779e2SAndrii Nakryiko }, 187c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0B\0m\0n\0Struct_B", 188c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0B\0m\0n\0Struct_B"), 189c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 190c64779e2SAndrii Nakryiko .map_name = "struct_test2_map", 191c64779e2SAndrii Nakryiko .key_size = sizeof(int), 192c64779e2SAndrii Nakryiko .value_size = 68, 193c64779e2SAndrii Nakryiko .key_type_id = 1, 194c64779e2SAndrii Nakryiko .value_type_id = 3, 195c64779e2SAndrii Nakryiko .max_entries = 4, 196c64779e2SAndrii Nakryiko }, 197c64779e2SAndrii Nakryiko { 198c64779e2SAndrii Nakryiko .descr = "struct test #3 Invalid member offset", 199c64779e2SAndrii Nakryiko .raw_types = { 200c64779e2SAndrii Nakryiko /* int */ /* [1] */ 201c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 202c64779e2SAndrii Nakryiko /* int64 */ /* [2] */ 203c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8), 204c64779e2SAndrii Nakryiko 205c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 206c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 16), 207c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64), /* int m; */ 208c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* int64 n; */ 209c64779e2SAndrii Nakryiko /* } */ 210c64779e2SAndrii Nakryiko BTF_END_RAW, 211c64779e2SAndrii Nakryiko }, 212c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0", 213c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0"), 214c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 215c64779e2SAndrii Nakryiko .map_name = "struct_test3_map", 216c64779e2SAndrii Nakryiko .key_size = sizeof(int), 217c64779e2SAndrii Nakryiko .value_size = 16, 218c64779e2SAndrii Nakryiko .key_type_id = 1, 219c64779e2SAndrii Nakryiko .value_type_id = 3, 220c64779e2SAndrii Nakryiko .max_entries = 4, 221c64779e2SAndrii Nakryiko .btf_load_err = true, 222c64779e2SAndrii Nakryiko .err_str = "Invalid member bits_offset", 223c64779e2SAndrii Nakryiko }, 224c64779e2SAndrii Nakryiko /* 225c64779e2SAndrii Nakryiko * struct A { 226c64779e2SAndrii Nakryiko * unsigned long long m; 227c64779e2SAndrii Nakryiko * int n; 228c64779e2SAndrii Nakryiko * char o; 229c64779e2SAndrii Nakryiko * [3 bytes hole] 230c64779e2SAndrii Nakryiko * int p[8]; 231c64779e2SAndrii Nakryiko * }; 232c64779e2SAndrii Nakryiko */ 233c64779e2SAndrii Nakryiko { 234c64779e2SAndrii Nakryiko .descr = "global data test #1", 235c64779e2SAndrii Nakryiko .raw_types = { 236c64779e2SAndrii Nakryiko /* int */ 237c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 238c64779e2SAndrii Nakryiko /* unsigned long long */ 239c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 240c64779e2SAndrii Nakryiko /* char */ 241c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 242c64779e2SAndrii Nakryiko /* int[8] */ 243c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 244c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 245c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 246c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 247c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 248c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 249c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 250c64779e2SAndrii Nakryiko /* } */ 251c64779e2SAndrii Nakryiko BTF_END_RAW, 252c64779e2SAndrii Nakryiko }, 253c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p", 254c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p"), 255c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 256c64779e2SAndrii Nakryiko .map_name = "struct_test1_map", 257c64779e2SAndrii Nakryiko .key_size = sizeof(int), 258c64779e2SAndrii Nakryiko .value_size = 48, 259c64779e2SAndrii Nakryiko .key_type_id = 1, 260c64779e2SAndrii Nakryiko .value_type_id = 5, 261c64779e2SAndrii Nakryiko .max_entries = 4, 262c64779e2SAndrii Nakryiko }, 263c64779e2SAndrii Nakryiko /* 264c64779e2SAndrii Nakryiko * struct A { 265c64779e2SAndrii Nakryiko * unsigned long long m; 266c64779e2SAndrii Nakryiko * int n; 267c64779e2SAndrii Nakryiko * char o; 268c64779e2SAndrii Nakryiko * [3 bytes hole] 269c64779e2SAndrii Nakryiko * int p[8]; 270c64779e2SAndrii Nakryiko * }; 271c64779e2SAndrii Nakryiko * static struct A t; <- in .bss 272c64779e2SAndrii Nakryiko */ 273c64779e2SAndrii Nakryiko { 274c64779e2SAndrii Nakryiko .descr = "global data test #2", 275c64779e2SAndrii Nakryiko .raw_types = { 276c64779e2SAndrii Nakryiko /* int */ 277c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 278c64779e2SAndrii Nakryiko /* unsigned long long */ 279c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 280c64779e2SAndrii Nakryiko /* char */ 281c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 282c64779e2SAndrii Nakryiko /* int[8] */ 283c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 284c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 285c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 286c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 287c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 288c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 289c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 290c64779e2SAndrii Nakryiko /* } */ 291c64779e2SAndrii Nakryiko /* static struct A t */ 292c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 293c64779e2SAndrii Nakryiko /* .bss section */ /* [7] */ 294c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48), 295c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 0, 48), 296c64779e2SAndrii Nakryiko BTF_END_RAW, 297c64779e2SAndrii Nakryiko }, 298c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss", 299c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"), 300c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 301c64779e2SAndrii Nakryiko .map_name = ".bss", 302c64779e2SAndrii Nakryiko .key_size = sizeof(int), 303c64779e2SAndrii Nakryiko .value_size = 48, 304c64779e2SAndrii Nakryiko .key_type_id = 0, 305c64779e2SAndrii Nakryiko .value_type_id = 7, 306c64779e2SAndrii Nakryiko .max_entries = 1, 307c64779e2SAndrii Nakryiko }, 308c64779e2SAndrii Nakryiko { 309c64779e2SAndrii Nakryiko .descr = "global data test #3", 310c64779e2SAndrii Nakryiko .raw_types = { 311c64779e2SAndrii Nakryiko /* int */ 312c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 313c64779e2SAndrii Nakryiko /* static int t */ 314c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 315c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 316c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 317c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 318c64779e2SAndrii Nakryiko BTF_END_RAW, 319c64779e2SAndrii Nakryiko }, 320c64779e2SAndrii Nakryiko .str_sec = "\0t\0.bss", 321c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0t\0.bss"), 322c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 323c64779e2SAndrii Nakryiko .map_name = ".bss", 324c64779e2SAndrii Nakryiko .key_size = sizeof(int), 325c64779e2SAndrii Nakryiko .value_size = 4, 326c64779e2SAndrii Nakryiko .key_type_id = 0, 327c64779e2SAndrii Nakryiko .value_type_id = 3, 328c64779e2SAndrii Nakryiko .max_entries = 1, 329c64779e2SAndrii Nakryiko }, 330c64779e2SAndrii Nakryiko { 331c64779e2SAndrii Nakryiko .descr = "global data test #4, unsupported linkage", 332c64779e2SAndrii Nakryiko .raw_types = { 333c64779e2SAndrii Nakryiko /* int */ 334c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 335c64779e2SAndrii Nakryiko /* static int t */ 336c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 2), /* [2] */ 337c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 338c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 339c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 340c64779e2SAndrii Nakryiko BTF_END_RAW, 341c64779e2SAndrii Nakryiko }, 342c64779e2SAndrii Nakryiko .str_sec = "\0t\0.bss", 343c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0t\0.bss"), 344c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 345c64779e2SAndrii Nakryiko .map_name = ".bss", 346c64779e2SAndrii Nakryiko .key_size = sizeof(int), 347c64779e2SAndrii Nakryiko .value_size = 4, 348c64779e2SAndrii Nakryiko .key_type_id = 0, 349c64779e2SAndrii Nakryiko .value_type_id = 3, 350c64779e2SAndrii Nakryiko .max_entries = 1, 351c64779e2SAndrii Nakryiko .btf_load_err = true, 352c64779e2SAndrii Nakryiko .err_str = "Linkage not supported", 353c64779e2SAndrii Nakryiko }, 354c64779e2SAndrii Nakryiko { 355c64779e2SAndrii Nakryiko .descr = "global data test #5, invalid var type", 356c64779e2SAndrii Nakryiko .raw_types = { 357c64779e2SAndrii Nakryiko /* static void t */ 358c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 0, 0), /* [1] */ 359c64779e2SAndrii Nakryiko /* .bss section */ /* [2] */ 360c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 361c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(1, 0, 4), 362c64779e2SAndrii Nakryiko BTF_END_RAW, 363c64779e2SAndrii Nakryiko }, 364c64779e2SAndrii Nakryiko .str_sec = "\0t\0.bss", 365c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0t\0.bss"), 366c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 367c64779e2SAndrii Nakryiko .map_name = ".bss", 368c64779e2SAndrii Nakryiko .key_size = sizeof(int), 369c64779e2SAndrii Nakryiko .value_size = 4, 370c64779e2SAndrii Nakryiko .key_type_id = 0, 371c64779e2SAndrii Nakryiko .value_type_id = 2, 372c64779e2SAndrii Nakryiko .max_entries = 1, 373c64779e2SAndrii Nakryiko .btf_load_err = true, 374c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 375c64779e2SAndrii Nakryiko }, 376c64779e2SAndrii Nakryiko { 377c64779e2SAndrii Nakryiko .descr = "global data test #6, invalid var type (fwd type)", 378c64779e2SAndrii Nakryiko .raw_types = { 379c64779e2SAndrii Nakryiko /* union A */ 380c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 381c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */ 382c64779e2SAndrii Nakryiko /* static union A t */ 383c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 384c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 385c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 386c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 387c64779e2SAndrii Nakryiko BTF_END_RAW, 388c64779e2SAndrii Nakryiko }, 389c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0.bss", 390c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0.bss"), 391c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 392c64779e2SAndrii Nakryiko .map_name = ".bss", 393c64779e2SAndrii Nakryiko .key_size = sizeof(int), 394c64779e2SAndrii Nakryiko .value_size = 4, 395c64779e2SAndrii Nakryiko .key_type_id = 0, 396c64779e2SAndrii Nakryiko .value_type_id = 2, 397c64779e2SAndrii Nakryiko .max_entries = 1, 398c64779e2SAndrii Nakryiko .btf_load_err = true, 399c64779e2SAndrii Nakryiko .err_str = "Invalid type", 400c64779e2SAndrii Nakryiko }, 401c64779e2SAndrii Nakryiko { 402c64779e2SAndrii Nakryiko .descr = "global data test #7, invalid var type (fwd type)", 403c64779e2SAndrii Nakryiko .raw_types = { 404c64779e2SAndrii Nakryiko /* union A */ 405c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 406c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */ 407c64779e2SAndrii Nakryiko /* static union A t */ 408c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 409c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 410c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 411c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(1, 0, 4), 412c64779e2SAndrii Nakryiko BTF_END_RAW, 413c64779e2SAndrii Nakryiko }, 414c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0.bss", 415c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0.bss"), 416c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 417c64779e2SAndrii Nakryiko .map_name = ".bss", 418c64779e2SAndrii Nakryiko .key_size = sizeof(int), 419c64779e2SAndrii Nakryiko .value_size = 4, 420c64779e2SAndrii Nakryiko .key_type_id = 0, 421c64779e2SAndrii Nakryiko .value_type_id = 2, 422c64779e2SAndrii Nakryiko .max_entries = 1, 423c64779e2SAndrii Nakryiko .btf_load_err = true, 424c64779e2SAndrii Nakryiko .err_str = "Invalid type", 425c64779e2SAndrii Nakryiko }, 426c64779e2SAndrii Nakryiko { 427c64779e2SAndrii Nakryiko .descr = "global data test #8, invalid var size", 428c64779e2SAndrii Nakryiko .raw_types = { 429c64779e2SAndrii Nakryiko /* int */ 430c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 431c64779e2SAndrii Nakryiko /* unsigned long long */ 432c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 433c64779e2SAndrii Nakryiko /* char */ 434c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 435c64779e2SAndrii Nakryiko /* int[8] */ 436c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 437c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 438c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 439c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 440c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 441c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 442c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 443c64779e2SAndrii Nakryiko /* } */ 444c64779e2SAndrii Nakryiko /* static struct A t */ 445c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 446c64779e2SAndrii Nakryiko /* .bss section */ /* [7] */ 447c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48), 448c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 0, 47), 449c64779e2SAndrii Nakryiko BTF_END_RAW, 450c64779e2SAndrii Nakryiko }, 451c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss", 452c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"), 453c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 454c64779e2SAndrii Nakryiko .map_name = ".bss", 455c64779e2SAndrii Nakryiko .key_size = sizeof(int), 456c64779e2SAndrii Nakryiko .value_size = 48, 457c64779e2SAndrii Nakryiko .key_type_id = 0, 458c64779e2SAndrii Nakryiko .value_type_id = 7, 459c64779e2SAndrii Nakryiko .max_entries = 1, 460c64779e2SAndrii Nakryiko .btf_load_err = true, 461c64779e2SAndrii Nakryiko .err_str = "Invalid size", 462c64779e2SAndrii Nakryiko }, 463c64779e2SAndrii Nakryiko { 464c64779e2SAndrii Nakryiko .descr = "global data test #9, invalid var size", 465c64779e2SAndrii Nakryiko .raw_types = { 466c64779e2SAndrii Nakryiko /* int */ 467c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 468c64779e2SAndrii Nakryiko /* unsigned long long */ 469c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 470c64779e2SAndrii Nakryiko /* char */ 471c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 472c64779e2SAndrii Nakryiko /* int[8] */ 473c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 474c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 475c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 476c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 477c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 478c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 479c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 480c64779e2SAndrii Nakryiko /* } */ 481c64779e2SAndrii Nakryiko /* static struct A t */ 482c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 483c64779e2SAndrii Nakryiko /* .bss section */ /* [7] */ 484c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46), 485c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 0, 48), 486c64779e2SAndrii Nakryiko BTF_END_RAW, 487c64779e2SAndrii Nakryiko }, 488c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss", 489c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"), 490c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 491c64779e2SAndrii Nakryiko .map_name = ".bss", 492c64779e2SAndrii Nakryiko .key_size = sizeof(int), 493c64779e2SAndrii Nakryiko .value_size = 48, 494c64779e2SAndrii Nakryiko .key_type_id = 0, 495c64779e2SAndrii Nakryiko .value_type_id = 7, 496c64779e2SAndrii Nakryiko .max_entries = 1, 497c64779e2SAndrii Nakryiko .btf_load_err = true, 498c64779e2SAndrii Nakryiko .err_str = "Invalid size", 499c64779e2SAndrii Nakryiko }, 500c64779e2SAndrii Nakryiko { 501c64779e2SAndrii Nakryiko .descr = "global data test #10, invalid var size", 502c64779e2SAndrii Nakryiko .raw_types = { 503c64779e2SAndrii Nakryiko /* int */ 504c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 505c64779e2SAndrii Nakryiko /* unsigned long long */ 506c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 507c64779e2SAndrii Nakryiko /* char */ 508c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 509c64779e2SAndrii Nakryiko /* int[8] */ 510c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 511c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 512c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 513c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 514c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 515c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 516c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 517c64779e2SAndrii Nakryiko /* } */ 518c64779e2SAndrii Nakryiko /* static struct A t */ 519c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 520c64779e2SAndrii Nakryiko /* .bss section */ /* [7] */ 521c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46), 522c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 0, 46), 523c64779e2SAndrii Nakryiko BTF_END_RAW, 524c64779e2SAndrii Nakryiko }, 525c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0.bss", 526c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"), 527c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 528c64779e2SAndrii Nakryiko .map_name = ".bss", 529c64779e2SAndrii Nakryiko .key_size = sizeof(int), 530c64779e2SAndrii Nakryiko .value_size = 48, 531c64779e2SAndrii Nakryiko .key_type_id = 0, 532c64779e2SAndrii Nakryiko .value_type_id = 7, 533c64779e2SAndrii Nakryiko .max_entries = 1, 534c64779e2SAndrii Nakryiko .btf_load_err = true, 535c64779e2SAndrii Nakryiko .err_str = "Invalid size", 536c64779e2SAndrii Nakryiko }, 537c64779e2SAndrii Nakryiko { 538c64779e2SAndrii Nakryiko .descr = "global data test #11, multiple section members", 539c64779e2SAndrii Nakryiko .raw_types = { 540c64779e2SAndrii Nakryiko /* int */ 541c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 542c64779e2SAndrii Nakryiko /* unsigned long long */ 543c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 544c64779e2SAndrii Nakryiko /* char */ 545c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 546c64779e2SAndrii Nakryiko /* int[8] */ 547c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 548c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 549c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 550c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 551c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 552c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 553c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 554c64779e2SAndrii Nakryiko /* } */ 555c64779e2SAndrii Nakryiko /* static struct A t */ 556c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 557c64779e2SAndrii Nakryiko /* static int u */ 558c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */ 559c64779e2SAndrii Nakryiko /* .bss section */ /* [8] */ 560c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62), 561c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 10, 48), 562c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(7, 58, 4), 563c64779e2SAndrii Nakryiko BTF_END_RAW, 564c64779e2SAndrii Nakryiko }, 565c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss", 566c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"), 567c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 568c64779e2SAndrii Nakryiko .map_name = ".bss", 569c64779e2SAndrii Nakryiko .key_size = sizeof(int), 570c64779e2SAndrii Nakryiko .value_size = 62, 571c64779e2SAndrii Nakryiko .key_type_id = 0, 572c64779e2SAndrii Nakryiko .value_type_id = 8, 573c64779e2SAndrii Nakryiko .max_entries = 1, 574c64779e2SAndrii Nakryiko }, 575c64779e2SAndrii Nakryiko { 576c64779e2SAndrii Nakryiko .descr = "global data test #12, invalid offset", 577c64779e2SAndrii Nakryiko .raw_types = { 578c64779e2SAndrii Nakryiko /* int */ 579c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 580c64779e2SAndrii Nakryiko /* unsigned long long */ 581c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 582c64779e2SAndrii Nakryiko /* char */ 583c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 584c64779e2SAndrii Nakryiko /* int[8] */ 585c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 586c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 587c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 588c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 589c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 590c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 591c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 592c64779e2SAndrii Nakryiko /* } */ 593c64779e2SAndrii Nakryiko /* static struct A t */ 594c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 595c64779e2SAndrii Nakryiko /* static int u */ 596c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */ 597c64779e2SAndrii Nakryiko /* .bss section */ /* [8] */ 598c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62), 599c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 10, 48), 600c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(7, 60, 4), 601c64779e2SAndrii Nakryiko BTF_END_RAW, 602c64779e2SAndrii Nakryiko }, 603c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss", 604c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"), 605c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 606c64779e2SAndrii Nakryiko .map_name = ".bss", 607c64779e2SAndrii Nakryiko .key_size = sizeof(int), 608c64779e2SAndrii Nakryiko .value_size = 62, 609c64779e2SAndrii Nakryiko .key_type_id = 0, 610c64779e2SAndrii Nakryiko .value_type_id = 8, 611c64779e2SAndrii Nakryiko .max_entries = 1, 612c64779e2SAndrii Nakryiko .btf_load_err = true, 613c64779e2SAndrii Nakryiko .err_str = "Invalid offset+size", 614c64779e2SAndrii Nakryiko }, 615c64779e2SAndrii Nakryiko { 616c64779e2SAndrii Nakryiko .descr = "global data test #13, invalid offset", 617c64779e2SAndrii Nakryiko .raw_types = { 618c64779e2SAndrii Nakryiko /* int */ 619c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 620c64779e2SAndrii Nakryiko /* unsigned long long */ 621c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 622c64779e2SAndrii Nakryiko /* char */ 623c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 624c64779e2SAndrii Nakryiko /* int[8] */ 625c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 626c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 627c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 628c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 629c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 630c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 631c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 632c64779e2SAndrii Nakryiko /* } */ 633c64779e2SAndrii Nakryiko /* static struct A t */ 634c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 635c64779e2SAndrii Nakryiko /* static int u */ 636c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */ 637c64779e2SAndrii Nakryiko /* .bss section */ /* [8] */ 638c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62), 639c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 10, 48), 640c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(7, 12, 4), 641c64779e2SAndrii Nakryiko BTF_END_RAW, 642c64779e2SAndrii Nakryiko }, 643c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss", 644c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"), 645c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 646c64779e2SAndrii Nakryiko .map_name = ".bss", 647c64779e2SAndrii Nakryiko .key_size = sizeof(int), 648c64779e2SAndrii Nakryiko .value_size = 62, 649c64779e2SAndrii Nakryiko .key_type_id = 0, 650c64779e2SAndrii Nakryiko .value_type_id = 8, 651c64779e2SAndrii Nakryiko .max_entries = 1, 652c64779e2SAndrii Nakryiko .btf_load_err = true, 653c64779e2SAndrii Nakryiko .err_str = "Invalid offset", 654c64779e2SAndrii Nakryiko }, 655c64779e2SAndrii Nakryiko { 656c64779e2SAndrii Nakryiko .descr = "global data test #14, invalid offset", 657c64779e2SAndrii Nakryiko .raw_types = { 658c64779e2SAndrii Nakryiko /* int */ 659c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 660c64779e2SAndrii Nakryiko /* unsigned long long */ 661c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 64, 8), /* [2] */ 662c64779e2SAndrii Nakryiko /* char */ 663c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), /* [3] */ 664c64779e2SAndrii Nakryiko /* int[8] */ 665c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 8), /* [4] */ 666c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 667c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48), 668c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* unsigned long long m;*/ 669c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n; */ 670c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o; */ 671c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8] */ 672c64779e2SAndrii Nakryiko /* } */ 673c64779e2SAndrii Nakryiko /* static struct A t */ 674c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */ 675c64779e2SAndrii Nakryiko /* static int u */ 676c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [7] */ 677c64779e2SAndrii Nakryiko /* .bss section */ /* [8] */ 678c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62), 679c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(7, 58, 4), 680c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 10, 48), 681c64779e2SAndrii Nakryiko BTF_END_RAW, 682c64779e2SAndrii Nakryiko }, 683c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss", 684c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"), 685c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 686c64779e2SAndrii Nakryiko .map_name = ".bss", 687c64779e2SAndrii Nakryiko .key_size = sizeof(int), 688c64779e2SAndrii Nakryiko .value_size = 62, 689c64779e2SAndrii Nakryiko .key_type_id = 0, 690c64779e2SAndrii Nakryiko .value_type_id = 8, 691c64779e2SAndrii Nakryiko .max_entries = 1, 692c64779e2SAndrii Nakryiko .btf_load_err = true, 693c64779e2SAndrii Nakryiko .err_str = "Invalid offset", 694c64779e2SAndrii Nakryiko }, 695c64779e2SAndrii Nakryiko { 696c64779e2SAndrii Nakryiko .descr = "global data test #15, not var kind", 697c64779e2SAndrii Nakryiko .raw_types = { 698c64779e2SAndrii Nakryiko /* int */ 699c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 700c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 701c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 702c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 703c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(1, 0, 4), 704c64779e2SAndrii Nakryiko BTF_END_RAW, 705c64779e2SAndrii Nakryiko }, 706c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0.bss", 707c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0.bss"), 708c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 709c64779e2SAndrii Nakryiko .map_name = ".bss", 710c64779e2SAndrii Nakryiko .key_size = sizeof(int), 711c64779e2SAndrii Nakryiko .value_size = 4, 712c64779e2SAndrii Nakryiko .key_type_id = 0, 713c64779e2SAndrii Nakryiko .value_type_id = 3, 714c64779e2SAndrii Nakryiko .max_entries = 1, 715c64779e2SAndrii Nakryiko .btf_load_err = true, 716c64779e2SAndrii Nakryiko .err_str = "Not a VAR kind member", 717c64779e2SAndrii Nakryiko }, 718c64779e2SAndrii Nakryiko { 719c64779e2SAndrii Nakryiko .descr = "global data test #16, invalid var referencing sec", 720c64779e2SAndrii Nakryiko .raw_types = { 721c64779e2SAndrii Nakryiko /* int */ 722c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 723c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 5, 0), /* [2] */ 724c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 2, 0), /* [3] */ 725c64779e2SAndrii Nakryiko /* a section */ /* [4] */ 726c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 727c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(3, 0, 4), 728c64779e2SAndrii Nakryiko /* a section */ /* [5] */ 729c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 730c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(6, 0, 4), 731c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [6] */ 732c64779e2SAndrii Nakryiko BTF_END_RAW, 733c64779e2SAndrii Nakryiko }, 734c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 735c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 736c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 737c64779e2SAndrii Nakryiko .map_name = ".bss", 738c64779e2SAndrii Nakryiko .key_size = sizeof(int), 739c64779e2SAndrii Nakryiko .value_size = 4, 740c64779e2SAndrii Nakryiko .key_type_id = 0, 741c64779e2SAndrii Nakryiko .value_type_id = 4, 742c64779e2SAndrii Nakryiko .max_entries = 1, 743c64779e2SAndrii Nakryiko .btf_load_err = true, 744c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 745c64779e2SAndrii Nakryiko }, 746c64779e2SAndrii Nakryiko { 747c64779e2SAndrii Nakryiko .descr = "global data test #17, invalid var referencing var", 748c64779e2SAndrii Nakryiko .raw_types = { 749c64779e2SAndrii Nakryiko /* int */ 750c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 751c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 752c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 2, 0), /* [3] */ 753c64779e2SAndrii Nakryiko /* a section */ /* [4] */ 754c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 755c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(3, 0, 4), 756c64779e2SAndrii Nakryiko BTF_END_RAW, 757c64779e2SAndrii Nakryiko }, 758c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 759c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 760c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 761c64779e2SAndrii Nakryiko .map_name = ".bss", 762c64779e2SAndrii Nakryiko .key_size = sizeof(int), 763c64779e2SAndrii Nakryiko .value_size = 4, 764c64779e2SAndrii Nakryiko .key_type_id = 0, 765c64779e2SAndrii Nakryiko .value_type_id = 4, 766c64779e2SAndrii Nakryiko .max_entries = 1, 767c64779e2SAndrii Nakryiko .btf_load_err = true, 768c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 769c64779e2SAndrii Nakryiko }, 770c64779e2SAndrii Nakryiko { 771c64779e2SAndrii Nakryiko .descr = "global data test #18, invalid var loop", 772c64779e2SAndrii Nakryiko .raw_types = { 773c64779e2SAndrii Nakryiko /* int */ 774c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 775c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 2, 0), /* [2] */ 776c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 777c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 778c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 779c64779e2SAndrii Nakryiko BTF_END_RAW, 780c64779e2SAndrii Nakryiko }, 781c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0aaa", 782c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0aaa"), 783c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 784c64779e2SAndrii Nakryiko .map_name = ".bss", 785c64779e2SAndrii Nakryiko .key_size = sizeof(int), 786c64779e2SAndrii Nakryiko .value_size = 4, 787c64779e2SAndrii Nakryiko .key_type_id = 0, 788c64779e2SAndrii Nakryiko .value_type_id = 4, 789c64779e2SAndrii Nakryiko .max_entries = 1, 790c64779e2SAndrii Nakryiko .btf_load_err = true, 791c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 792c64779e2SAndrii Nakryiko }, 793c64779e2SAndrii Nakryiko { 794c64779e2SAndrii Nakryiko .descr = "global data test #19, invalid var referencing var", 795c64779e2SAndrii Nakryiko .raw_types = { 796c64779e2SAndrii Nakryiko /* int */ 797c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 798c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 3, 0), /* [2] */ 799c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */ 800c64779e2SAndrii Nakryiko BTF_END_RAW, 801c64779e2SAndrii Nakryiko }, 802c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 803c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 804c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 805c64779e2SAndrii Nakryiko .map_name = ".bss", 806c64779e2SAndrii Nakryiko .key_size = sizeof(int), 807c64779e2SAndrii Nakryiko .value_size = 4, 808c64779e2SAndrii Nakryiko .key_type_id = 0, 809c64779e2SAndrii Nakryiko .value_type_id = 4, 810c64779e2SAndrii Nakryiko .max_entries = 1, 811c64779e2SAndrii Nakryiko .btf_load_err = true, 812c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 813c64779e2SAndrii Nakryiko }, 814c64779e2SAndrii Nakryiko { 815c64779e2SAndrii Nakryiko .descr = "global data test #20, invalid ptr referencing var", 816c64779e2SAndrii Nakryiko .raw_types = { 817c64779e2SAndrii Nakryiko /* int */ 818c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 819c64779e2SAndrii Nakryiko /* PTR type_id=3 */ /* [2] */ 820c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3), 821c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */ 822c64779e2SAndrii Nakryiko BTF_END_RAW, 823c64779e2SAndrii Nakryiko }, 824c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 825c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 826c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 827c64779e2SAndrii Nakryiko .map_name = ".bss", 828c64779e2SAndrii Nakryiko .key_size = sizeof(int), 829c64779e2SAndrii Nakryiko .value_size = 4, 830c64779e2SAndrii Nakryiko .key_type_id = 0, 831c64779e2SAndrii Nakryiko .value_type_id = 4, 832c64779e2SAndrii Nakryiko .max_entries = 1, 833c64779e2SAndrii Nakryiko .btf_load_err = true, 834c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 835c64779e2SAndrii Nakryiko }, 836c64779e2SAndrii Nakryiko { 837c64779e2SAndrii Nakryiko .descr = "global data test #21, var included in struct", 838c64779e2SAndrii Nakryiko .raw_types = { 839c64779e2SAndrii Nakryiko /* int */ 840c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 841c64779e2SAndrii Nakryiko /* struct A { */ /* [2] */ 842c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2), 843c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 844c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* VAR type_id=3; */ 845c64779e2SAndrii Nakryiko /* } */ 846c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */ 847c64779e2SAndrii Nakryiko BTF_END_RAW, 848c64779e2SAndrii Nakryiko }, 849c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 850c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 851c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 852c64779e2SAndrii Nakryiko .map_name = ".bss", 853c64779e2SAndrii Nakryiko .key_size = sizeof(int), 854c64779e2SAndrii Nakryiko .value_size = 4, 855c64779e2SAndrii Nakryiko .key_type_id = 0, 856c64779e2SAndrii Nakryiko .value_type_id = 4, 857c64779e2SAndrii Nakryiko .max_entries = 1, 858c64779e2SAndrii Nakryiko .btf_load_err = true, 859c64779e2SAndrii Nakryiko .err_str = "Invalid member", 860c64779e2SAndrii Nakryiko }, 861c64779e2SAndrii Nakryiko { 862c64779e2SAndrii Nakryiko .descr = "global data test #22, array of var", 863c64779e2SAndrii Nakryiko .raw_types = { 864c64779e2SAndrii Nakryiko /* int */ 865c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 866c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */ 867c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_TBD, 1, 0), /* [3] */ 868c64779e2SAndrii Nakryiko BTF_END_RAW, 869c64779e2SAndrii Nakryiko }, 870c64779e2SAndrii Nakryiko .str_sec = "\0A\0t\0s\0a\0a", 871c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0t\0s\0a\0a"), 872c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 873c64779e2SAndrii Nakryiko .map_name = ".bss", 874c64779e2SAndrii Nakryiko .key_size = sizeof(int), 875c64779e2SAndrii Nakryiko .value_size = 4, 876c64779e2SAndrii Nakryiko .key_type_id = 0, 877c64779e2SAndrii Nakryiko .value_type_id = 4, 878c64779e2SAndrii Nakryiko .max_entries = 1, 879c64779e2SAndrii Nakryiko .btf_load_err = true, 880c64779e2SAndrii Nakryiko .err_str = "Invalid elem", 881c64779e2SAndrii Nakryiko }, 882c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct. 883c64779e2SAndrii Nakryiko * 884c64779e2SAndrii Nakryiko * struct A { 885c64779e2SAndrii Nakryiko * int m; 886c64779e2SAndrii Nakryiko * int n; 887c64779e2SAndrii Nakryiko * }; 888c64779e2SAndrii Nakryiko */ 889c64779e2SAndrii Nakryiko { 890c64779e2SAndrii Nakryiko .descr = "size check test #1", 891c64779e2SAndrii Nakryiko .raw_types = { 892c64779e2SAndrii Nakryiko /* int */ /* [1] */ 893c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 894c64779e2SAndrii Nakryiko /* struct A { */ /* [2] */ 895c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1), 896c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 897c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */ 898c64779e2SAndrii Nakryiko /* } */ 899c64779e2SAndrii Nakryiko BTF_END_RAW, 900c64779e2SAndrii Nakryiko }, 901c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n", 902c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n"), 903c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 904c64779e2SAndrii Nakryiko .map_name = "size_check1_map", 905c64779e2SAndrii Nakryiko .key_size = sizeof(int), 906c64779e2SAndrii Nakryiko .value_size = 1, 907c64779e2SAndrii Nakryiko .key_type_id = 1, 908c64779e2SAndrii Nakryiko .value_type_id = 2, 909c64779e2SAndrii Nakryiko .max_entries = 4, 910c64779e2SAndrii Nakryiko .btf_load_err = true, 911c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 912c64779e2SAndrii Nakryiko }, 913c64779e2SAndrii Nakryiko 914443edcefSJunlin Yang /* Test member exceeds the size of struct 915c64779e2SAndrii Nakryiko * 916c64779e2SAndrii Nakryiko * struct A { 917c64779e2SAndrii Nakryiko * int m; 918c64779e2SAndrii Nakryiko * int n[2]; 919c64779e2SAndrii Nakryiko * }; 920c64779e2SAndrii Nakryiko */ 921c64779e2SAndrii Nakryiko { 922c64779e2SAndrii Nakryiko .descr = "size check test #2", 923c64779e2SAndrii Nakryiko .raw_types = { 924c64779e2SAndrii Nakryiko /* int */ /* [1] */ 925c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)), 926c64779e2SAndrii Nakryiko /* int[2] */ /* [2] */ 927c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), 928c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 929c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 3 - 1), 930c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 931c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* int n[2]; */ 932c64779e2SAndrii Nakryiko /* } */ 933c64779e2SAndrii Nakryiko BTF_END_RAW, 934c64779e2SAndrii Nakryiko }, 935c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n", 936c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n"), 937c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 938c64779e2SAndrii Nakryiko .map_name = "size_check2_map", 939c64779e2SAndrii Nakryiko .key_size = sizeof(int), 940c64779e2SAndrii Nakryiko .value_size = 1, 941c64779e2SAndrii Nakryiko .key_type_id = 1, 942c64779e2SAndrii Nakryiko .value_type_id = 3, 943c64779e2SAndrii Nakryiko .max_entries = 4, 944c64779e2SAndrii Nakryiko .btf_load_err = true, 945c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 946c64779e2SAndrii Nakryiko }, 947c64779e2SAndrii Nakryiko 948443edcefSJunlin Yang /* Test member exceeds the size of struct 949c64779e2SAndrii Nakryiko * 950c64779e2SAndrii Nakryiko * struct A { 951c64779e2SAndrii Nakryiko * int m; 952c64779e2SAndrii Nakryiko * void *n; 953c64779e2SAndrii Nakryiko * }; 954c64779e2SAndrii Nakryiko */ 955c64779e2SAndrii Nakryiko { 956c64779e2SAndrii Nakryiko .descr = "size check test #3", 957c64779e2SAndrii Nakryiko .raw_types = { 958c64779e2SAndrii Nakryiko /* int */ /* [1] */ 959c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)), 960c64779e2SAndrii Nakryiko /* void* */ /* [2] */ 961c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0), 962c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 963c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) + sizeof(void *) - 1), 964c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 965c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* void *n; */ 966c64779e2SAndrii Nakryiko /* } */ 967c64779e2SAndrii Nakryiko BTF_END_RAW, 968c64779e2SAndrii Nakryiko }, 969c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0n", 970c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0n"), 971c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 972c64779e2SAndrii Nakryiko .map_name = "size_check3_map", 973c64779e2SAndrii Nakryiko .key_size = sizeof(int), 974c64779e2SAndrii Nakryiko .value_size = 1, 975c64779e2SAndrii Nakryiko .key_type_id = 1, 976c64779e2SAndrii Nakryiko .value_type_id = 3, 977c64779e2SAndrii Nakryiko .max_entries = 4, 978c64779e2SAndrii Nakryiko .btf_load_err = true, 979c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 980c64779e2SAndrii Nakryiko }, 981c64779e2SAndrii Nakryiko 982c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct 983c64779e2SAndrii Nakryiko * 984c64779e2SAndrii Nakryiko * enum E { 985c64779e2SAndrii Nakryiko * E0, 986c64779e2SAndrii Nakryiko * E1, 987c64779e2SAndrii Nakryiko * }; 988c64779e2SAndrii Nakryiko * 989c64779e2SAndrii Nakryiko * struct A { 990c64779e2SAndrii Nakryiko * int m; 991c64779e2SAndrii Nakryiko * enum E n; 992c64779e2SAndrii Nakryiko * }; 993c64779e2SAndrii Nakryiko */ 994c64779e2SAndrii Nakryiko { 995c64779e2SAndrii Nakryiko .descr = "size check test #4", 996c64779e2SAndrii Nakryiko .raw_types = { 997c64779e2SAndrii Nakryiko /* int */ /* [1] */ 998c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)), 999c64779e2SAndrii Nakryiko /* enum E { */ /* [2] */ 1000c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)), 1001c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 1002c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 1003c64779e2SAndrii Nakryiko /* } */ 1004c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 1005c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1), 1006c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int m; */ 1007c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* enum E n; */ 1008c64779e2SAndrii Nakryiko /* } */ 1009c64779e2SAndrii Nakryiko BTF_END_RAW, 1010c64779e2SAndrii Nakryiko }, 1011c64779e2SAndrii Nakryiko .str_sec = "\0E\0E0\0E1\0A\0m\0n", 1012c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"), 1013c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1014c64779e2SAndrii Nakryiko .map_name = "size_check4_map", 1015c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1016c64779e2SAndrii Nakryiko .value_size = 1, 1017c64779e2SAndrii Nakryiko .key_type_id = 1, 1018c64779e2SAndrii Nakryiko .value_type_id = 3, 1019c64779e2SAndrii Nakryiko .max_entries = 4, 1020c64779e2SAndrii Nakryiko .btf_load_err = true, 1021c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 1022c64779e2SAndrii Nakryiko }, 1023c64779e2SAndrii Nakryiko 1024c64779e2SAndrii Nakryiko /* Test member unexceeds the size of struct 1025c64779e2SAndrii Nakryiko * 1026c64779e2SAndrii Nakryiko * enum E { 1027c64779e2SAndrii Nakryiko * E0, 1028c64779e2SAndrii Nakryiko * E1, 1029c64779e2SAndrii Nakryiko * }; 1030c64779e2SAndrii Nakryiko * 1031c64779e2SAndrii Nakryiko * struct A { 1032c64779e2SAndrii Nakryiko * char m; 1033c64779e2SAndrii Nakryiko * enum E __attribute__((packed)) n; 1034c64779e2SAndrii Nakryiko * }; 1035c64779e2SAndrii Nakryiko */ 1036c64779e2SAndrii Nakryiko { 1037c64779e2SAndrii Nakryiko .descr = "size check test #5", 1038c64779e2SAndrii Nakryiko .raw_types = { 1039c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1040c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)), 1041c64779e2SAndrii Nakryiko /* char */ /* [2] */ 1042c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1), 1043c64779e2SAndrii Nakryiko /* enum E { */ /* [3] */ 1044c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 1), 1045c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 1046c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 1047c64779e2SAndrii Nakryiko /* } */ 1048c64779e2SAndrii Nakryiko /* struct A { */ /* [4] */ 1049c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 2), 1050c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* char m; */ 1051c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 8),/* enum E __attribute__((packed)) n; */ 1052c64779e2SAndrii Nakryiko /* } */ 1053c64779e2SAndrii Nakryiko BTF_END_RAW, 1054c64779e2SAndrii Nakryiko }, 1055c64779e2SAndrii Nakryiko .str_sec = "\0E\0E0\0E1\0A\0m\0n", 1056c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"), 1057c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1058c64779e2SAndrii Nakryiko .map_name = "size_check5_map", 1059c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1060c64779e2SAndrii Nakryiko .value_size = 2, 1061c64779e2SAndrii Nakryiko .key_type_id = 1, 1062c64779e2SAndrii Nakryiko .value_type_id = 4, 1063c64779e2SAndrii Nakryiko .max_entries = 4, 1064c64779e2SAndrii Nakryiko }, 1065c64779e2SAndrii Nakryiko 1066c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr; 1067c64779e2SAndrii Nakryiko * struct A { 1068c64779e2SAndrii Nakryiko * const_void_ptr m; 1069c64779e2SAndrii Nakryiko * }; 1070c64779e2SAndrii Nakryiko */ 1071c64779e2SAndrii Nakryiko { 1072c64779e2SAndrii Nakryiko .descr = "void test #1", 1073c64779e2SAndrii Nakryiko .raw_types = { 1074c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1075c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1076c64779e2SAndrii Nakryiko /* const void */ /* [2] */ 1077c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1078c64779e2SAndrii Nakryiko /* const void* */ /* [3] */ 1079c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2), 1080c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr */ 1081c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), /* [4] */ 1082c64779e2SAndrii Nakryiko /* struct A { */ /* [5] */ 1083c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)), 1084c64779e2SAndrii Nakryiko /* const_void_ptr m; */ 1085c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 0), 1086c64779e2SAndrii Nakryiko /* } */ 1087c64779e2SAndrii Nakryiko BTF_END_RAW, 1088c64779e2SAndrii Nakryiko }, 1089c64779e2SAndrii Nakryiko .str_sec = "\0const_void_ptr\0A\0m", 1090c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0const_void_ptr\0A\0m"), 1091c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1092c64779e2SAndrii Nakryiko .map_name = "void_test1_map", 1093c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1094c64779e2SAndrii Nakryiko .value_size = sizeof(void *), 1095c64779e2SAndrii Nakryiko .key_type_id = 1, 1096c64779e2SAndrii Nakryiko .value_type_id = 4, 1097c64779e2SAndrii Nakryiko .max_entries = 4, 1098c64779e2SAndrii Nakryiko }, 1099c64779e2SAndrii Nakryiko 1100c64779e2SAndrii Nakryiko /* struct A { 1101c64779e2SAndrii Nakryiko * const void m; 1102c64779e2SAndrii Nakryiko * }; 1103c64779e2SAndrii Nakryiko */ 1104c64779e2SAndrii Nakryiko { 1105c64779e2SAndrii Nakryiko .descr = "void test #2", 1106c64779e2SAndrii Nakryiko .raw_types = { 1107c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1108c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1109c64779e2SAndrii Nakryiko /* const void */ /* [2] */ 1110c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1111c64779e2SAndrii Nakryiko /* struct A { */ /* [3] */ 1112c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 8), 1113c64779e2SAndrii Nakryiko /* const void m; */ 1114c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 1115c64779e2SAndrii Nakryiko /* } */ 1116c64779e2SAndrii Nakryiko BTF_END_RAW, 1117c64779e2SAndrii Nakryiko }, 1118c64779e2SAndrii Nakryiko .str_sec = "\0A\0m", 1119c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m"), 1120c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1121c64779e2SAndrii Nakryiko .map_name = "void_test2_map", 1122c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1123c64779e2SAndrii Nakryiko .value_size = sizeof(void *), 1124c64779e2SAndrii Nakryiko .key_type_id = 1, 1125c64779e2SAndrii Nakryiko .value_type_id = 3, 1126c64779e2SAndrii Nakryiko .max_entries = 4, 1127c64779e2SAndrii Nakryiko .btf_load_err = true, 1128c64779e2SAndrii Nakryiko .err_str = "Invalid member", 1129c64779e2SAndrii Nakryiko }, 1130c64779e2SAndrii Nakryiko 1131c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr; 1132c64779e2SAndrii Nakryiko * const_void_ptr[4] 1133c64779e2SAndrii Nakryiko */ 1134c64779e2SAndrii Nakryiko { 1135c64779e2SAndrii Nakryiko .descr = "void test #3", 1136c64779e2SAndrii Nakryiko .raw_types = { 1137c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1138c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1139c64779e2SAndrii Nakryiko /* const void */ /* [2] */ 1140c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1141c64779e2SAndrii Nakryiko /* const void* */ /* [3] */ 1142c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2), 1143c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr */ 1144c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), /* [4] */ 1145c64779e2SAndrii Nakryiko /* const_void_ptr[4] */ 1146c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(4, 1, 4), /* [5] */ 1147c64779e2SAndrii Nakryiko BTF_END_RAW, 1148c64779e2SAndrii Nakryiko }, 1149c64779e2SAndrii Nakryiko .str_sec = "\0const_void_ptr", 1150c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0const_void_ptr"), 1151c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1152c64779e2SAndrii Nakryiko .map_name = "void_test3_map", 1153c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1154c64779e2SAndrii Nakryiko .value_size = sizeof(void *) * 4, 1155c64779e2SAndrii Nakryiko .key_type_id = 1, 1156c64779e2SAndrii Nakryiko .value_type_id = 5, 1157c64779e2SAndrii Nakryiko .max_entries = 4, 1158c64779e2SAndrii Nakryiko }, 1159c64779e2SAndrii Nakryiko 1160c64779e2SAndrii Nakryiko /* const void[4] */ 1161c64779e2SAndrii Nakryiko { 1162c64779e2SAndrii Nakryiko .descr = "void test #4", 1163c64779e2SAndrii Nakryiko .raw_types = { 1164c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1165c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1166c64779e2SAndrii Nakryiko /* const void */ /* [2] */ 1167c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1168c64779e2SAndrii Nakryiko /* const void[4] */ /* [3] */ 1169c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 4), 1170c64779e2SAndrii Nakryiko BTF_END_RAW, 1171c64779e2SAndrii Nakryiko }, 1172c64779e2SAndrii Nakryiko .str_sec = "\0A\0m", 1173c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m"), 1174c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1175c64779e2SAndrii Nakryiko .map_name = "void_test4_map", 1176c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1177c64779e2SAndrii Nakryiko .value_size = sizeof(void *) * 4, 1178c64779e2SAndrii Nakryiko .key_type_id = 1, 1179c64779e2SAndrii Nakryiko .value_type_id = 3, 1180c64779e2SAndrii Nakryiko .max_entries = 4, 1181c64779e2SAndrii Nakryiko .btf_load_err = true, 1182c64779e2SAndrii Nakryiko .err_str = "Invalid elem", 1183c64779e2SAndrii Nakryiko }, 1184c64779e2SAndrii Nakryiko 1185c64779e2SAndrii Nakryiko /* Array_A <------------------+ 1186c64779e2SAndrii Nakryiko * elem_type == Array_B | 1187c64779e2SAndrii Nakryiko * | | 1188c64779e2SAndrii Nakryiko * | | 1189c64779e2SAndrii Nakryiko * Array_B <-------- + | 1190c64779e2SAndrii Nakryiko * elem_type == Array A --+ 1191c64779e2SAndrii Nakryiko */ 1192c64779e2SAndrii Nakryiko { 1193c64779e2SAndrii Nakryiko .descr = "loop test #1", 1194c64779e2SAndrii Nakryiko .raw_types = { 1195c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1196c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1197c64779e2SAndrii Nakryiko /* Array_A */ /* [2] */ 1198c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 8), 1199c64779e2SAndrii Nakryiko /* Array_B */ /* [3] */ 1200c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 8), 1201c64779e2SAndrii Nakryiko BTF_END_RAW, 1202c64779e2SAndrii Nakryiko }, 1203c64779e2SAndrii Nakryiko .str_sec = "", 1204c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1205c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1206c64779e2SAndrii Nakryiko .map_name = "loop_test1_map", 1207c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1208c64779e2SAndrii Nakryiko .value_size = sizeof(sizeof(int) * 8), 1209c64779e2SAndrii Nakryiko .key_type_id = 1, 1210c64779e2SAndrii Nakryiko .value_type_id = 2, 1211c64779e2SAndrii Nakryiko .max_entries = 4, 1212c64779e2SAndrii Nakryiko .btf_load_err = true, 1213c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1214c64779e2SAndrii Nakryiko }, 1215c64779e2SAndrii Nakryiko 1216c64779e2SAndrii Nakryiko /* typedef is _before_ the BTF type of Array_A and Array_B 1217c64779e2SAndrii Nakryiko * 1218c64779e2SAndrii Nakryiko * typedef Array_B int_array; 1219c64779e2SAndrii Nakryiko * 1220c64779e2SAndrii Nakryiko * Array_A <------------------+ 1221c64779e2SAndrii Nakryiko * elem_type == int_array | 1222c64779e2SAndrii Nakryiko * | | 1223c64779e2SAndrii Nakryiko * | | 1224c64779e2SAndrii Nakryiko * Array_B <-------- + | 1225c64779e2SAndrii Nakryiko * elem_type == Array_A --+ 1226c64779e2SAndrii Nakryiko */ 1227c64779e2SAndrii Nakryiko { 1228c64779e2SAndrii Nakryiko .descr = "loop test #2", 1229c64779e2SAndrii Nakryiko .raw_types = { 1230c64779e2SAndrii Nakryiko /* int */ 1231c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1232c64779e2SAndrii Nakryiko /* typedef Array_B int_array */ 1233c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(1, 4), /* [2] */ 1234c64779e2SAndrii Nakryiko /* Array_A */ 1235c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 8), /* [3] */ 1236c64779e2SAndrii Nakryiko /* Array_B */ 1237c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 8), /* [4] */ 1238c64779e2SAndrii Nakryiko BTF_END_RAW, 1239c64779e2SAndrii Nakryiko }, 1240c64779e2SAndrii Nakryiko .str_sec = "\0int_array\0", 1241c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int_array"), 1242c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1243c64779e2SAndrii Nakryiko .map_name = "loop_test2_map", 1244c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1245c64779e2SAndrii Nakryiko .value_size = sizeof(sizeof(int) * 8), 1246c64779e2SAndrii Nakryiko .key_type_id = 1, 1247c64779e2SAndrii Nakryiko .value_type_id = 2, 1248c64779e2SAndrii Nakryiko .max_entries = 4, 1249c64779e2SAndrii Nakryiko .btf_load_err = true, 1250c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1251c64779e2SAndrii Nakryiko }, 1252c64779e2SAndrii Nakryiko 1253c64779e2SAndrii Nakryiko /* Array_A <------------------+ 1254c64779e2SAndrii Nakryiko * elem_type == Array_B | 1255c64779e2SAndrii Nakryiko * | | 1256c64779e2SAndrii Nakryiko * | | 1257c64779e2SAndrii Nakryiko * Array_B <-------- + | 1258c64779e2SAndrii Nakryiko * elem_type == Array_A --+ 1259c64779e2SAndrii Nakryiko */ 1260c64779e2SAndrii Nakryiko { 1261c64779e2SAndrii Nakryiko .descr = "loop test #3", 1262c64779e2SAndrii Nakryiko .raw_types = { 1263c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1264c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1265c64779e2SAndrii Nakryiko /* Array_A */ /* [2] */ 1266c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 8), 1267c64779e2SAndrii Nakryiko /* Array_B */ /* [3] */ 1268c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 8), 1269c64779e2SAndrii Nakryiko BTF_END_RAW, 1270c64779e2SAndrii Nakryiko }, 1271c64779e2SAndrii Nakryiko .str_sec = "", 1272c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1273c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1274c64779e2SAndrii Nakryiko .map_name = "loop_test3_map", 1275c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1276c64779e2SAndrii Nakryiko .value_size = sizeof(sizeof(int) * 8), 1277c64779e2SAndrii Nakryiko .key_type_id = 1, 1278c64779e2SAndrii Nakryiko .value_type_id = 2, 1279c64779e2SAndrii Nakryiko .max_entries = 4, 1280c64779e2SAndrii Nakryiko .btf_load_err = true, 1281c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1282c64779e2SAndrii Nakryiko }, 1283c64779e2SAndrii Nakryiko 1284c64779e2SAndrii Nakryiko /* typedef is _between_ the BTF type of Array_A and Array_B 1285c64779e2SAndrii Nakryiko * 1286c64779e2SAndrii Nakryiko * typedef Array_B int_array; 1287c64779e2SAndrii Nakryiko * 1288c64779e2SAndrii Nakryiko * Array_A <------------------+ 1289c64779e2SAndrii Nakryiko * elem_type == int_array | 1290c64779e2SAndrii Nakryiko * | | 1291c64779e2SAndrii Nakryiko * | | 1292c64779e2SAndrii Nakryiko * Array_B <-------- + | 1293c64779e2SAndrii Nakryiko * elem_type == Array_A --+ 1294c64779e2SAndrii Nakryiko */ 1295c64779e2SAndrii Nakryiko { 1296c64779e2SAndrii Nakryiko .descr = "loop test #4", 1297c64779e2SAndrii Nakryiko .raw_types = { 1298c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1299c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1300c64779e2SAndrii Nakryiko /* Array_A */ /* [2] */ 1301c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 8), 1302c64779e2SAndrii Nakryiko /* typedef Array_B int_array */ /* [3] */ 1303c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 1304c64779e2SAndrii Nakryiko /* Array_B */ /* [4] */ 1305c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 8), 1306c64779e2SAndrii Nakryiko BTF_END_RAW, 1307c64779e2SAndrii Nakryiko }, 1308c64779e2SAndrii Nakryiko .str_sec = "\0int_array\0", 1309c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int_array"), 1310c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1311c64779e2SAndrii Nakryiko .map_name = "loop_test4_map", 1312c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1313c64779e2SAndrii Nakryiko .value_size = sizeof(sizeof(int) * 8), 1314c64779e2SAndrii Nakryiko .key_type_id = 1, 1315c64779e2SAndrii Nakryiko .value_type_id = 2, 1316c64779e2SAndrii Nakryiko .max_entries = 4, 1317c64779e2SAndrii Nakryiko .btf_load_err = true, 1318c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1319c64779e2SAndrii Nakryiko }, 1320c64779e2SAndrii Nakryiko 1321c64779e2SAndrii Nakryiko /* typedef struct B Struct_B 1322c64779e2SAndrii Nakryiko * 1323c64779e2SAndrii Nakryiko * struct A { 1324c64779e2SAndrii Nakryiko * int x; 1325c64779e2SAndrii Nakryiko * Struct_B y; 1326c64779e2SAndrii Nakryiko * }; 1327c64779e2SAndrii Nakryiko * 1328c64779e2SAndrii Nakryiko * struct B { 1329c64779e2SAndrii Nakryiko * int x; 1330c64779e2SAndrii Nakryiko * struct A y; 1331c64779e2SAndrii Nakryiko * }; 1332c64779e2SAndrii Nakryiko */ 1333c64779e2SAndrii Nakryiko { 1334c64779e2SAndrii Nakryiko .descr = "loop test #5", 1335c64779e2SAndrii Nakryiko .raw_types = { 1336c64779e2SAndrii Nakryiko /* int */ 1337c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1338c64779e2SAndrii Nakryiko /* struct A */ /* [2] */ 1339c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), 1340c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */ 1341c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* Struct_B y; */ 1342c64779e2SAndrii Nakryiko /* typedef struct B Struct_B */ 1343c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 1344c64779e2SAndrii Nakryiko /* struct B */ /* [4] */ 1345c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), 1346c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */ 1347c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A y; */ 1348c64779e2SAndrii Nakryiko BTF_END_RAW, 1349c64779e2SAndrii Nakryiko }, 1350c64779e2SAndrii Nakryiko .str_sec = "\0A\0x\0y\0Struct_B\0B\0x\0y", 1351c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0x\0y\0Struct_B\0B\0x\0y"), 1352c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1353c64779e2SAndrii Nakryiko .map_name = "loop_test5_map", 1354c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1355c64779e2SAndrii Nakryiko .value_size = 8, 1356c64779e2SAndrii Nakryiko .key_type_id = 1, 1357c64779e2SAndrii Nakryiko .value_type_id = 2, 1358c64779e2SAndrii Nakryiko .max_entries = 4, 1359c64779e2SAndrii Nakryiko .btf_load_err = true, 1360c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1361c64779e2SAndrii Nakryiko }, 1362c64779e2SAndrii Nakryiko 1363c64779e2SAndrii Nakryiko /* struct A { 1364c64779e2SAndrii Nakryiko * int x; 1365c64779e2SAndrii Nakryiko * struct A array_a[4]; 1366c64779e2SAndrii Nakryiko * }; 1367c64779e2SAndrii Nakryiko */ 1368c64779e2SAndrii Nakryiko { 1369c64779e2SAndrii Nakryiko .descr = "loop test #6", 1370c64779e2SAndrii Nakryiko .raw_types = { 1371c64779e2SAndrii Nakryiko /* int */ 1372c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1373c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 4), /* [2] */ 1374c64779e2SAndrii Nakryiko /* struct A */ /* [3] */ 1375c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), 1376c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), /* int x; */ 1377c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A array_a[4]; */ 1378c64779e2SAndrii Nakryiko BTF_END_RAW, 1379c64779e2SAndrii Nakryiko }, 1380c64779e2SAndrii Nakryiko .str_sec = "\0A\0x\0y", 1381c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0x\0y"), 1382c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1383c64779e2SAndrii Nakryiko .map_name = "loop_test6_map", 1384c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1385c64779e2SAndrii Nakryiko .value_size = 8, 1386c64779e2SAndrii Nakryiko .key_type_id = 1, 1387c64779e2SAndrii Nakryiko .value_type_id = 2, 1388c64779e2SAndrii Nakryiko .max_entries = 4, 1389c64779e2SAndrii Nakryiko .btf_load_err = true, 1390c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1391c64779e2SAndrii Nakryiko }, 1392c64779e2SAndrii Nakryiko 1393c64779e2SAndrii Nakryiko { 1394c64779e2SAndrii Nakryiko .descr = "loop test #7", 1395c64779e2SAndrii Nakryiko .raw_types = { 1396c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1397c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1398c64779e2SAndrii Nakryiko /* struct A { */ /* [2] */ 1399c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)), 1400c64779e2SAndrii Nakryiko /* const void *m; */ 1401c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, 0), 1402c64779e2SAndrii Nakryiko /* CONST type_id=3 */ /* [3] */ 1403c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4), 1404c64779e2SAndrii Nakryiko /* PTR type_id=2 */ /* [4] */ 1405c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3), 1406c64779e2SAndrii Nakryiko BTF_END_RAW, 1407c64779e2SAndrii Nakryiko }, 1408c64779e2SAndrii Nakryiko .str_sec = "\0A\0m", 1409c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m"), 1410c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1411c64779e2SAndrii Nakryiko .map_name = "loop_test7_map", 1412c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1413c64779e2SAndrii Nakryiko .value_size = sizeof(void *), 1414c64779e2SAndrii Nakryiko .key_type_id = 1, 1415c64779e2SAndrii Nakryiko .value_type_id = 2, 1416c64779e2SAndrii Nakryiko .max_entries = 4, 1417c64779e2SAndrii Nakryiko .btf_load_err = true, 1418c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1419c64779e2SAndrii Nakryiko }, 1420c64779e2SAndrii Nakryiko 1421c64779e2SAndrii Nakryiko { 1422c64779e2SAndrii Nakryiko .descr = "loop test #8", 1423c64779e2SAndrii Nakryiko .raw_types = { 1424c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1425c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1426c64779e2SAndrii Nakryiko /* struct A { */ /* [2] */ 1427c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)), 1428c64779e2SAndrii Nakryiko /* const void *m; */ 1429c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, 0), 1430c64779e2SAndrii Nakryiko /* struct B { */ /* [3] */ 1431c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)), 1432c64779e2SAndrii Nakryiko /* const void *n; */ 1433c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 0), 1434c64779e2SAndrii Nakryiko /* CONST type_id=5 */ /* [4] */ 1435c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 5), 1436c64779e2SAndrii Nakryiko /* PTR type_id=6 */ /* [5] */ 1437c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 6), 1438c64779e2SAndrii Nakryiko /* CONST type_id=7 */ /* [6] */ 1439c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 7), 1440c64779e2SAndrii Nakryiko /* PTR type_id=4 */ /* [7] */ 1441c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 4), 1442c64779e2SAndrii Nakryiko BTF_END_RAW, 1443c64779e2SAndrii Nakryiko }, 1444c64779e2SAndrii Nakryiko .str_sec = "\0A\0m\0B\0n", 1445c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0m\0B\0n"), 1446c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1447c64779e2SAndrii Nakryiko .map_name = "loop_test8_map", 1448c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1449c64779e2SAndrii Nakryiko .value_size = sizeof(void *), 1450c64779e2SAndrii Nakryiko .key_type_id = 1, 1451c64779e2SAndrii Nakryiko .value_type_id = 2, 1452c64779e2SAndrii Nakryiko .max_entries = 4, 1453c64779e2SAndrii Nakryiko .btf_load_err = true, 1454c64779e2SAndrii Nakryiko .err_str = "Loop detected", 1455c64779e2SAndrii Nakryiko }, 1456c64779e2SAndrii Nakryiko 1457c64779e2SAndrii Nakryiko { 1458c64779e2SAndrii Nakryiko .descr = "string section does not end with null", 1459c64779e2SAndrii Nakryiko .raw_types = { 1460c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1461c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1462c64779e2SAndrii Nakryiko BTF_END_RAW, 1463c64779e2SAndrii Nakryiko }, 1464c64779e2SAndrii Nakryiko .str_sec = "\0int", 1465c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int") - 1, 1466c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1467c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1468c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1469c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1470c64779e2SAndrii Nakryiko .key_type_id = 1, 1471c64779e2SAndrii Nakryiko .value_type_id = 1, 1472c64779e2SAndrii Nakryiko .max_entries = 4, 1473c64779e2SAndrii Nakryiko .btf_load_err = true, 1474c64779e2SAndrii Nakryiko .err_str = "Invalid string section", 1475c64779e2SAndrii Nakryiko }, 1476c64779e2SAndrii Nakryiko 1477c64779e2SAndrii Nakryiko { 1478c64779e2SAndrii Nakryiko .descr = "empty string section", 1479c64779e2SAndrii Nakryiko .raw_types = { 1480c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1481c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1482c64779e2SAndrii Nakryiko BTF_END_RAW, 1483c64779e2SAndrii Nakryiko }, 1484c64779e2SAndrii Nakryiko .str_sec = "", 1485c64779e2SAndrii Nakryiko .str_sec_size = 0, 1486c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1487c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1488c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1489c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1490c64779e2SAndrii Nakryiko .key_type_id = 1, 1491c64779e2SAndrii Nakryiko .value_type_id = 1, 1492c64779e2SAndrii Nakryiko .max_entries = 4, 1493c64779e2SAndrii Nakryiko .btf_load_err = true, 1494c64779e2SAndrii Nakryiko .err_str = "Invalid string section", 1495c64779e2SAndrii Nakryiko }, 1496c64779e2SAndrii Nakryiko 1497c64779e2SAndrii Nakryiko { 1498c64779e2SAndrii Nakryiko .descr = "empty type section", 1499c64779e2SAndrii Nakryiko .raw_types = { 1500c64779e2SAndrii Nakryiko BTF_END_RAW, 1501c64779e2SAndrii Nakryiko }, 1502c64779e2SAndrii Nakryiko .str_sec = "\0int", 1503c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1504c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1505c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1506c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1507c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1508c64779e2SAndrii Nakryiko .key_type_id = 1, 1509c64779e2SAndrii Nakryiko .value_type_id = 1, 1510c64779e2SAndrii Nakryiko .max_entries = 4, 1511c64779e2SAndrii Nakryiko .btf_load_err = true, 1512c64779e2SAndrii Nakryiko .err_str = "No type found", 1513c64779e2SAndrii Nakryiko }, 1514c64779e2SAndrii Nakryiko 1515c64779e2SAndrii Nakryiko { 1516c64779e2SAndrii Nakryiko .descr = "btf_header test. Longer hdr_len", 1517c64779e2SAndrii Nakryiko .raw_types = { 1518c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1519c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1520c64779e2SAndrii Nakryiko BTF_END_RAW, 1521c64779e2SAndrii Nakryiko }, 1522c64779e2SAndrii Nakryiko .str_sec = "\0int", 1523c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1524c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1525c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1526c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1527c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1528c64779e2SAndrii Nakryiko .key_type_id = 1, 1529c64779e2SAndrii Nakryiko .value_type_id = 1, 1530c64779e2SAndrii Nakryiko .max_entries = 4, 1531c64779e2SAndrii Nakryiko .btf_load_err = true, 1532c64779e2SAndrii Nakryiko .hdr_len_delta = 4, 1533c64779e2SAndrii Nakryiko .err_str = "Unsupported btf_header", 1534c64779e2SAndrii Nakryiko }, 1535c64779e2SAndrii Nakryiko 1536c64779e2SAndrii Nakryiko { 1537c64779e2SAndrii Nakryiko .descr = "btf_header test. Gap between hdr and type", 1538c64779e2SAndrii Nakryiko .raw_types = { 1539c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1540c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1541c64779e2SAndrii Nakryiko BTF_END_RAW, 1542c64779e2SAndrii Nakryiko }, 1543c64779e2SAndrii Nakryiko .str_sec = "\0int", 1544c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1545c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1546c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1547c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1548c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1549c64779e2SAndrii Nakryiko .key_type_id = 1, 1550c64779e2SAndrii Nakryiko .value_type_id = 1, 1551c64779e2SAndrii Nakryiko .max_entries = 4, 1552c64779e2SAndrii Nakryiko .btf_load_err = true, 1553c64779e2SAndrii Nakryiko .type_off_delta = 4, 1554c64779e2SAndrii Nakryiko .err_str = "Unsupported section found", 1555c64779e2SAndrii Nakryiko }, 1556c64779e2SAndrii Nakryiko 1557c64779e2SAndrii Nakryiko { 1558c64779e2SAndrii Nakryiko .descr = "btf_header test. Gap between type and str", 1559c64779e2SAndrii Nakryiko .raw_types = { 1560c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1561c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1562c64779e2SAndrii Nakryiko BTF_END_RAW, 1563c64779e2SAndrii Nakryiko }, 1564c64779e2SAndrii Nakryiko .str_sec = "\0int", 1565c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1566c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1567c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1568c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1569c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1570c64779e2SAndrii Nakryiko .key_type_id = 1, 1571c64779e2SAndrii Nakryiko .value_type_id = 1, 1572c64779e2SAndrii Nakryiko .max_entries = 4, 1573c64779e2SAndrii Nakryiko .btf_load_err = true, 1574c64779e2SAndrii Nakryiko .str_off_delta = 4, 1575c64779e2SAndrii Nakryiko .err_str = "Unsupported section found", 1576c64779e2SAndrii Nakryiko }, 1577c64779e2SAndrii Nakryiko 1578c64779e2SAndrii Nakryiko { 1579c64779e2SAndrii Nakryiko .descr = "btf_header test. Overlap between type and str", 1580c64779e2SAndrii Nakryiko .raw_types = { 1581c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1582c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1583c64779e2SAndrii Nakryiko BTF_END_RAW, 1584c64779e2SAndrii Nakryiko }, 1585c64779e2SAndrii Nakryiko .str_sec = "\0int", 1586c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1587c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1588c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1589c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1590c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1591c64779e2SAndrii Nakryiko .key_type_id = 1, 1592c64779e2SAndrii Nakryiko .value_type_id = 1, 1593c64779e2SAndrii Nakryiko .max_entries = 4, 1594c64779e2SAndrii Nakryiko .btf_load_err = true, 1595c64779e2SAndrii Nakryiko .str_off_delta = -4, 1596c64779e2SAndrii Nakryiko .err_str = "Section overlap found", 1597c64779e2SAndrii Nakryiko }, 1598c64779e2SAndrii Nakryiko 1599c64779e2SAndrii Nakryiko { 1600c64779e2SAndrii Nakryiko .descr = "btf_header test. Larger BTF size", 1601c64779e2SAndrii Nakryiko .raw_types = { 1602c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1603c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1604c64779e2SAndrii Nakryiko BTF_END_RAW, 1605c64779e2SAndrii Nakryiko }, 1606c64779e2SAndrii Nakryiko .str_sec = "\0int", 1607c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1608c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1609c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1610c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1611c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1612c64779e2SAndrii Nakryiko .key_type_id = 1, 1613c64779e2SAndrii Nakryiko .value_type_id = 1, 1614c64779e2SAndrii Nakryiko .max_entries = 4, 1615c64779e2SAndrii Nakryiko .btf_load_err = true, 1616c64779e2SAndrii Nakryiko .str_len_delta = -4, 1617c64779e2SAndrii Nakryiko .err_str = "Unsupported section found", 1618c64779e2SAndrii Nakryiko }, 1619c64779e2SAndrii Nakryiko 1620c64779e2SAndrii Nakryiko { 1621c64779e2SAndrii Nakryiko .descr = "btf_header test. Smaller BTF size", 1622c64779e2SAndrii Nakryiko .raw_types = { 1623c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1624c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 1625c64779e2SAndrii Nakryiko BTF_END_RAW, 1626c64779e2SAndrii Nakryiko }, 1627c64779e2SAndrii Nakryiko .str_sec = "\0int", 1628c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int"), 1629c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1630c64779e2SAndrii Nakryiko .map_name = "hdr_test_map", 1631c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1632c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1633c64779e2SAndrii Nakryiko .key_type_id = 1, 1634c64779e2SAndrii Nakryiko .value_type_id = 1, 1635c64779e2SAndrii Nakryiko .max_entries = 4, 1636c64779e2SAndrii Nakryiko .btf_load_err = true, 1637c64779e2SAndrii Nakryiko .str_len_delta = 4, 1638c64779e2SAndrii Nakryiko .err_str = "Total section length too long", 1639c64779e2SAndrii Nakryiko }, 1640c64779e2SAndrii Nakryiko 1641c64779e2SAndrii Nakryiko { 1642c64779e2SAndrii Nakryiko .descr = "array test. index_type/elem_type \"int\"", 1643c64779e2SAndrii Nakryiko .raw_types = { 1644c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1645c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1646c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1647c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 16), 1648c64779e2SAndrii Nakryiko BTF_END_RAW, 1649c64779e2SAndrii Nakryiko }, 1650c64779e2SAndrii Nakryiko .str_sec = "", 1651c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1652c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1653c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1654c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1655c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1656c64779e2SAndrii Nakryiko .key_type_id = 1, 1657c64779e2SAndrii Nakryiko .value_type_id = 1, 1658c64779e2SAndrii Nakryiko .max_entries = 4, 1659c64779e2SAndrii Nakryiko }, 1660c64779e2SAndrii Nakryiko 1661c64779e2SAndrii Nakryiko { 1662c64779e2SAndrii Nakryiko .descr = "array test. index_type/elem_type \"const int\"", 1663c64779e2SAndrii Nakryiko .raw_types = { 1664c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1665c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1666c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1667c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 3, 16), 1668c64779e2SAndrii Nakryiko /* CONST type_id=1 */ /* [3] */ 1669c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1), 1670c64779e2SAndrii Nakryiko BTF_END_RAW, 1671c64779e2SAndrii Nakryiko }, 1672c64779e2SAndrii Nakryiko .str_sec = "", 1673c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1674c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1675c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1676c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1677c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1678c64779e2SAndrii Nakryiko .key_type_id = 1, 1679c64779e2SAndrii Nakryiko .value_type_id = 1, 1680c64779e2SAndrii Nakryiko .max_entries = 4, 1681c64779e2SAndrii Nakryiko }, 1682c64779e2SAndrii Nakryiko 1683c64779e2SAndrii Nakryiko { 1684c64779e2SAndrii Nakryiko .descr = "array test. index_type \"const int:31\"", 1685c64779e2SAndrii Nakryiko .raw_types = { 1686c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1687c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1688c64779e2SAndrii Nakryiko /* int:31 */ /* [2] */ 1689c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4), 1690c64779e2SAndrii Nakryiko /* int[16] */ /* [3] */ 1691c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 4, 16), 1692c64779e2SAndrii Nakryiko /* CONST type_id=2 */ /* [4] */ 1693c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2), 1694c64779e2SAndrii Nakryiko BTF_END_RAW, 1695c64779e2SAndrii Nakryiko }, 1696c64779e2SAndrii Nakryiko .str_sec = "", 1697c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1698c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1699c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1700c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1701c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1702c64779e2SAndrii Nakryiko .key_type_id = 1, 1703c64779e2SAndrii Nakryiko .value_type_id = 1, 1704c64779e2SAndrii Nakryiko .max_entries = 4, 1705c64779e2SAndrii Nakryiko .btf_load_err = true, 1706c64779e2SAndrii Nakryiko .err_str = "Invalid index", 1707c64779e2SAndrii Nakryiko }, 1708c64779e2SAndrii Nakryiko 1709c64779e2SAndrii Nakryiko { 1710c64779e2SAndrii Nakryiko .descr = "array test. elem_type \"const int:31\"", 1711c64779e2SAndrii Nakryiko .raw_types = { 1712c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1713c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1714c64779e2SAndrii Nakryiko /* int:31 */ /* [2] */ 1715c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4), 1716c64779e2SAndrii Nakryiko /* int[16] */ /* [3] */ 1717c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(4, 1, 16), 1718c64779e2SAndrii Nakryiko /* CONST type_id=2 */ /* [4] */ 1719c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2), 1720c64779e2SAndrii Nakryiko BTF_END_RAW, 1721c64779e2SAndrii Nakryiko }, 1722c64779e2SAndrii Nakryiko .str_sec = "", 1723c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1724c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1725c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1726c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1727c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1728c64779e2SAndrii Nakryiko .key_type_id = 1, 1729c64779e2SAndrii Nakryiko .value_type_id = 1, 1730c64779e2SAndrii Nakryiko .max_entries = 4, 1731c64779e2SAndrii Nakryiko .btf_load_err = true, 1732c64779e2SAndrii Nakryiko .err_str = "Invalid array of int", 1733c64779e2SAndrii Nakryiko }, 1734c64779e2SAndrii Nakryiko 1735c64779e2SAndrii Nakryiko { 1736c64779e2SAndrii Nakryiko .descr = "array test. index_type \"void\"", 1737c64779e2SAndrii Nakryiko .raw_types = { 1738c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1739c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1740c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1741c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 0, 16), 1742c64779e2SAndrii Nakryiko BTF_END_RAW, 1743c64779e2SAndrii Nakryiko }, 1744c64779e2SAndrii Nakryiko .str_sec = "", 1745c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1746c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1747c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1748c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1749c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1750c64779e2SAndrii Nakryiko .key_type_id = 1, 1751c64779e2SAndrii Nakryiko .value_type_id = 1, 1752c64779e2SAndrii Nakryiko .max_entries = 4, 1753c64779e2SAndrii Nakryiko .btf_load_err = true, 1754c64779e2SAndrii Nakryiko .err_str = "Invalid index", 1755c64779e2SAndrii Nakryiko }, 1756c64779e2SAndrii Nakryiko 1757c64779e2SAndrii Nakryiko { 1758c64779e2SAndrii Nakryiko .descr = "array test. index_type \"const void\"", 1759c64779e2SAndrii Nakryiko .raw_types = { 1760c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1761c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1762c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1763c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 3, 16), 1764c64779e2SAndrii Nakryiko /* CONST type_id=0 (void) */ /* [3] */ 1765c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1766c64779e2SAndrii Nakryiko BTF_END_RAW, 1767c64779e2SAndrii Nakryiko }, 1768c64779e2SAndrii Nakryiko .str_sec = "", 1769c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1770c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1771c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1772c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1773c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1774c64779e2SAndrii Nakryiko .key_type_id = 1, 1775c64779e2SAndrii Nakryiko .value_type_id = 1, 1776c64779e2SAndrii Nakryiko .max_entries = 4, 1777c64779e2SAndrii Nakryiko .btf_load_err = true, 1778c64779e2SAndrii Nakryiko .err_str = "Invalid index", 1779c64779e2SAndrii Nakryiko }, 1780c64779e2SAndrii Nakryiko 1781c64779e2SAndrii Nakryiko { 1782c64779e2SAndrii Nakryiko .descr = "array test. elem_type \"const void\"", 1783c64779e2SAndrii Nakryiko .raw_types = { 1784c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1785c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1786c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1787c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 16), 1788c64779e2SAndrii Nakryiko /* CONST type_id=0 (void) */ /* [3] */ 1789c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0), 1790c64779e2SAndrii Nakryiko BTF_END_RAW, 1791c64779e2SAndrii Nakryiko }, 1792c64779e2SAndrii Nakryiko .str_sec = "", 1793c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1794c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1795c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1796c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1797c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1798c64779e2SAndrii Nakryiko .key_type_id = 1, 1799c64779e2SAndrii Nakryiko .value_type_id = 1, 1800c64779e2SAndrii Nakryiko .max_entries = 4, 1801c64779e2SAndrii Nakryiko .btf_load_err = true, 1802c64779e2SAndrii Nakryiko .err_str = "Invalid elem", 1803c64779e2SAndrii Nakryiko }, 1804c64779e2SAndrii Nakryiko 1805c64779e2SAndrii Nakryiko { 1806c64779e2SAndrii Nakryiko .descr = "array test. elem_type \"const void *\"", 1807c64779e2SAndrii Nakryiko .raw_types = { 1808c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1809c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1810c64779e2SAndrii Nakryiko /* const void *[16] */ /* [2] */ 1811c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 1, 16), 1812c64779e2SAndrii Nakryiko /* CONST type_id=4 */ /* [3] */ 1813c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4), 1814c64779e2SAndrii Nakryiko /* void* */ /* [4] */ 1815c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0), 1816c64779e2SAndrii Nakryiko BTF_END_RAW, 1817c64779e2SAndrii Nakryiko }, 1818c64779e2SAndrii Nakryiko .str_sec = "", 1819c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1820c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1821c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1822c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1823c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1824c64779e2SAndrii Nakryiko .key_type_id = 1, 1825c64779e2SAndrii Nakryiko .value_type_id = 1, 1826c64779e2SAndrii Nakryiko .max_entries = 4, 1827c64779e2SAndrii Nakryiko }, 1828c64779e2SAndrii Nakryiko 1829c64779e2SAndrii Nakryiko { 1830c64779e2SAndrii Nakryiko .descr = "array test. index_type \"const void *\"", 1831c64779e2SAndrii Nakryiko .raw_types = { 1832c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1833c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1834c64779e2SAndrii Nakryiko /* const void *[16] */ /* [2] */ 1835c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(3, 3, 16), 1836c64779e2SAndrii Nakryiko /* CONST type_id=4 */ /* [3] */ 1837c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4), 1838c64779e2SAndrii Nakryiko /* void* */ /* [4] */ 1839c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0), 1840c64779e2SAndrii Nakryiko BTF_END_RAW, 1841c64779e2SAndrii Nakryiko }, 1842c64779e2SAndrii Nakryiko .str_sec = "", 1843c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1844c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1845c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1846c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1847c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1848c64779e2SAndrii Nakryiko .key_type_id = 1, 1849c64779e2SAndrii Nakryiko .value_type_id = 1, 1850c64779e2SAndrii Nakryiko .max_entries = 4, 1851c64779e2SAndrii Nakryiko .btf_load_err = true, 1852c64779e2SAndrii Nakryiko .err_str = "Invalid index", 1853c64779e2SAndrii Nakryiko }, 1854c64779e2SAndrii Nakryiko 1855c64779e2SAndrii Nakryiko { 1856c64779e2SAndrii Nakryiko .descr = "array test. t->size != 0\"", 1857c64779e2SAndrii Nakryiko .raw_types = { 1858c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1859c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1860c64779e2SAndrii Nakryiko /* int[16] */ /* [2] */ 1861c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 1), 1862c64779e2SAndrii Nakryiko BTF_ARRAY_ENC(1, 1, 16), 1863c64779e2SAndrii Nakryiko BTF_END_RAW, 1864c64779e2SAndrii Nakryiko }, 1865c64779e2SAndrii Nakryiko .str_sec = "", 1866c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1867c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1868c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1869c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1870c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1871c64779e2SAndrii Nakryiko .key_type_id = 1, 1872c64779e2SAndrii Nakryiko .value_type_id = 1, 1873c64779e2SAndrii Nakryiko .max_entries = 4, 1874c64779e2SAndrii Nakryiko .btf_load_err = true, 1875c64779e2SAndrii Nakryiko .err_str = "size != 0", 1876c64779e2SAndrii Nakryiko }, 1877c64779e2SAndrii Nakryiko 1878c64779e2SAndrii Nakryiko { 1879c64779e2SAndrii Nakryiko .descr = "int test. invalid int_data", 1880c64779e2SAndrii Nakryiko .raw_types = { 1881c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), 4), 1882c64779e2SAndrii Nakryiko 0x10000000, 1883c64779e2SAndrii Nakryiko BTF_END_RAW, 1884c64779e2SAndrii Nakryiko }, 1885c64779e2SAndrii Nakryiko .str_sec = "", 1886c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1887c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1888c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1889c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1890c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1891c64779e2SAndrii Nakryiko .key_type_id = 1, 1892c64779e2SAndrii Nakryiko .value_type_id = 1, 1893c64779e2SAndrii Nakryiko .max_entries = 4, 1894c64779e2SAndrii Nakryiko .btf_load_err = true, 1895c64779e2SAndrii Nakryiko .err_str = "Invalid int_data", 1896c64779e2SAndrii Nakryiko }, 1897c64779e2SAndrii Nakryiko 1898c64779e2SAndrii Nakryiko { 1899c64779e2SAndrii Nakryiko .descr = "invalid BTF_INFO", 1900c64779e2SAndrii Nakryiko .raw_types = { 1901c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1902c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1903eea154a8SIlya Leoshkevich BTF_TYPE_ENC(0, 0x20000000, 4), 1904c64779e2SAndrii Nakryiko BTF_END_RAW, 1905c64779e2SAndrii Nakryiko }, 1906c64779e2SAndrii Nakryiko .str_sec = "", 1907c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1908c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1909c64779e2SAndrii Nakryiko .map_name = "array_test_map", 1910c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1911c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1912c64779e2SAndrii Nakryiko .key_type_id = 1, 1913c64779e2SAndrii Nakryiko .value_type_id = 1, 1914c64779e2SAndrii Nakryiko .max_entries = 4, 1915c64779e2SAndrii Nakryiko .btf_load_err = true, 1916c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info", 1917c64779e2SAndrii Nakryiko }, 1918c64779e2SAndrii Nakryiko 1919c64779e2SAndrii Nakryiko { 1920c64779e2SAndrii Nakryiko .descr = "fwd test. t->type != 0\"", 1921c64779e2SAndrii Nakryiko .raw_types = { 1922c64779e2SAndrii Nakryiko /* int */ /* [1] */ 1923c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 1924c64779e2SAndrii Nakryiko /* fwd type */ /* [2] */ 1925c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 1), 1926c64779e2SAndrii Nakryiko BTF_END_RAW, 1927c64779e2SAndrii Nakryiko }, 1928c64779e2SAndrii Nakryiko .str_sec = "", 1929c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 1930c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1931c64779e2SAndrii Nakryiko .map_name = "fwd_test_map", 1932c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1933c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1934c64779e2SAndrii Nakryiko .key_type_id = 1, 1935c64779e2SAndrii Nakryiko .value_type_id = 1, 1936c64779e2SAndrii Nakryiko .max_entries = 4, 1937c64779e2SAndrii Nakryiko .btf_load_err = true, 1938c64779e2SAndrii Nakryiko .err_str = "type != 0", 1939c64779e2SAndrii Nakryiko }, 1940c64779e2SAndrii Nakryiko 1941c64779e2SAndrii Nakryiko { 1942c64779e2SAndrii Nakryiko .descr = "typedef (invalid name, name_off = 0)", 1943c64779e2SAndrii Nakryiko .raw_types = { 1944c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1945c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(0, 1), /* [2] */ 1946c64779e2SAndrii Nakryiko BTF_END_RAW, 1947c64779e2SAndrii Nakryiko }, 1948c64779e2SAndrii Nakryiko .str_sec = "\0__int", 1949c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__int"), 1950c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1951c64779e2SAndrii Nakryiko .map_name = "typedef_check_btf", 1952c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1953c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1954c64779e2SAndrii Nakryiko .key_type_id = 1, 1955c64779e2SAndrii Nakryiko .value_type_id = 1, 1956c64779e2SAndrii Nakryiko .max_entries = 4, 1957c64779e2SAndrii Nakryiko .btf_load_err = true, 1958c64779e2SAndrii Nakryiko .err_str = "Invalid name", 1959c64779e2SAndrii Nakryiko }, 1960c64779e2SAndrii Nakryiko 1961c64779e2SAndrii Nakryiko { 1962c64779e2SAndrii Nakryiko .descr = "typedef (invalid name, invalid identifier)", 1963c64779e2SAndrii Nakryiko .raw_types = { 1964c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1965c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [2] */ 1966c64779e2SAndrii Nakryiko BTF_END_RAW, 1967c64779e2SAndrii Nakryiko }, 1968c64779e2SAndrii Nakryiko .str_sec = "\0__!int", 1969c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__!int"), 1970c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1971c64779e2SAndrii Nakryiko .map_name = "typedef_check_btf", 1972c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1973c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1974c64779e2SAndrii Nakryiko .key_type_id = 1, 1975c64779e2SAndrii Nakryiko .value_type_id = 1, 1976c64779e2SAndrii Nakryiko .max_entries = 4, 1977c64779e2SAndrii Nakryiko .btf_load_err = true, 1978c64779e2SAndrii Nakryiko .err_str = "Invalid name", 1979c64779e2SAndrii Nakryiko }, 1980c64779e2SAndrii Nakryiko 1981c64779e2SAndrii Nakryiko { 1982c64779e2SAndrii Nakryiko .descr = "ptr type (invalid name, name_off <> 0)", 1983c64779e2SAndrii Nakryiko .raw_types = { 1984c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 1985c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 1986c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1), /* [2] */ 1987c64779e2SAndrii Nakryiko BTF_END_RAW, 1988c64779e2SAndrii Nakryiko }, 1989c64779e2SAndrii Nakryiko .str_sec = "\0__int", 1990c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__int"), 1991c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 1992c64779e2SAndrii Nakryiko .map_name = "ptr_type_check_btf", 1993c64779e2SAndrii Nakryiko .key_size = sizeof(int), 1994c64779e2SAndrii Nakryiko .value_size = sizeof(int), 1995c64779e2SAndrii Nakryiko .key_type_id = 1, 1996c64779e2SAndrii Nakryiko .value_type_id = 1, 1997c64779e2SAndrii Nakryiko .max_entries = 4, 1998c64779e2SAndrii Nakryiko .btf_load_err = true, 1999c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2000c64779e2SAndrii Nakryiko }, 2001c64779e2SAndrii Nakryiko 2002c64779e2SAndrii Nakryiko { 2003c64779e2SAndrii Nakryiko .descr = "volatile type (invalid name, name_off <> 0)", 2004c64779e2SAndrii Nakryiko .raw_types = { 2005c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2006c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2007c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 1), /* [2] */ 2008c64779e2SAndrii Nakryiko BTF_END_RAW, 2009c64779e2SAndrii Nakryiko }, 2010c64779e2SAndrii Nakryiko .str_sec = "\0__int", 2011c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__int"), 2012c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2013c64779e2SAndrii Nakryiko .map_name = "volatile_type_check_btf", 2014c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2015c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2016c64779e2SAndrii Nakryiko .key_type_id = 1, 2017c64779e2SAndrii Nakryiko .value_type_id = 1, 2018c64779e2SAndrii Nakryiko .max_entries = 4, 2019c64779e2SAndrii Nakryiko .btf_load_err = true, 2020c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2021c64779e2SAndrii Nakryiko }, 2022c64779e2SAndrii Nakryiko 2023c64779e2SAndrii Nakryiko { 2024c64779e2SAndrii Nakryiko .descr = "const type (invalid name, name_off <> 0)", 2025c64779e2SAndrii Nakryiko .raw_types = { 2026c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2027c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2028c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1), /* [2] */ 2029c64779e2SAndrii Nakryiko BTF_END_RAW, 2030c64779e2SAndrii Nakryiko }, 2031c64779e2SAndrii Nakryiko .str_sec = "\0__int", 2032c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__int"), 2033c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2034c64779e2SAndrii Nakryiko .map_name = "const_type_check_btf", 2035c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2036c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2037c64779e2SAndrii Nakryiko .key_type_id = 1, 2038c64779e2SAndrii Nakryiko .value_type_id = 1, 2039c64779e2SAndrii Nakryiko .max_entries = 4, 2040c64779e2SAndrii Nakryiko .btf_load_err = true, 2041c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2042c64779e2SAndrii Nakryiko }, 2043c64779e2SAndrii Nakryiko 2044c64779e2SAndrii Nakryiko { 2045c64779e2SAndrii Nakryiko .descr = "restrict type (invalid name, name_off <> 0)", 2046c64779e2SAndrii Nakryiko .raw_types = { 2047c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2048c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1), /* [2] */ 2049c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2050c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_RESTRICT, 0, 0), 2), /* [3] */ 2051c64779e2SAndrii Nakryiko BTF_END_RAW, 2052c64779e2SAndrii Nakryiko }, 2053c64779e2SAndrii Nakryiko .str_sec = "\0__int", 2054c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__int"), 2055c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2056c64779e2SAndrii Nakryiko .map_name = "restrict_type_check_btf", 2057c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2058c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2059c64779e2SAndrii Nakryiko .key_type_id = 1, 2060c64779e2SAndrii Nakryiko .value_type_id = 1, 2061c64779e2SAndrii Nakryiko .max_entries = 4, 2062c64779e2SAndrii Nakryiko .btf_load_err = true, 2063c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2064c64779e2SAndrii Nakryiko }, 2065c64779e2SAndrii Nakryiko 2066c64779e2SAndrii Nakryiko { 2067c64779e2SAndrii Nakryiko .descr = "fwd type (invalid name, name_off = 0)", 2068c64779e2SAndrii Nakryiko .raw_types = { 2069c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2070c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0), /* [2] */ 2071c64779e2SAndrii Nakryiko BTF_END_RAW, 2072c64779e2SAndrii Nakryiko }, 2073c64779e2SAndrii Nakryiko .str_sec = "\0__skb", 2074c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__skb"), 2075c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2076c64779e2SAndrii Nakryiko .map_name = "fwd_type_check_btf", 2077c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2078c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2079c64779e2SAndrii Nakryiko .key_type_id = 1, 2080c64779e2SAndrii Nakryiko .value_type_id = 1, 2081c64779e2SAndrii Nakryiko .max_entries = 4, 2082c64779e2SAndrii Nakryiko .btf_load_err = true, 2083c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2084c64779e2SAndrii Nakryiko }, 2085c64779e2SAndrii Nakryiko 2086c64779e2SAndrii Nakryiko { 2087c64779e2SAndrii Nakryiko .descr = "fwd type (invalid name, invalid identifier)", 2088c64779e2SAndrii Nakryiko .raw_types = { 2089c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2090c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2091c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0), /* [2] */ 2092c64779e2SAndrii Nakryiko BTF_END_RAW, 2093c64779e2SAndrii Nakryiko }, 2094c64779e2SAndrii Nakryiko .str_sec = "\0__!skb", 2095c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__!skb"), 2096c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2097c64779e2SAndrii Nakryiko .map_name = "fwd_type_check_btf", 2098c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2099c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2100c64779e2SAndrii Nakryiko .key_type_id = 1, 2101c64779e2SAndrii Nakryiko .value_type_id = 1, 2102c64779e2SAndrii Nakryiko .max_entries = 4, 2103c64779e2SAndrii Nakryiko .btf_load_err = true, 2104c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2105c64779e2SAndrii Nakryiko }, 2106c64779e2SAndrii Nakryiko 2107c64779e2SAndrii Nakryiko { 2108c64779e2SAndrii Nakryiko .descr = "array type (invalid name, name_off <> 0)", 2109c64779e2SAndrii Nakryiko .raw_types = { 2110c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2111c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2112c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 0), /* [2] */ 2113c64779e2SAndrii Nakryiko BTF_ARRAY_ENC(1, 1, 4), 2114c64779e2SAndrii Nakryiko BTF_END_RAW, 2115c64779e2SAndrii Nakryiko }, 2116c64779e2SAndrii Nakryiko .str_sec = "\0__skb", 2117c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0__skb"), 2118c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2119c64779e2SAndrii Nakryiko .map_name = "array_type_check_btf", 2120c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2121c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2122c64779e2SAndrii Nakryiko .key_type_id = 1, 2123c64779e2SAndrii Nakryiko .value_type_id = 1, 2124c64779e2SAndrii Nakryiko .max_entries = 4, 2125c64779e2SAndrii Nakryiko .btf_load_err = true, 2126c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2127c64779e2SAndrii Nakryiko }, 2128c64779e2SAndrii Nakryiko 2129c64779e2SAndrii Nakryiko { 2130c64779e2SAndrii Nakryiko .descr = "struct type (name_off = 0)", 2131c64779e2SAndrii Nakryiko .raw_types = { 2132c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2133c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, 2134c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */ 2135c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 2136c64779e2SAndrii Nakryiko BTF_END_RAW, 2137c64779e2SAndrii Nakryiko }, 2138c64779e2SAndrii Nakryiko .str_sec = "\0A", 2139c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A"), 2140c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2141c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 2142c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2143c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2144c64779e2SAndrii Nakryiko .key_type_id = 1, 2145c64779e2SAndrii Nakryiko .value_type_id = 1, 2146c64779e2SAndrii Nakryiko .max_entries = 4, 2147c64779e2SAndrii Nakryiko }, 2148c64779e2SAndrii Nakryiko 2149c64779e2SAndrii Nakryiko { 2150c64779e2SAndrii Nakryiko .descr = "struct type (invalid name, invalid identifier)", 2151c64779e2SAndrii Nakryiko .raw_types = { 2152c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2153c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2154c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */ 2155c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 2156c64779e2SAndrii Nakryiko BTF_END_RAW, 2157c64779e2SAndrii Nakryiko }, 2158c64779e2SAndrii Nakryiko .str_sec = "\0A!\0B", 2159c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A!\0B"), 2160c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2161c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 2162c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2163c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2164c64779e2SAndrii Nakryiko .key_type_id = 1, 2165c64779e2SAndrii Nakryiko .value_type_id = 1, 2166c64779e2SAndrii Nakryiko .max_entries = 4, 2167c64779e2SAndrii Nakryiko .btf_load_err = true, 2168c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2169c64779e2SAndrii Nakryiko }, 2170c64779e2SAndrii Nakryiko 2171c64779e2SAndrii Nakryiko { 2172c64779e2SAndrii Nakryiko .descr = "struct member (name_off = 0)", 2173c64779e2SAndrii Nakryiko .raw_types = { 2174c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2175c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, 2176c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */ 2177c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 2178c64779e2SAndrii Nakryiko BTF_END_RAW, 2179c64779e2SAndrii Nakryiko }, 2180c64779e2SAndrii Nakryiko .str_sec = "\0A", 2181c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A"), 2182c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2183c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 2184c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2185c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2186c64779e2SAndrii Nakryiko .key_type_id = 1, 2187c64779e2SAndrii Nakryiko .value_type_id = 1, 2188c64779e2SAndrii Nakryiko .max_entries = 4, 2189c64779e2SAndrii Nakryiko }, 2190c64779e2SAndrii Nakryiko 2191c64779e2SAndrii Nakryiko { 2192c64779e2SAndrii Nakryiko .descr = "struct member (invalid name, invalid identifier)", 2193c64779e2SAndrii Nakryiko .raw_types = { 2194c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2195c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2196c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), /* [2] */ 2197c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 2198c64779e2SAndrii Nakryiko BTF_END_RAW, 2199c64779e2SAndrii Nakryiko }, 2200c64779e2SAndrii Nakryiko .str_sec = "\0A\0B*", 2201c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0B*"), 2202c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2203c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 2204c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2205c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2206c64779e2SAndrii Nakryiko .key_type_id = 1, 2207c64779e2SAndrii Nakryiko .value_type_id = 1, 2208c64779e2SAndrii Nakryiko .max_entries = 4, 2209c64779e2SAndrii Nakryiko .btf_load_err = true, 2210c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2211c64779e2SAndrii Nakryiko }, 2212c64779e2SAndrii Nakryiko 2213c64779e2SAndrii Nakryiko { 2214c64779e2SAndrii Nakryiko .descr = "enum type (name_off = 0)", 2215c64779e2SAndrii Nakryiko .raw_types = { 2216c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2217c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, 2218c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2219c64779e2SAndrii Nakryiko sizeof(int)), /* [2] */ 2220c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 2221c64779e2SAndrii Nakryiko BTF_END_RAW, 2222c64779e2SAndrii Nakryiko }, 2223c64779e2SAndrii Nakryiko .str_sec = "\0A\0B", 2224c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A\0B"), 2225c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2226c64779e2SAndrii Nakryiko .map_name = "enum_type_check_btf", 2227c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2228c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2229c64779e2SAndrii Nakryiko .key_type_id = 1, 2230c64779e2SAndrii Nakryiko .value_type_id = 1, 2231c64779e2SAndrii Nakryiko .max_entries = 4, 2232c64779e2SAndrii Nakryiko }, 2233c64779e2SAndrii Nakryiko 2234c64779e2SAndrii Nakryiko { 2235c64779e2SAndrii Nakryiko .descr = "enum type (invalid name, invalid identifier)", 2236c64779e2SAndrii Nakryiko .raw_types = { 2237c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2238c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2239c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2240c64779e2SAndrii Nakryiko sizeof(int)), /* [2] */ 2241c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 2242c64779e2SAndrii Nakryiko BTF_END_RAW, 2243c64779e2SAndrii Nakryiko }, 2244c64779e2SAndrii Nakryiko .str_sec = "\0A!\0B", 2245c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A!\0B"), 2246c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2247c64779e2SAndrii Nakryiko .map_name = "enum_type_check_btf", 2248c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2249c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2250c64779e2SAndrii Nakryiko .key_type_id = 1, 2251c64779e2SAndrii Nakryiko .value_type_id = 1, 2252c64779e2SAndrii Nakryiko .max_entries = 4, 2253c64779e2SAndrii Nakryiko .btf_load_err = true, 2254c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2255c64779e2SAndrii Nakryiko }, 2256c64779e2SAndrii Nakryiko 2257c64779e2SAndrii Nakryiko { 2258c64779e2SAndrii Nakryiko .descr = "enum member (invalid name, name_off = 0)", 2259c64779e2SAndrii Nakryiko .raw_types = { 2260c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2261c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, 2262c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2263c64779e2SAndrii Nakryiko sizeof(int)), /* [2] */ 2264c64779e2SAndrii Nakryiko BTF_ENUM_ENC(0, 0), 2265c64779e2SAndrii Nakryiko BTF_END_RAW, 2266c64779e2SAndrii Nakryiko }, 2267c64779e2SAndrii Nakryiko .str_sec = "", 2268c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2269c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2270c64779e2SAndrii Nakryiko .map_name = "enum_type_check_btf", 2271c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2272c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2273c64779e2SAndrii Nakryiko .key_type_id = 1, 2274c64779e2SAndrii Nakryiko .value_type_id = 1, 2275c64779e2SAndrii Nakryiko .max_entries = 4, 2276c64779e2SAndrii Nakryiko .btf_load_err = true, 2277c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2278c64779e2SAndrii Nakryiko }, 2279c64779e2SAndrii Nakryiko 2280c64779e2SAndrii Nakryiko { 2281c64779e2SAndrii Nakryiko .descr = "enum member (invalid name, invalid identifier)", 2282c64779e2SAndrii Nakryiko .raw_types = { 2283c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2284c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, 2285c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2286c64779e2SAndrii Nakryiko sizeof(int)), /* [2] */ 2287c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 2288c64779e2SAndrii Nakryiko BTF_END_RAW, 2289c64779e2SAndrii Nakryiko }, 2290c64779e2SAndrii Nakryiko .str_sec = "\0A!", 2291c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0A!"), 2292c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2293c64779e2SAndrii Nakryiko .map_name = "enum_type_check_btf", 2294c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2295c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2296c64779e2SAndrii Nakryiko .key_type_id = 1, 2297c64779e2SAndrii Nakryiko .value_type_id = 1, 2298c64779e2SAndrii Nakryiko .max_entries = 4, 2299c64779e2SAndrii Nakryiko .btf_load_err = true, 2300c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2301c64779e2SAndrii Nakryiko }, 2302c64779e2SAndrii Nakryiko { 2303c64779e2SAndrii Nakryiko .descr = "arraymap invalid btf key (a bit field)", 2304c64779e2SAndrii Nakryiko .raw_types = { 2305c64779e2SAndrii Nakryiko /* int */ /* [1] */ 2306c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 2307c64779e2SAndrii Nakryiko /* 32 bit int with 32 bit offset */ /* [2] */ 2308c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 32, 32, 8), 2309c64779e2SAndrii Nakryiko BTF_END_RAW, 2310c64779e2SAndrii Nakryiko }, 2311c64779e2SAndrii Nakryiko .str_sec = "", 2312c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2313c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2314c64779e2SAndrii Nakryiko .map_name = "array_map_check_btf", 2315c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2316c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2317c64779e2SAndrii Nakryiko .key_type_id = 2, 2318c64779e2SAndrii Nakryiko .value_type_id = 1, 2319c64779e2SAndrii Nakryiko .max_entries = 4, 2320c64779e2SAndrii Nakryiko .map_create_err = true, 2321c64779e2SAndrii Nakryiko }, 2322c64779e2SAndrii Nakryiko 2323c64779e2SAndrii Nakryiko { 2324c64779e2SAndrii Nakryiko .descr = "arraymap invalid btf key (!= 32 bits)", 2325c64779e2SAndrii Nakryiko .raw_types = { 2326c64779e2SAndrii Nakryiko /* int */ /* [1] */ 2327c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 2328c64779e2SAndrii Nakryiko /* 16 bit int with 0 bit offset */ /* [2] */ 2329c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 16, 2), 2330c64779e2SAndrii Nakryiko BTF_END_RAW, 2331c64779e2SAndrii Nakryiko }, 2332c64779e2SAndrii Nakryiko .str_sec = "", 2333c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2334c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2335c64779e2SAndrii Nakryiko .map_name = "array_map_check_btf", 2336c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2337c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2338c64779e2SAndrii Nakryiko .key_type_id = 2, 2339c64779e2SAndrii Nakryiko .value_type_id = 1, 2340c64779e2SAndrii Nakryiko .max_entries = 4, 2341c64779e2SAndrii Nakryiko .map_create_err = true, 2342c64779e2SAndrii Nakryiko }, 2343c64779e2SAndrii Nakryiko 2344c64779e2SAndrii Nakryiko { 2345c64779e2SAndrii Nakryiko .descr = "arraymap invalid btf value (too small)", 2346c64779e2SAndrii Nakryiko .raw_types = { 2347c64779e2SAndrii Nakryiko /* int */ /* [1] */ 2348c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 2349c64779e2SAndrii Nakryiko BTF_END_RAW, 2350c64779e2SAndrii Nakryiko }, 2351c64779e2SAndrii Nakryiko .str_sec = "", 2352c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2353c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2354c64779e2SAndrii Nakryiko .map_name = "array_map_check_btf", 2355c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2356c64779e2SAndrii Nakryiko /* btf_value_size < map->value_size */ 2357c64779e2SAndrii Nakryiko .value_size = sizeof(__u64), 2358c64779e2SAndrii Nakryiko .key_type_id = 1, 2359c64779e2SAndrii Nakryiko .value_type_id = 1, 2360c64779e2SAndrii Nakryiko .max_entries = 4, 2361c64779e2SAndrii Nakryiko .map_create_err = true, 2362c64779e2SAndrii Nakryiko }, 2363c64779e2SAndrii Nakryiko 2364c64779e2SAndrii Nakryiko { 2365c64779e2SAndrii Nakryiko .descr = "arraymap invalid btf value (too big)", 2366c64779e2SAndrii Nakryiko .raw_types = { 2367c64779e2SAndrii Nakryiko /* int */ /* [1] */ 2368c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 2369c64779e2SAndrii Nakryiko BTF_END_RAW, 2370c64779e2SAndrii Nakryiko }, 2371c64779e2SAndrii Nakryiko .str_sec = "", 2372c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2373c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2374c64779e2SAndrii Nakryiko .map_name = "array_map_check_btf", 2375c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2376c64779e2SAndrii Nakryiko /* btf_value_size > map->value_size */ 2377c64779e2SAndrii Nakryiko .value_size = sizeof(__u16), 2378c64779e2SAndrii Nakryiko .key_type_id = 1, 2379c64779e2SAndrii Nakryiko .value_type_id = 1, 2380c64779e2SAndrii Nakryiko .max_entries = 4, 2381c64779e2SAndrii Nakryiko .map_create_err = true, 2382c64779e2SAndrii Nakryiko }, 2383c64779e2SAndrii Nakryiko 2384c64779e2SAndrii Nakryiko { 2385c64779e2SAndrii Nakryiko .descr = "func proto (int (*)(int, unsigned int))", 2386c64779e2SAndrii Nakryiko .raw_types = { 2387c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2388c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2389c64779e2SAndrii Nakryiko /* int (*)(int, unsigned int) */ 2390c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 2391c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2392c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2393c64779e2SAndrii Nakryiko BTF_END_RAW, 2394c64779e2SAndrii Nakryiko }, 2395c64779e2SAndrii Nakryiko .str_sec = "", 2396c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2397c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2398c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2399c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2400c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2401c64779e2SAndrii Nakryiko .key_type_id = 1, 2402c64779e2SAndrii Nakryiko .value_type_id = 1, 2403c64779e2SAndrii Nakryiko .max_entries = 4, 2404c64779e2SAndrii Nakryiko }, 2405c64779e2SAndrii Nakryiko 2406c64779e2SAndrii Nakryiko { 2407c64779e2SAndrii Nakryiko .descr = "func proto (vararg)", 2408c64779e2SAndrii Nakryiko .raw_types = { 2409c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2410c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2411c64779e2SAndrii Nakryiko /* void (*)(int, unsigned int, ...) */ 2412c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 3), /* [3] */ 2413c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2414c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2415c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 0), 2416c64779e2SAndrii Nakryiko BTF_END_RAW, 2417c64779e2SAndrii Nakryiko }, 2418c64779e2SAndrii Nakryiko .str_sec = "", 2419c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2420c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2421c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2422c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2423c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2424c64779e2SAndrii Nakryiko .key_type_id = 1, 2425c64779e2SAndrii Nakryiko .value_type_id = 1, 2426c64779e2SAndrii Nakryiko .max_entries = 4, 2427c64779e2SAndrii Nakryiko }, 2428c64779e2SAndrii Nakryiko 2429c64779e2SAndrii Nakryiko { 2430c64779e2SAndrii Nakryiko .descr = "func proto (vararg with name)", 2431c64779e2SAndrii Nakryiko .raw_types = { 2432c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2433c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2434c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int b, ... c) */ 2435c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 3), /* [3] */ 2436c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2437c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2438c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 0), 2439c64779e2SAndrii Nakryiko BTF_END_RAW, 2440c64779e2SAndrii Nakryiko }, 2441c64779e2SAndrii Nakryiko .str_sec = "\0a\0b\0c", 2442c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b\0c"), 2443c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2444c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2445c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2446c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2447c64779e2SAndrii Nakryiko .key_type_id = 1, 2448c64779e2SAndrii Nakryiko .value_type_id = 1, 2449c64779e2SAndrii Nakryiko .max_entries = 4, 2450c64779e2SAndrii Nakryiko .btf_load_err = true, 2451c64779e2SAndrii Nakryiko .err_str = "Invalid arg#3", 2452c64779e2SAndrii Nakryiko }, 2453c64779e2SAndrii Nakryiko 2454c64779e2SAndrii Nakryiko { 2455c64779e2SAndrii Nakryiko .descr = "func proto (arg after vararg)", 2456c64779e2SAndrii Nakryiko .raw_types = { 2457c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2458c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2459c64779e2SAndrii Nakryiko /* void (*)(int a, ..., unsigned int b) */ 2460c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 3), /* [3] */ 2461c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2462c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 0), 2463c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2464c64779e2SAndrii Nakryiko BTF_END_RAW, 2465c64779e2SAndrii Nakryiko }, 2466c64779e2SAndrii Nakryiko .str_sec = "\0a\0b", 2467c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b"), 2468c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2469c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2470c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2471c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2472c64779e2SAndrii Nakryiko .key_type_id = 1, 2473c64779e2SAndrii Nakryiko .value_type_id = 1, 2474c64779e2SAndrii Nakryiko .max_entries = 4, 2475c64779e2SAndrii Nakryiko .btf_load_err = true, 2476c64779e2SAndrii Nakryiko .err_str = "Invalid arg#2", 2477c64779e2SAndrii Nakryiko }, 2478c64779e2SAndrii Nakryiko 2479c64779e2SAndrii Nakryiko { 2480c64779e2SAndrii Nakryiko .descr = "func proto (CONST=>TYPEDEF=>PTR=>FUNC_PROTO)", 2481c64779e2SAndrii Nakryiko .raw_types = { 2482c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2483c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2484c64779e2SAndrii Nakryiko /* typedef void (*func_ptr)(int, unsigned int) */ 2485c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), /* [3] */ 2486c64779e2SAndrii Nakryiko /* const func_ptr */ 2487c64779e2SAndrii Nakryiko BTF_CONST_ENC(3), /* [4] */ 2488c64779e2SAndrii Nakryiko BTF_PTR_ENC(6), /* [5] */ 2489c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [6] */ 2490c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2491c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2492c64779e2SAndrii Nakryiko BTF_END_RAW, 2493c64779e2SAndrii Nakryiko }, 2494c64779e2SAndrii Nakryiko .str_sec = "\0func_ptr", 2495c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0func_ptr"), 2496c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2497c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2498c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2499c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2500c64779e2SAndrii Nakryiko .key_type_id = 1, 2501c64779e2SAndrii Nakryiko .value_type_id = 1, 2502c64779e2SAndrii Nakryiko .max_entries = 4, 2503c64779e2SAndrii Nakryiko }, 2504c64779e2SAndrii Nakryiko 2505c64779e2SAndrii Nakryiko { 2506c64779e2SAndrii Nakryiko .descr = "func proto (TYPEDEF=>FUNC_PROTO)", 2507c64779e2SAndrii Nakryiko .raw_types = { 2508c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2509c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2510c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 2511c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [4] */ 2512c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2513c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2514c64779e2SAndrii Nakryiko BTF_END_RAW, 2515c64779e2SAndrii Nakryiko }, 2516c64779e2SAndrii Nakryiko .str_sec = "\0func_typedef", 2517c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0func_typedef"), 2518c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2519c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2520c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2521c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2522c64779e2SAndrii Nakryiko .key_type_id = 1, 2523c64779e2SAndrii Nakryiko .value_type_id = 1, 2524c64779e2SAndrii Nakryiko .max_entries = 4, 2525c64779e2SAndrii Nakryiko }, 2526c64779e2SAndrii Nakryiko 2527c64779e2SAndrii Nakryiko { 2528c64779e2SAndrii Nakryiko .descr = "func proto (btf_resolve(arg))", 2529c64779e2SAndrii Nakryiko .raw_types = { 2530c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2531c64779e2SAndrii Nakryiko /* void (*)(const void *) */ 2532c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 1), /* [2] */ 2533c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 3), 2534c64779e2SAndrii Nakryiko BTF_CONST_ENC(4), /* [3] */ 2535c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [4] */ 2536c64779e2SAndrii Nakryiko BTF_END_RAW, 2537c64779e2SAndrii Nakryiko }, 2538c64779e2SAndrii Nakryiko .str_sec = "", 2539c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2540c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2541c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2542c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2543c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2544c64779e2SAndrii Nakryiko .key_type_id = 1, 2545c64779e2SAndrii Nakryiko .value_type_id = 1, 2546c64779e2SAndrii Nakryiko .max_entries = 4, 2547c64779e2SAndrii Nakryiko }, 2548c64779e2SAndrii Nakryiko 2549c64779e2SAndrii Nakryiko { 2550c64779e2SAndrii Nakryiko .descr = "func proto (Not all arg has name)", 2551c64779e2SAndrii Nakryiko .raw_types = { 2552c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2553c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2554c64779e2SAndrii Nakryiko /* void (*)(int, unsigned int b) */ 2555c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2556c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2557c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2558c64779e2SAndrii Nakryiko BTF_END_RAW, 2559c64779e2SAndrii Nakryiko }, 2560c64779e2SAndrii Nakryiko .str_sec = "\0b", 2561c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0b"), 2562c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2563c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2564c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2565c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2566c64779e2SAndrii Nakryiko .key_type_id = 1, 2567c64779e2SAndrii Nakryiko .value_type_id = 1, 2568c64779e2SAndrii Nakryiko .max_entries = 4, 2569c64779e2SAndrii Nakryiko }, 2570c64779e2SAndrii Nakryiko 2571c64779e2SAndrii Nakryiko { 2572c64779e2SAndrii Nakryiko .descr = "func proto (Bad arg name_off)", 2573c64779e2SAndrii Nakryiko .raw_types = { 2574c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2575c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2576c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int <bad_name_off>) */ 2577c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2578c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2579c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0x0fffffff, 2), 2580c64779e2SAndrii Nakryiko BTF_END_RAW, 2581c64779e2SAndrii Nakryiko }, 2582c64779e2SAndrii Nakryiko .str_sec = "\0a", 2583c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a"), 2584c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2585c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2586c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2587c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2588c64779e2SAndrii Nakryiko .key_type_id = 1, 2589c64779e2SAndrii Nakryiko .value_type_id = 1, 2590c64779e2SAndrii Nakryiko .max_entries = 4, 2591c64779e2SAndrii Nakryiko .btf_load_err = true, 2592c64779e2SAndrii Nakryiko .err_str = "Invalid arg#2", 2593c64779e2SAndrii Nakryiko }, 2594c64779e2SAndrii Nakryiko 2595c64779e2SAndrii Nakryiko { 2596c64779e2SAndrii Nakryiko .descr = "func proto (Bad arg name)", 2597c64779e2SAndrii Nakryiko .raw_types = { 2598c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2599c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2600c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int !!!) */ 2601c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2602c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2603c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2604c64779e2SAndrii Nakryiko BTF_END_RAW, 2605c64779e2SAndrii Nakryiko }, 2606c64779e2SAndrii Nakryiko .str_sec = "\0a\0!!!", 2607c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0!!!"), 2608c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2609c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2610c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2611c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2612c64779e2SAndrii Nakryiko .key_type_id = 1, 2613c64779e2SAndrii Nakryiko .value_type_id = 1, 2614c64779e2SAndrii Nakryiko .max_entries = 4, 2615c64779e2SAndrii Nakryiko .btf_load_err = true, 2616c64779e2SAndrii Nakryiko .err_str = "Invalid arg#2", 2617c64779e2SAndrii Nakryiko }, 2618c64779e2SAndrii Nakryiko 2619c64779e2SAndrii Nakryiko { 2620c64779e2SAndrii Nakryiko .descr = "func proto (Invalid return type)", 2621c64779e2SAndrii Nakryiko .raw_types = { 2622c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2623c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2624c64779e2SAndrii Nakryiko /* <bad_ret_type> (*)(int, unsigned int) */ 2625c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(100, 2), /* [3] */ 2626c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2627c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2628c64779e2SAndrii Nakryiko BTF_END_RAW, 2629c64779e2SAndrii Nakryiko }, 2630c64779e2SAndrii Nakryiko .str_sec = "", 2631c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2632c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2633c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2634c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2635c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2636c64779e2SAndrii Nakryiko .key_type_id = 1, 2637c64779e2SAndrii Nakryiko .value_type_id = 1, 2638c64779e2SAndrii Nakryiko .max_entries = 4, 2639c64779e2SAndrii Nakryiko .btf_load_err = true, 2640c64779e2SAndrii Nakryiko .err_str = "Invalid return type", 2641c64779e2SAndrii Nakryiko }, 2642c64779e2SAndrii Nakryiko 2643c64779e2SAndrii Nakryiko { 2644c64779e2SAndrii Nakryiko .descr = "func proto (with func name)", 2645c64779e2SAndrii Nakryiko .raw_types = { 2646c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2647c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2648c64779e2SAndrii Nakryiko /* void func_proto(int, unsigned int) */ 2649c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 2), 0), /* [3] */ 2650c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 1), 2651c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2652c64779e2SAndrii Nakryiko BTF_END_RAW, 2653c64779e2SAndrii Nakryiko }, 2654c64779e2SAndrii Nakryiko .str_sec = "\0func_proto", 2655c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0func_proto"), 2656c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2657c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2658c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2659c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2660c64779e2SAndrii Nakryiko .key_type_id = 1, 2661c64779e2SAndrii Nakryiko .value_type_id = 1, 2662c64779e2SAndrii Nakryiko .max_entries = 4, 2663c64779e2SAndrii Nakryiko .btf_load_err = true, 2664c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2665c64779e2SAndrii Nakryiko }, 2666c64779e2SAndrii Nakryiko 2667c64779e2SAndrii Nakryiko { 2668c64779e2SAndrii Nakryiko .descr = "func proto (const void arg)", 2669c64779e2SAndrii Nakryiko .raw_types = { 2670c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2671c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2672c64779e2SAndrii Nakryiko /* void (*)(const void) */ 2673c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 1), /* [3] */ 2674c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 4), 2675c64779e2SAndrii Nakryiko BTF_CONST_ENC(0), /* [4] */ 2676c64779e2SAndrii Nakryiko BTF_END_RAW, 2677c64779e2SAndrii Nakryiko }, 2678c64779e2SAndrii Nakryiko .str_sec = "", 2679c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 2680c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2681c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 2682c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2683c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2684c64779e2SAndrii Nakryiko .key_type_id = 1, 2685c64779e2SAndrii Nakryiko .value_type_id = 1, 2686c64779e2SAndrii Nakryiko .max_entries = 4, 2687c64779e2SAndrii Nakryiko .btf_load_err = true, 2688c64779e2SAndrii Nakryiko .err_str = "Invalid arg#1", 2689c64779e2SAndrii Nakryiko }, 2690c64779e2SAndrii Nakryiko 2691c64779e2SAndrii Nakryiko { 2692c64779e2SAndrii Nakryiko .descr = "func (void func(int a, unsigned int b))", 2693c64779e2SAndrii Nakryiko .raw_types = { 2694c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2695c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2696c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int b) */ 2697c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2698c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2699c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2700c64779e2SAndrii Nakryiko /* void func(int a, unsigned int b) */ 2701c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */ 2702c64779e2SAndrii Nakryiko BTF_END_RAW, 2703c64779e2SAndrii Nakryiko }, 2704c64779e2SAndrii Nakryiko .str_sec = "\0a\0b\0func", 2705c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b\0func"), 2706c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2707c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2708c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2709c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2710c64779e2SAndrii Nakryiko .key_type_id = 1, 2711c64779e2SAndrii Nakryiko .value_type_id = 1, 2712c64779e2SAndrii Nakryiko .max_entries = 4, 2713c64779e2SAndrii Nakryiko }, 2714c64779e2SAndrii Nakryiko 2715c64779e2SAndrii Nakryiko { 2716c64779e2SAndrii Nakryiko .descr = "func (No func name)", 2717c64779e2SAndrii Nakryiko .raw_types = { 2718c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2719c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2720c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int b) */ 2721c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2722c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2723c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2724c64779e2SAndrii Nakryiko /* void <no_name>(int a, unsigned int b) */ 2725c64779e2SAndrii Nakryiko BTF_FUNC_ENC(0, 3), /* [4] */ 2726c64779e2SAndrii Nakryiko BTF_END_RAW, 2727c64779e2SAndrii Nakryiko }, 2728c64779e2SAndrii Nakryiko .str_sec = "\0a\0b", 2729c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b"), 2730c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2731c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2732c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2733c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2734c64779e2SAndrii Nakryiko .key_type_id = 1, 2735c64779e2SAndrii Nakryiko .value_type_id = 1, 2736c64779e2SAndrii Nakryiko .max_entries = 4, 2737c64779e2SAndrii Nakryiko .btf_load_err = true, 2738c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2739c64779e2SAndrii Nakryiko }, 2740c64779e2SAndrii Nakryiko 2741c64779e2SAndrii Nakryiko { 2742c64779e2SAndrii Nakryiko .descr = "func (Invalid func name)", 2743c64779e2SAndrii Nakryiko .raw_types = { 2744c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2745c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2746c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int b) */ 2747c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2748c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2749c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2750c64779e2SAndrii Nakryiko /* void !!!(int a, unsigned int b) */ 2751c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */ 2752c64779e2SAndrii Nakryiko BTF_END_RAW, 2753c64779e2SAndrii Nakryiko }, 2754c64779e2SAndrii Nakryiko .str_sec = "\0a\0b\0!!!", 2755c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b\0!!!"), 2756c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2757c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2758c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2759c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2760c64779e2SAndrii Nakryiko .key_type_id = 1, 2761c64779e2SAndrii Nakryiko .value_type_id = 1, 2762c64779e2SAndrii Nakryiko .max_entries = 4, 2763c64779e2SAndrii Nakryiko .btf_load_err = true, 2764c64779e2SAndrii Nakryiko .err_str = "Invalid name", 2765c64779e2SAndrii Nakryiko }, 2766c64779e2SAndrii Nakryiko 2767c64779e2SAndrii Nakryiko { 2768c64779e2SAndrii Nakryiko .descr = "func (Some arg has no name)", 2769c64779e2SAndrii Nakryiko .raw_types = { 2770c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2771c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2772c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int) */ 2773c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2774c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2775c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(0, 2), 2776c64779e2SAndrii Nakryiko /* void func(int a, unsigned int) */ 2777c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [4] */ 2778c64779e2SAndrii Nakryiko BTF_END_RAW, 2779c64779e2SAndrii Nakryiko }, 2780c64779e2SAndrii Nakryiko .str_sec = "\0a\0func", 2781c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0func"), 2782c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2783c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2784c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2785c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2786c64779e2SAndrii Nakryiko .key_type_id = 1, 2787c64779e2SAndrii Nakryiko .value_type_id = 1, 2788c64779e2SAndrii Nakryiko .max_entries = 4, 2789c64779e2SAndrii Nakryiko .btf_load_err = true, 2790c64779e2SAndrii Nakryiko .err_str = "Invalid arg#2", 2791c64779e2SAndrii Nakryiko }, 2792c64779e2SAndrii Nakryiko 2793c64779e2SAndrii Nakryiko { 2794c64779e2SAndrii Nakryiko .descr = "func (Non zero vlen)", 2795c64779e2SAndrii Nakryiko .raw_types = { 2796c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2797c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [2] */ 2798c64779e2SAndrii Nakryiko /* void (*)(int a, unsigned int b) */ 2799c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 2800c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 2801c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 2802c64779e2SAndrii Nakryiko /* void func(int a, unsigned int b) */ 2803c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 2), 3), /* [4] */ 2804c64779e2SAndrii Nakryiko BTF_END_RAW, 2805c64779e2SAndrii Nakryiko }, 2806c64779e2SAndrii Nakryiko .str_sec = "\0a\0b\0func", 2807c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0a\0b\0func"), 2808c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2809c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2810c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2811c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2812c64779e2SAndrii Nakryiko .key_type_id = 1, 2813c64779e2SAndrii Nakryiko .value_type_id = 1, 2814c64779e2SAndrii Nakryiko .max_entries = 4, 2815c64779e2SAndrii Nakryiko .btf_load_err = true, 2816c64779e2SAndrii Nakryiko .err_str = "Invalid func linkage", 2817c64779e2SAndrii Nakryiko }, 2818c64779e2SAndrii Nakryiko 2819c64779e2SAndrii Nakryiko { 2820c64779e2SAndrii Nakryiko .descr = "func (Not referring to FUNC_PROTO)", 2821c64779e2SAndrii Nakryiko .raw_types = { 2822c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2823c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 1), /* [2] */ 2824c64779e2SAndrii Nakryiko BTF_END_RAW, 2825c64779e2SAndrii Nakryiko }, 2826c64779e2SAndrii Nakryiko .str_sec = "\0func", 2827c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0func"), 2828c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2829c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 2830c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2831c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2832c64779e2SAndrii Nakryiko .key_type_id = 1, 2833c64779e2SAndrii Nakryiko .value_type_id = 1, 2834c64779e2SAndrii Nakryiko .max_entries = 4, 2835c64779e2SAndrii Nakryiko .btf_load_err = true, 2836c64779e2SAndrii Nakryiko .err_str = "Invalid type_id", 2837c64779e2SAndrii Nakryiko }, 2838c64779e2SAndrii Nakryiko 2839c64779e2SAndrii Nakryiko { 2840c64779e2SAndrii Nakryiko .descr = "invalid int kind_flag", 2841c64779e2SAndrii Nakryiko .raw_types = { 2842c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2843c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 1, 0), 4), /* [2] */ 2844c64779e2SAndrii Nakryiko BTF_INT_ENC(0, 0, 32), 2845c64779e2SAndrii Nakryiko BTF_END_RAW, 2846c64779e2SAndrii Nakryiko }, 2847c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2848c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2849c64779e2SAndrii Nakryiko .map_name = "int_type_check_btf", 2850c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2851c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2852c64779e2SAndrii Nakryiko .key_type_id = 1, 2853c64779e2SAndrii Nakryiko .value_type_id = 1, 2854c64779e2SAndrii Nakryiko .max_entries = 4, 2855c64779e2SAndrii Nakryiko .btf_load_err = true, 2856c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2857c64779e2SAndrii Nakryiko }, 2858c64779e2SAndrii Nakryiko 2859c64779e2SAndrii Nakryiko { 2860c64779e2SAndrii Nakryiko .descr = "invalid ptr kind_flag", 2861c64779e2SAndrii Nakryiko .raw_types = { 2862c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2863c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 1, 0), 1), /* [2] */ 2864c64779e2SAndrii Nakryiko BTF_END_RAW, 2865c64779e2SAndrii Nakryiko }, 2866c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2867c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2868c64779e2SAndrii Nakryiko .map_name = "ptr_type_check_btf", 2869c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2870c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2871c64779e2SAndrii Nakryiko .key_type_id = 1, 2872c64779e2SAndrii Nakryiko .value_type_id = 1, 2873c64779e2SAndrii Nakryiko .max_entries = 4, 2874c64779e2SAndrii Nakryiko .btf_load_err = true, 2875c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2876c64779e2SAndrii Nakryiko }, 2877c64779e2SAndrii Nakryiko 2878c64779e2SAndrii Nakryiko { 2879c64779e2SAndrii Nakryiko .descr = "invalid array kind_flag", 2880c64779e2SAndrii Nakryiko .raw_types = { 2881c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2882c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 1, 0), 0), /* [2] */ 2883c64779e2SAndrii Nakryiko BTF_ARRAY_ENC(1, 1, 1), 2884c64779e2SAndrii Nakryiko BTF_END_RAW, 2885c64779e2SAndrii Nakryiko }, 2886c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2887c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2888c64779e2SAndrii Nakryiko .map_name = "array_type_check_btf", 2889c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2890c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2891c64779e2SAndrii Nakryiko .key_type_id = 1, 2892c64779e2SAndrii Nakryiko .value_type_id = 1, 2893c64779e2SAndrii Nakryiko .max_entries = 4, 2894c64779e2SAndrii Nakryiko .btf_load_err = true, 2895c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2896c64779e2SAndrii Nakryiko }, 2897c64779e2SAndrii Nakryiko 2898c64779e2SAndrii Nakryiko { 2899c64779e2SAndrii Nakryiko .descr = "valid fwd kind_flag", 2900c64779e2SAndrii Nakryiko .raw_types = { 2901c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2902c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2903c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [2] */ 2904c64779e2SAndrii Nakryiko BTF_END_RAW, 2905c64779e2SAndrii Nakryiko }, 2906c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 2907c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2908c64779e2SAndrii Nakryiko .map_name = "fwd_type_check_btf", 2909c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2910c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2911c64779e2SAndrii Nakryiko .key_type_id = 1, 2912c64779e2SAndrii Nakryiko .value_type_id = 1, 2913c64779e2SAndrii Nakryiko .max_entries = 4, 2914c64779e2SAndrii Nakryiko }, 2915c64779e2SAndrii Nakryiko 2916c64779e2SAndrii Nakryiko { 2917c64779e2SAndrii Nakryiko .descr = "invalid typedef kind_flag", 2918c64779e2SAndrii Nakryiko .raw_types = { 2919c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2920c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, 2921c64779e2SAndrii Nakryiko BTF_INFO_ENC(BTF_KIND_TYPEDEF, 1, 0), 1), /* [2] */ 2922c64779e2SAndrii Nakryiko BTF_END_RAW, 2923c64779e2SAndrii Nakryiko }, 2924c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 2925c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2926c64779e2SAndrii Nakryiko .map_name = "typedef_type_check_btf", 2927c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2928c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2929c64779e2SAndrii Nakryiko .key_type_id = 1, 2930c64779e2SAndrii Nakryiko .value_type_id = 1, 2931c64779e2SAndrii Nakryiko .max_entries = 4, 2932c64779e2SAndrii Nakryiko .btf_load_err = true, 2933c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2934c64779e2SAndrii Nakryiko }, 2935c64779e2SAndrii Nakryiko 2936c64779e2SAndrii Nakryiko { 2937c64779e2SAndrii Nakryiko .descr = "invalid volatile kind_flag", 2938c64779e2SAndrii Nakryiko .raw_types = { 2939c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2940c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 1, 0), 1), /* [2] */ 2941c64779e2SAndrii Nakryiko BTF_END_RAW, 2942c64779e2SAndrii Nakryiko }, 2943c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2944c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2945c64779e2SAndrii Nakryiko .map_name = "volatile_type_check_btf", 2946c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2947c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2948c64779e2SAndrii Nakryiko .key_type_id = 1, 2949c64779e2SAndrii Nakryiko .value_type_id = 1, 2950c64779e2SAndrii Nakryiko .max_entries = 4, 2951c64779e2SAndrii Nakryiko .btf_load_err = true, 2952c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2953c64779e2SAndrii Nakryiko }, 2954c64779e2SAndrii Nakryiko 2955c64779e2SAndrii Nakryiko { 2956c64779e2SAndrii Nakryiko .descr = "invalid const kind_flag", 2957c64779e2SAndrii Nakryiko .raw_types = { 2958c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2959c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 1, 0), 1), /* [2] */ 2960c64779e2SAndrii Nakryiko BTF_END_RAW, 2961c64779e2SAndrii Nakryiko }, 2962c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2963c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2964c64779e2SAndrii Nakryiko .map_name = "const_type_check_btf", 2965c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2966c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2967c64779e2SAndrii Nakryiko .key_type_id = 1, 2968c64779e2SAndrii Nakryiko .value_type_id = 1, 2969c64779e2SAndrii Nakryiko .max_entries = 4, 2970c64779e2SAndrii Nakryiko .btf_load_err = true, 2971c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2972c64779e2SAndrii Nakryiko }, 2973c64779e2SAndrii Nakryiko 2974c64779e2SAndrii Nakryiko { 2975c64779e2SAndrii Nakryiko .descr = "invalid restrict kind_flag", 2976c64779e2SAndrii Nakryiko .raw_types = { 2977c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2978c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_RESTRICT, 1, 0), 1), /* [2] */ 2979c64779e2SAndrii Nakryiko BTF_END_RAW, 2980c64779e2SAndrii Nakryiko }, 2981c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 2982c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 2983c64779e2SAndrii Nakryiko .map_name = "restrict_type_check_btf", 2984c64779e2SAndrii Nakryiko .key_size = sizeof(int), 2985c64779e2SAndrii Nakryiko .value_size = sizeof(int), 2986c64779e2SAndrii Nakryiko .key_type_id = 1, 2987c64779e2SAndrii Nakryiko .value_type_id = 1, 2988c64779e2SAndrii Nakryiko .max_entries = 4, 2989c64779e2SAndrii Nakryiko .btf_load_err = true, 2990c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 2991c64779e2SAndrii Nakryiko }, 2992c64779e2SAndrii Nakryiko 2993c64779e2SAndrii Nakryiko { 2994c64779e2SAndrii Nakryiko .descr = "invalid func kind_flag", 2995c64779e2SAndrii Nakryiko .raw_types = { 2996c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 2997c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 0), 0), /* [2] */ 2998c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 1, 0), 2), /* [3] */ 2999c64779e2SAndrii Nakryiko BTF_END_RAW, 3000c64779e2SAndrii Nakryiko }, 3001c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3002c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3003c64779e2SAndrii Nakryiko .map_name = "func_type_check_btf", 3004c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3005c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3006c64779e2SAndrii Nakryiko .key_type_id = 1, 3007c64779e2SAndrii Nakryiko .value_type_id = 1, 3008c64779e2SAndrii Nakryiko .max_entries = 4, 3009c64779e2SAndrii Nakryiko .btf_load_err = true, 3010c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 3011c64779e2SAndrii Nakryiko }, 3012c64779e2SAndrii Nakryiko 3013c64779e2SAndrii Nakryiko { 3014c64779e2SAndrii Nakryiko .descr = "invalid func_proto kind_flag", 3015c64779e2SAndrii Nakryiko .raw_types = { 3016c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3017c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 1, 0), 0), /* [2] */ 3018c64779e2SAndrii Nakryiko BTF_END_RAW, 3019c64779e2SAndrii Nakryiko }, 3020c64779e2SAndrii Nakryiko BTF_STR_SEC(""), 3021c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3022c64779e2SAndrii Nakryiko .map_name = "func_proto_type_check_btf", 3023c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3024c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3025c64779e2SAndrii Nakryiko .key_type_id = 1, 3026c64779e2SAndrii Nakryiko .value_type_id = 1, 3027c64779e2SAndrii Nakryiko .max_entries = 4, 3028c64779e2SAndrii Nakryiko .btf_load_err = true, 3029c64779e2SAndrii Nakryiko .err_str = "Invalid btf_info kind_flag", 3030c64779e2SAndrii Nakryiko }, 3031c64779e2SAndrii Nakryiko 3032c64779e2SAndrii Nakryiko { 3033c64779e2SAndrii Nakryiko .descr = "valid struct, kind_flag, bitfield_size = 0", 3034c64779e2SAndrii Nakryiko .raw_types = { 3035c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3036c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 8), /* [2] */ 3037c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 0)), 3038c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 32)), 3039c64779e2SAndrii Nakryiko BTF_END_RAW, 3040c64779e2SAndrii Nakryiko }, 3041c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3042c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3043c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3044c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3045c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3046c64779e2SAndrii Nakryiko .key_type_id = 1, 3047c64779e2SAndrii Nakryiko .value_type_id = 1, 3048c64779e2SAndrii Nakryiko .max_entries = 4, 3049c64779e2SAndrii Nakryiko }, 3050c64779e2SAndrii Nakryiko 3051c64779e2SAndrii Nakryiko { 3052c64779e2SAndrii Nakryiko .descr = "valid struct, kind_flag, int member, bitfield_size != 0", 3053c64779e2SAndrii Nakryiko .raw_types = { 3054c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3055c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [2] */ 3056c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)), 3057c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 4)), 3058c64779e2SAndrii Nakryiko BTF_END_RAW, 3059c64779e2SAndrii Nakryiko }, 3060c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3061c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3062c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3063c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3064c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3065c64779e2SAndrii Nakryiko .key_type_id = 1, 3066c64779e2SAndrii Nakryiko .value_type_id = 1, 3067c64779e2SAndrii Nakryiko .max_entries = 4, 3068c64779e2SAndrii Nakryiko }, 3069c64779e2SAndrii Nakryiko 3070c64779e2SAndrii Nakryiko { 3071c64779e2SAndrii Nakryiko .descr = "valid union, kind_flag, int member, bitfield_size != 0", 3072c64779e2SAndrii Nakryiko .raw_types = { 3073c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3074c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4), /* [2] */ 3075c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)), 3076c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)), 3077c64779e2SAndrii Nakryiko BTF_END_RAW, 3078c64779e2SAndrii Nakryiko }, 3079c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3080c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3081c64779e2SAndrii Nakryiko .map_name = "union_type_check_btf", 3082c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3083c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3084c64779e2SAndrii Nakryiko .key_type_id = 1, 3085c64779e2SAndrii Nakryiko .value_type_id = 1, 3086c64779e2SAndrii Nakryiko .max_entries = 4, 3087c64779e2SAndrii Nakryiko }, 3088c64779e2SAndrii Nakryiko 3089c64779e2SAndrii Nakryiko { 3090c64779e2SAndrii Nakryiko .descr = "valid struct, kind_flag, enum member, bitfield_size != 0", 3091c64779e2SAndrii Nakryiko .raw_types = { 3092c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3093c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */ 3094c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 3095c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */ 3096c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)), 3097c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 4)), 3098c64779e2SAndrii Nakryiko BTF_END_RAW, 3099c64779e2SAndrii Nakryiko }, 3100c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B\0C"), 3101c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3102c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3103c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3104c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3105c64779e2SAndrii Nakryiko .key_type_id = 1, 3106c64779e2SAndrii Nakryiko .value_type_id = 1, 3107c64779e2SAndrii Nakryiko .max_entries = 4, 3108c64779e2SAndrii Nakryiko }, 3109c64779e2SAndrii Nakryiko 3110c64779e2SAndrii Nakryiko { 3111c64779e2SAndrii Nakryiko .descr = "valid union, kind_flag, enum member, bitfield_size != 0", 3112c64779e2SAndrii Nakryiko .raw_types = { 3113c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3114c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */ 3115c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 3116c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4), /* [3] */ 3117c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)), 3118c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)), 3119c64779e2SAndrii Nakryiko BTF_END_RAW, 3120c64779e2SAndrii Nakryiko }, 3121c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B\0C"), 3122c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3123c64779e2SAndrii Nakryiko .map_name = "union_type_check_btf", 3124c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3125c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3126c64779e2SAndrii Nakryiko .key_type_id = 1, 3127c64779e2SAndrii Nakryiko .value_type_id = 1, 3128c64779e2SAndrii Nakryiko .max_entries = 4, 3129c64779e2SAndrii Nakryiko }, 3130c64779e2SAndrii Nakryiko 3131c64779e2SAndrii Nakryiko { 3132c64779e2SAndrii Nakryiko .descr = "valid struct, kind_flag, typedef member, bitfield_size != 0", 3133c64779e2SAndrii Nakryiko .raw_types = { 3134c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3135c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */ 3136c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 3137c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */ 3138c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)), 3139c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 4)), 3140c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [4] */ 3141c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [5] */ 3142c64779e2SAndrii Nakryiko BTF_END_RAW, 3143c64779e2SAndrii Nakryiko }, 3144c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B\0C\0D\0E"), 3145c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3146c64779e2SAndrii Nakryiko .map_name = "struct_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 union, 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_UNION, 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, 0)), 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 = "union_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 = "invalid struct, kind_flag, bitfield_size greater than struct size", 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_STRUCT, 1, 2), 4), /* [2] */ 3182c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)), 3183c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 20)), 3184c64779e2SAndrii Nakryiko BTF_END_RAW, 3185c64779e2SAndrii Nakryiko }, 3186c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3187c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3188c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3189c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3190c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3191c64779e2SAndrii Nakryiko .key_type_id = 1, 3192c64779e2SAndrii Nakryiko .value_type_id = 1, 3193c64779e2SAndrii Nakryiko .max_entries = 4, 3194c64779e2SAndrii Nakryiko .btf_load_err = true, 3195c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 3196c64779e2SAndrii Nakryiko }, 3197c64779e2SAndrii Nakryiko 3198c64779e2SAndrii Nakryiko { 3199c64779e2SAndrii Nakryiko .descr = "invalid struct, kind_flag, bitfield base_type int not regular", 3200c64779e2SAndrii Nakryiko .raw_types = { 3201c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3202c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 20, 4), /* [2] */ 3203c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [3] */ 3204c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 0)), 3205c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 20)), 3206c64779e2SAndrii Nakryiko BTF_END_RAW, 3207c64779e2SAndrii Nakryiko }, 3208c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3209c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3210c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3211c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3212c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3213c64779e2SAndrii Nakryiko .key_type_id = 1, 3214c64779e2SAndrii Nakryiko .value_type_id = 1, 3215c64779e2SAndrii Nakryiko .max_entries = 4, 3216c64779e2SAndrii Nakryiko .btf_load_err = true, 3217c64779e2SAndrii Nakryiko .err_str = "Invalid member base type", 3218c64779e2SAndrii Nakryiko }, 3219c64779e2SAndrii Nakryiko 3220c64779e2SAndrii Nakryiko { 3221c64779e2SAndrii Nakryiko .descr = "invalid struct, kind_flag, base_type int not regular", 3222c64779e2SAndrii Nakryiko .raw_types = { 3223c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3224c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 12, 4), /* [2] */ 3225c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4), /* [3] */ 3226c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 0)), 3227c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 8)), 3228c64779e2SAndrii Nakryiko BTF_END_RAW, 3229c64779e2SAndrii Nakryiko }, 3230c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3231c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3232c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3233c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3234c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3235c64779e2SAndrii Nakryiko .key_type_id = 1, 3236c64779e2SAndrii Nakryiko .value_type_id = 1, 3237c64779e2SAndrii Nakryiko .max_entries = 4, 3238c64779e2SAndrii Nakryiko .btf_load_err = true, 3239c64779e2SAndrii Nakryiko .err_str = "Invalid member base type", 3240c64779e2SAndrii Nakryiko }, 3241c64779e2SAndrii Nakryiko 3242c64779e2SAndrii Nakryiko { 3243c64779e2SAndrii Nakryiko .descr = "invalid union, kind_flag, bitfield_size greater than struct size", 3244c64779e2SAndrii Nakryiko .raw_types = { 3245c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3246c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 2), /* [2] */ 3247c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(8, 0)), 3248c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)), 3249c64779e2SAndrii Nakryiko BTF_END_RAW, 3250c64779e2SAndrii Nakryiko }, 3251c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3252c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3253c64779e2SAndrii Nakryiko .map_name = "union_type_check_btf", 3254c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3255c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3256c64779e2SAndrii Nakryiko .key_type_id = 1, 3257c64779e2SAndrii Nakryiko .value_type_id = 1, 3258c64779e2SAndrii Nakryiko .max_entries = 4, 3259c64779e2SAndrii Nakryiko .btf_load_err = true, 3260c64779e2SAndrii Nakryiko .err_str = "Member exceeds struct_size", 3261c64779e2SAndrii Nakryiko }, 3262c64779e2SAndrii Nakryiko 3263c64779e2SAndrii Nakryiko { 3264c64779e2SAndrii Nakryiko .descr = "invalid struct, kind_flag, int member, bitfield_size = 0, wrong byte alignment", 3265c64779e2SAndrii Nakryiko .raw_types = { 3266c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3267c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 3268c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12), /* [3] */ 3269c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), 3270c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)), 3271c64779e2SAndrii Nakryiko BTF_END_RAW, 3272c64779e2SAndrii Nakryiko }, 3273c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B"), 3274c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3275c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3276c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3277c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3278c64779e2SAndrii Nakryiko .key_type_id = 1, 3279c64779e2SAndrii Nakryiko .value_type_id = 1, 3280c64779e2SAndrii Nakryiko .max_entries = 4, 3281c64779e2SAndrii Nakryiko .btf_load_err = true, 3282c64779e2SAndrii Nakryiko .err_str = "Invalid member offset", 3283c64779e2SAndrii Nakryiko }, 3284c64779e2SAndrii Nakryiko 3285c64779e2SAndrii Nakryiko { 3286c64779e2SAndrii Nakryiko .descr = "invalid struct, kind_flag, enum member, bitfield_size = 0, wrong byte alignment", 3287c64779e2SAndrii Nakryiko .raw_types = { 3288c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3289c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 3290c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), /* [2] */ 3291c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 3292c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12), /* [3] */ 3293c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), 3294c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)), 3295c64779e2SAndrii Nakryiko BTF_END_RAW, 3296c64779e2SAndrii Nakryiko }, 3297c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A\0B\0C"), 3298c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3299c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3300c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3301c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3302c64779e2SAndrii Nakryiko .key_type_id = 1, 3303c64779e2SAndrii Nakryiko .value_type_id = 1, 3304c64779e2SAndrii Nakryiko .max_entries = 4, 3305c64779e2SAndrii Nakryiko .btf_load_err = true, 3306c64779e2SAndrii Nakryiko .err_str = "Invalid member offset", 3307c64779e2SAndrii Nakryiko }, 3308c64779e2SAndrii Nakryiko 3309c64779e2SAndrii Nakryiko { 3310c64779e2SAndrii Nakryiko .descr = "128-bit int", 3311c64779e2SAndrii Nakryiko .raw_types = { 3312c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3313c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */ 3314c64779e2SAndrii Nakryiko BTF_END_RAW, 3315c64779e2SAndrii Nakryiko }, 3316c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3317c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3318c64779e2SAndrii Nakryiko .map_name = "int_type_check_btf", 3319c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3320c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3321c64779e2SAndrii Nakryiko .key_type_id = 1, 3322c64779e2SAndrii Nakryiko .value_type_id = 1, 3323c64779e2SAndrii Nakryiko .max_entries = 4, 3324c64779e2SAndrii Nakryiko }, 3325c64779e2SAndrii Nakryiko 3326c64779e2SAndrii Nakryiko { 3327c64779e2SAndrii Nakryiko .descr = "struct, 128-bit int member", 3328c64779e2SAndrii Nakryiko .raw_types = { 3329c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3330c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */ 3331c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16), /* [3] */ 3332c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3333c64779e2SAndrii Nakryiko BTF_END_RAW, 3334c64779e2SAndrii Nakryiko }, 3335c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3336c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3337c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3338c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3339c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3340c64779e2SAndrii Nakryiko .key_type_id = 1, 3341c64779e2SAndrii Nakryiko .value_type_id = 1, 3342c64779e2SAndrii Nakryiko .max_entries = 4, 3343c64779e2SAndrii Nakryiko }, 3344c64779e2SAndrii Nakryiko 3345c64779e2SAndrii Nakryiko { 3346c64779e2SAndrii Nakryiko .descr = "struct, 120-bit int member bitfield", 3347c64779e2SAndrii Nakryiko .raw_types = { 3348c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3349c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 120, 16), /* [2] */ 3350c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16), /* [3] */ 3351c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3352c64779e2SAndrii Nakryiko BTF_END_RAW, 3353c64779e2SAndrii Nakryiko }, 3354c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3355c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3356c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3357c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3358c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3359c64779e2SAndrii Nakryiko .key_type_id = 1, 3360c64779e2SAndrii Nakryiko .value_type_id = 1, 3361c64779e2SAndrii Nakryiko .max_entries = 4, 3362c64779e2SAndrii Nakryiko }, 3363c64779e2SAndrii Nakryiko 3364c64779e2SAndrii Nakryiko { 3365c64779e2SAndrii Nakryiko .descr = "struct, kind_flag, 128-bit int member", 3366c64779e2SAndrii Nakryiko .raw_types = { 3367c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3368c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */ 3369c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16), /* [3] */ 3370c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), 3371c64779e2SAndrii Nakryiko BTF_END_RAW, 3372c64779e2SAndrii Nakryiko }, 3373c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3374c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3375c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3376c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3377c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3378c64779e2SAndrii Nakryiko .key_type_id = 1, 3379c64779e2SAndrii Nakryiko .value_type_id = 1, 3380c64779e2SAndrii Nakryiko .max_entries = 4, 3381c64779e2SAndrii Nakryiko }, 3382c64779e2SAndrii Nakryiko 3383c64779e2SAndrii Nakryiko { 3384c64779e2SAndrii Nakryiko .descr = "struct, kind_flag, 120-bit int member bitfield", 3385c64779e2SAndrii Nakryiko .raw_types = { 3386c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3387c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16), /* [2] */ 3388c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16), /* [3] */ 3389c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(120, 0)), 3390c64779e2SAndrii Nakryiko BTF_END_RAW, 3391c64779e2SAndrii Nakryiko }, 3392c64779e2SAndrii Nakryiko BTF_STR_SEC("\0A"), 3393c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3394c64779e2SAndrii Nakryiko .map_name = "struct_type_check_btf", 3395c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3396c64779e2SAndrii Nakryiko .value_size = sizeof(int), 3397c64779e2SAndrii Nakryiko .key_type_id = 1, 3398c64779e2SAndrii Nakryiko .value_type_id = 1, 3399c64779e2SAndrii Nakryiko .max_entries = 4, 3400c64779e2SAndrii Nakryiko }, 3401c64779e2SAndrii Nakryiko /* 3402c64779e2SAndrii Nakryiko * typedef int arr_t[16]; 3403c64779e2SAndrii Nakryiko * struct s { 3404c64779e2SAndrii Nakryiko * arr_t *a; 3405c64779e2SAndrii Nakryiko * }; 3406c64779e2SAndrii Nakryiko */ 3407c64779e2SAndrii Nakryiko { 3408c64779e2SAndrii Nakryiko .descr = "struct->ptr->typedef->array->int size resolution", 3409c64779e2SAndrii Nakryiko .raw_types = { 3410c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3411c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3412c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [2] */ 3413c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3414c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(5, 5, 16), /* [4] */ 3415c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [5] */ 3416c64779e2SAndrii Nakryiko BTF_END_RAW, 3417c64779e2SAndrii Nakryiko }, 3418c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0a\0arr_t"), 3419c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3420c64779e2SAndrii Nakryiko .map_name = "ptr_mod_chain_size_resolve_map", 3421c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3422c64779e2SAndrii Nakryiko .value_size = sizeof(int) * 16, 3423c64779e2SAndrii Nakryiko .key_type_id = 5 /* int */, 3424c64779e2SAndrii Nakryiko .value_type_id = 3 /* arr_t */, 3425c64779e2SAndrii Nakryiko .max_entries = 4, 3426c64779e2SAndrii Nakryiko }, 3427c64779e2SAndrii Nakryiko /* 3428c64779e2SAndrii Nakryiko * typedef int arr_t[16][8][4]; 3429c64779e2SAndrii Nakryiko * struct s { 3430c64779e2SAndrii Nakryiko * arr_t *a; 3431c64779e2SAndrii Nakryiko * }; 3432c64779e2SAndrii Nakryiko */ 3433c64779e2SAndrii Nakryiko { 3434c64779e2SAndrii Nakryiko .descr = "struct->ptr->typedef->multi-array->int size resolution", 3435c64779e2SAndrii Nakryiko .raw_types = { 3436c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3437c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3438c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [2] */ 3439c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3440c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(5, 7, 16), /* [4] */ 3441c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(6, 7, 8), /* [5] */ 3442c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(7, 7, 4), /* [6] */ 3443c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [7] */ 3444c64779e2SAndrii Nakryiko BTF_END_RAW, 3445c64779e2SAndrii Nakryiko }, 3446c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0a\0arr_t"), 3447c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3448c64779e2SAndrii Nakryiko .map_name = "multi_arr_size_resolve_map", 3449c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3450c64779e2SAndrii Nakryiko .value_size = sizeof(int) * 16 * 8 * 4, 3451c64779e2SAndrii Nakryiko .key_type_id = 7 /* int */, 3452c64779e2SAndrii Nakryiko .value_type_id = 3 /* arr_t */, 3453c64779e2SAndrii Nakryiko .max_entries = 4, 3454c64779e2SAndrii Nakryiko }, 3455c64779e2SAndrii Nakryiko /* 3456c64779e2SAndrii Nakryiko * typedef int int_t; 3457c64779e2SAndrii Nakryiko * typedef int_t arr3_t[4]; 3458c64779e2SAndrii Nakryiko * typedef arr3_t arr2_t[8]; 3459c64779e2SAndrii Nakryiko * typedef arr2_t arr1_t[16]; 3460c64779e2SAndrii Nakryiko * struct s { 3461c64779e2SAndrii Nakryiko * arr1_t *a; 3462c64779e2SAndrii Nakryiko * }; 3463c64779e2SAndrii Nakryiko */ 3464c64779e2SAndrii Nakryiko { 3465c64779e2SAndrii Nakryiko .descr = "typedef/multi-arr mix size resolution", 3466c64779e2SAndrii Nakryiko .raw_types = { 3467c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3468c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3469c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [2] */ 3470c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3471c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(5, 10, 16), /* [4] */ 3472c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 6), /* [5] */ 3473c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(7, 10, 8), /* [6] */ 3474c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 8), /* [7] */ 3475c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 10, 4), /* [8] */ 3476c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 10), /* [9] */ 3477c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [10] */ 3478c64779e2SAndrii Nakryiko BTF_END_RAW, 3479c64779e2SAndrii Nakryiko }, 3480c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"), 3481c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 3482c64779e2SAndrii Nakryiko .map_name = "typedef_arra_mix_size_resolve_map", 3483c64779e2SAndrii Nakryiko .key_size = sizeof(int), 3484c64779e2SAndrii Nakryiko .value_size = sizeof(int) * 16 * 8 * 4, 3485c64779e2SAndrii Nakryiko .key_type_id = 10 /* int */, 3486c64779e2SAndrii Nakryiko .value_type_id = 3 /* arr_t */, 3487c64779e2SAndrii Nakryiko .max_entries = 4, 3488c64779e2SAndrii Nakryiko }, 348913ca51d5SYonghong Song /* 349013ca51d5SYonghong Song * elf .rodata section size 4 and btf .rodata section vlen 0. 349113ca51d5SYonghong Song */ 349213ca51d5SYonghong Song { 349313ca51d5SYonghong Song .descr = "datasec: vlen == 0", 349413ca51d5SYonghong Song .raw_types = { 349513ca51d5SYonghong Song /* int */ 349613ca51d5SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 349713ca51d5SYonghong Song /* .rodata section */ 349813ca51d5SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 0), 4), 349913ca51d5SYonghong Song /* [2] */ 350013ca51d5SYonghong Song BTF_END_RAW, 350113ca51d5SYonghong Song }, 350213ca51d5SYonghong Song BTF_STR_SEC("\0.rodata"), 350313ca51d5SYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 350413ca51d5SYonghong Song .key_size = sizeof(int), 350513ca51d5SYonghong Song .value_size = sizeof(int), 350613ca51d5SYonghong Song .key_type_id = 1, 350713ca51d5SYonghong Song .value_type_id = 1, 350813ca51d5SYonghong Song .max_entries = 1, 350913ca51d5SYonghong Song }, 3510c64779e2SAndrii Nakryiko 35117e72aad3SIlya Leoshkevich { 35127e72aad3SIlya Leoshkevich .descr = "float test #1, well-formed", 35137e72aad3SIlya Leoshkevich .raw_types = { 35147e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 35157e72aad3SIlya Leoshkevich /* [1] */ 35167e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [2] */ 35177e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [3] */ 35187e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 8), /* [4] */ 35197e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 12), /* [5] */ 35207e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 16), /* [6] */ 35217e72aad3SIlya Leoshkevich BTF_STRUCT_ENC(NAME_TBD, 5, 48), /* [7] */ 35227e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 2, 0), 35237e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 3, 32), 35247e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 4, 64), 35257e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 5, 128), 35267e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 6, 256), 35277e72aad3SIlya Leoshkevich BTF_END_RAW, 35287e72aad3SIlya Leoshkevich }, 35297e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0_Float16\0float\0double\0_Float80\0long_double" 35307e72aad3SIlya Leoshkevich "\0floats\0a\0b\0c\0d\0e"), 35317e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 35327e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 35337e72aad3SIlya Leoshkevich .key_size = sizeof(int), 35347e72aad3SIlya Leoshkevich .value_size = 48, 35357e72aad3SIlya Leoshkevich .key_type_id = 1, 35367e72aad3SIlya Leoshkevich .value_type_id = 7, 35377e72aad3SIlya Leoshkevich .max_entries = 1, 35387e72aad3SIlya Leoshkevich }, 35397e72aad3SIlya Leoshkevich { 35407e72aad3SIlya Leoshkevich .descr = "float test #2, invalid vlen", 35417e72aad3SIlya Leoshkevich .raw_types = { 35427e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 35437e72aad3SIlya Leoshkevich /* [1] */ 35447e72aad3SIlya Leoshkevich BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 1), 4), 35457e72aad3SIlya Leoshkevich /* [2] */ 35467e72aad3SIlya Leoshkevich BTF_END_RAW, 35477e72aad3SIlya Leoshkevich }, 35487e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0float"), 35497e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 35507e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 35517e72aad3SIlya Leoshkevich .key_size = sizeof(int), 35527e72aad3SIlya Leoshkevich .value_size = 4, 35537e72aad3SIlya Leoshkevich .key_type_id = 1, 35547e72aad3SIlya Leoshkevich .value_type_id = 2, 35557e72aad3SIlya Leoshkevich .max_entries = 1, 35567e72aad3SIlya Leoshkevich .btf_load_err = true, 35577e72aad3SIlya Leoshkevich .err_str = "vlen != 0", 35587e72aad3SIlya Leoshkevich }, 35597e72aad3SIlya Leoshkevich { 35607e72aad3SIlya Leoshkevich .descr = "float test #3, invalid kind_flag", 35617e72aad3SIlya Leoshkevich .raw_types = { 35627e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 35637e72aad3SIlya Leoshkevich /* [1] */ 35647e72aad3SIlya Leoshkevich BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 1, 0), 4), 35657e72aad3SIlya Leoshkevich /* [2] */ 35667e72aad3SIlya Leoshkevich BTF_END_RAW, 35677e72aad3SIlya Leoshkevich }, 35687e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0float"), 35697e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 35707e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 35717e72aad3SIlya Leoshkevich .key_size = sizeof(int), 35727e72aad3SIlya Leoshkevich .value_size = 4, 35737e72aad3SIlya Leoshkevich .key_type_id = 1, 35747e72aad3SIlya Leoshkevich .value_type_id = 2, 35757e72aad3SIlya Leoshkevich .max_entries = 1, 35767e72aad3SIlya Leoshkevich .btf_load_err = true, 35777e72aad3SIlya Leoshkevich .err_str = "Invalid btf_info kind_flag", 35787e72aad3SIlya Leoshkevich }, 35797e72aad3SIlya Leoshkevich { 35807e72aad3SIlya Leoshkevich .descr = "float test #4, member does not fit", 35817e72aad3SIlya Leoshkevich .raw_types = { 35827e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 35837e72aad3SIlya Leoshkevich /* [1] */ 35847e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [2] */ 35857e72aad3SIlya Leoshkevich BTF_STRUCT_ENC(NAME_TBD, 1, 2), /* [3] */ 35867e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 2, 0), 35877e72aad3SIlya Leoshkevich BTF_END_RAW, 35887e72aad3SIlya Leoshkevich }, 35897e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0float\0floats\0x"), 35907e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 35917e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 35927e72aad3SIlya Leoshkevich .key_size = sizeof(int), 35937e72aad3SIlya Leoshkevich .value_size = 4, 35947e72aad3SIlya Leoshkevich .key_type_id = 1, 35957e72aad3SIlya Leoshkevich .value_type_id = 3, 35967e72aad3SIlya Leoshkevich .max_entries = 1, 35977e72aad3SIlya Leoshkevich .btf_load_err = true, 35987e72aad3SIlya Leoshkevich .err_str = "Member exceeds struct_size", 35997e72aad3SIlya Leoshkevich }, 36007e72aad3SIlya Leoshkevich { 36017e72aad3SIlya Leoshkevich .descr = "float test #5, member is not properly aligned", 36027e72aad3SIlya Leoshkevich .raw_types = { 36037e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 36047e72aad3SIlya Leoshkevich /* [1] */ 36057e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [2] */ 36067e72aad3SIlya Leoshkevich BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [3] */ 36077e72aad3SIlya Leoshkevich BTF_MEMBER_ENC(NAME_TBD, 2, 8), 36087e72aad3SIlya Leoshkevich BTF_END_RAW, 36097e72aad3SIlya Leoshkevich }, 36107e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0float\0floats\0x"), 36117e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 36127e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 36137e72aad3SIlya Leoshkevich .key_size = sizeof(int), 36147e72aad3SIlya Leoshkevich .value_size = 4, 36157e72aad3SIlya Leoshkevich .key_type_id = 1, 36167e72aad3SIlya Leoshkevich .value_type_id = 3, 36177e72aad3SIlya Leoshkevich .max_entries = 1, 36187e72aad3SIlya Leoshkevich .btf_load_err = true, 36197e72aad3SIlya Leoshkevich .err_str = "Member is not properly aligned", 36207e72aad3SIlya Leoshkevich }, 36217e72aad3SIlya Leoshkevich { 36227e72aad3SIlya Leoshkevich .descr = "float test #6, invalid size", 36237e72aad3SIlya Leoshkevich .raw_types = { 36247e72aad3SIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 36257e72aad3SIlya Leoshkevich /* [1] */ 36267e72aad3SIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 6), /* [2] */ 36277e72aad3SIlya Leoshkevich BTF_END_RAW, 36287e72aad3SIlya Leoshkevich }, 36297e72aad3SIlya Leoshkevich BTF_STR_SEC("\0int\0float"), 36307e72aad3SIlya Leoshkevich .map_type = BPF_MAP_TYPE_ARRAY, 36317e72aad3SIlya Leoshkevich .map_name = "float_type_check_btf", 36327e72aad3SIlya Leoshkevich .key_size = sizeof(int), 36337e72aad3SIlya Leoshkevich .value_size = 6, 36347e72aad3SIlya Leoshkevich .key_type_id = 1, 36357e72aad3SIlya Leoshkevich .value_type_id = 2, 36367e72aad3SIlya Leoshkevich .max_entries = 1, 36377e72aad3SIlya Leoshkevich .btf_load_err = true, 36387e72aad3SIlya Leoshkevich .err_str = "Invalid type_size", 36397e72aad3SIlya Leoshkevich }, 36407e72aad3SIlya Leoshkevich 364135baba7aSYonghong Song { 3642223f903eSYonghong Song .descr = "decl_tag test #1, struct/member, well-formed", 364335baba7aSYonghong Song .raw_types = { 364435baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 364535baba7aSYonghong Song BTF_STRUCT_ENC(0, 2, 8), /* [2] */ 364635baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 0), 364735baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 32), 3648223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), 3649223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), 3650223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 1), 365135baba7aSYonghong Song BTF_END_RAW, 365235baba7aSYonghong Song }, 365335baba7aSYonghong Song BTF_STR_SEC("\0m1\0m2\0tag1\0tag2\0tag3"), 365435baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 365535baba7aSYonghong Song .map_name = "tag_type_check_btf", 365635baba7aSYonghong Song .key_size = sizeof(int), 365735baba7aSYonghong Song .value_size = 8, 365835baba7aSYonghong Song .key_type_id = 1, 365935baba7aSYonghong Song .value_type_id = 2, 366035baba7aSYonghong Song .max_entries = 1, 366135baba7aSYonghong Song }, 366235baba7aSYonghong Song { 3663223f903eSYonghong Song .descr = "decl_tag test #2, union/member, well-formed", 366435baba7aSYonghong Song .raw_types = { 366535baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 366635baba7aSYonghong Song BTF_UNION_ENC(NAME_TBD, 2, 4), /* [2] */ 366735baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 0), 366835baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 0), 3669223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), 3670223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), 3671223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 1), 367235baba7aSYonghong Song BTF_END_RAW, 367335baba7aSYonghong Song }, 367435baba7aSYonghong Song BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), 367535baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 367635baba7aSYonghong Song .map_name = "tag_type_check_btf", 367735baba7aSYonghong Song .key_size = sizeof(int), 367835baba7aSYonghong Song .value_size = 4, 367935baba7aSYonghong Song .key_type_id = 1, 368035baba7aSYonghong Song .value_type_id = 2, 368135baba7aSYonghong Song .max_entries = 1, 368235baba7aSYonghong Song }, 368335baba7aSYonghong Song { 3684223f903eSYonghong Song .descr = "decl_tag test #3, variable, well-formed", 368535baba7aSYonghong Song .raw_types = { 368635baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 368735baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 368835baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 1), /* [3] */ 3689223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), 3690223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, -1), 369135baba7aSYonghong Song BTF_END_RAW, 369235baba7aSYonghong Song }, 369335baba7aSYonghong Song BTF_STR_SEC("\0local\0global\0tag1\0tag2"), 369435baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 369535baba7aSYonghong Song .map_name = "tag_type_check_btf", 369635baba7aSYonghong Song .key_size = sizeof(int), 369735baba7aSYonghong Song .value_size = 4, 369835baba7aSYonghong Song .key_type_id = 1, 369935baba7aSYonghong Song .value_type_id = 1, 370035baba7aSYonghong Song .max_entries = 1, 370135baba7aSYonghong Song }, 370235baba7aSYonghong Song { 3703223f903eSYonghong Song .descr = "decl_tag test #4, func/parameter, well-formed", 370435baba7aSYonghong Song .raw_types = { 370535baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 370635baba7aSYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 370735baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 370835baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 370935baba7aSYonghong Song BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 3710223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, -1), 3711223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, 0), 3712223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, 1), 371335baba7aSYonghong Song BTF_END_RAW, 371435baba7aSYonghong Song }, 371535baba7aSYonghong Song BTF_STR_SEC("\0arg1\0arg2\0f\0tag1\0tag2\0tag3"), 371635baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 371735baba7aSYonghong Song .map_name = "tag_type_check_btf", 371835baba7aSYonghong Song .key_size = sizeof(int), 371935baba7aSYonghong Song .value_size = 4, 372035baba7aSYonghong Song .key_type_id = 1, 372135baba7aSYonghong Song .value_type_id = 1, 372235baba7aSYonghong Song .max_entries = 1, 372335baba7aSYonghong Song }, 372435baba7aSYonghong Song { 3725223f903eSYonghong Song .descr = "decl_tag test #5, invalid value", 372635baba7aSYonghong Song .raw_types = { 372735baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 372835baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 3729223f903eSYonghong Song BTF_DECL_TAG_ENC(0, 2, -1), 373035baba7aSYonghong Song BTF_END_RAW, 373135baba7aSYonghong Song }, 373235baba7aSYonghong Song BTF_STR_SEC("\0local\0tag"), 373335baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 373435baba7aSYonghong Song .map_name = "tag_type_check_btf", 373535baba7aSYonghong Song .key_size = sizeof(int), 373635baba7aSYonghong Song .value_size = 4, 373735baba7aSYonghong Song .key_type_id = 1, 373835baba7aSYonghong Song .value_type_id = 1, 373935baba7aSYonghong Song .max_entries = 1, 374035baba7aSYonghong Song .btf_load_err = true, 374135baba7aSYonghong Song .err_str = "Invalid value", 374235baba7aSYonghong Song }, 374335baba7aSYonghong Song { 3744223f903eSYonghong Song .descr = "decl_tag test #6, invalid target type", 374535baba7aSYonghong Song .raw_types = { 374635baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3747223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 1, -1), 374835baba7aSYonghong Song BTF_END_RAW, 374935baba7aSYonghong Song }, 375035baba7aSYonghong Song BTF_STR_SEC("\0tag1"), 375135baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 375235baba7aSYonghong Song .map_name = "tag_type_check_btf", 375335baba7aSYonghong Song .key_size = sizeof(int), 375435baba7aSYonghong Song .value_size = 4, 375535baba7aSYonghong Song .key_type_id = 1, 375635baba7aSYonghong Song .value_type_id = 1, 375735baba7aSYonghong Song .max_entries = 1, 375835baba7aSYonghong Song .btf_load_err = true, 375935baba7aSYonghong Song .err_str = "Invalid type", 376035baba7aSYonghong Song }, 376135baba7aSYonghong Song { 3762223f903eSYonghong Song .descr = "decl_tag test #7, invalid vlen", 376335baba7aSYonghong Song .raw_types = { 376435baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 376535baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 3766223f903eSYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 1), 2), (0), 376735baba7aSYonghong Song BTF_END_RAW, 376835baba7aSYonghong Song }, 376935baba7aSYonghong Song BTF_STR_SEC("\0local\0tag1"), 377035baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 377135baba7aSYonghong Song .map_name = "tag_type_check_btf", 377235baba7aSYonghong Song .key_size = sizeof(int), 377335baba7aSYonghong Song .value_size = 4, 377435baba7aSYonghong Song .key_type_id = 1, 377535baba7aSYonghong Song .value_type_id = 1, 377635baba7aSYonghong Song .max_entries = 1, 377735baba7aSYonghong Song .btf_load_err = true, 377835baba7aSYonghong Song .err_str = "vlen != 0", 377935baba7aSYonghong Song }, 378035baba7aSYonghong Song { 3781223f903eSYonghong Song .descr = "decl_tag test #8, invalid kflag", 378235baba7aSYonghong Song .raw_types = { 378335baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 378435baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 3785223f903eSYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 1, 0), 2), (-1), 378635baba7aSYonghong Song BTF_END_RAW, 378735baba7aSYonghong Song }, 378835baba7aSYonghong Song BTF_STR_SEC("\0local\0tag1"), 378935baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 379035baba7aSYonghong Song .map_name = "tag_type_check_btf", 379135baba7aSYonghong Song .key_size = sizeof(int), 379235baba7aSYonghong Song .value_size = 4, 379335baba7aSYonghong Song .key_type_id = 1, 379435baba7aSYonghong Song .value_type_id = 1, 379535baba7aSYonghong Song .max_entries = 1, 379635baba7aSYonghong Song .btf_load_err = true, 379735baba7aSYonghong Song .err_str = "Invalid btf_info kind_flag", 379835baba7aSYonghong Song }, 379935baba7aSYonghong Song { 3800223f903eSYonghong Song .descr = "decl_tag test #9, var, invalid component_idx", 380135baba7aSYonghong Song .raw_types = { 380235baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 380335baba7aSYonghong Song BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 3804223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), 380535baba7aSYonghong Song BTF_END_RAW, 380635baba7aSYonghong Song }, 380735baba7aSYonghong Song BTF_STR_SEC("\0local\0tag"), 380835baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 380935baba7aSYonghong Song .map_name = "tag_type_check_btf", 381035baba7aSYonghong Song .key_size = sizeof(int), 381135baba7aSYonghong Song .value_size = 4, 381235baba7aSYonghong Song .key_type_id = 1, 381335baba7aSYonghong Song .value_type_id = 1, 381435baba7aSYonghong Song .max_entries = 1, 381535baba7aSYonghong Song .btf_load_err = true, 381635baba7aSYonghong Song .err_str = "Invalid component_idx", 381735baba7aSYonghong Song }, 381835baba7aSYonghong Song { 3819223f903eSYonghong Song .descr = "decl_tag test #10, struct member, invalid component_idx", 382035baba7aSYonghong Song .raw_types = { 382135baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 382235baba7aSYonghong Song BTF_STRUCT_ENC(0, 2, 8), /* [2] */ 382335baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 0), 382435baba7aSYonghong Song BTF_MEMBER_ENC(NAME_TBD, 1, 32), 3825223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 2), 382635baba7aSYonghong Song BTF_END_RAW, 382735baba7aSYonghong Song }, 382835baba7aSYonghong Song BTF_STR_SEC("\0m1\0m2\0tag"), 382935baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 383035baba7aSYonghong Song .map_name = "tag_type_check_btf", 383135baba7aSYonghong Song .key_size = sizeof(int), 383235baba7aSYonghong Song .value_size = 8, 383335baba7aSYonghong Song .key_type_id = 1, 383435baba7aSYonghong Song .value_type_id = 2, 383535baba7aSYonghong Song .max_entries = 1, 383635baba7aSYonghong Song .btf_load_err = true, 383735baba7aSYonghong Song .err_str = "Invalid component_idx", 383835baba7aSYonghong Song }, 383935baba7aSYonghong Song { 3840223f903eSYonghong Song .descr = "decl_tag test #11, func parameter, invalid component_idx", 384135baba7aSYonghong Song .raw_types = { 384235baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 384335baba7aSYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 384435baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 384535baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 384635baba7aSYonghong Song BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 3847223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, 2), 384835baba7aSYonghong Song BTF_END_RAW, 384935baba7aSYonghong Song }, 385035baba7aSYonghong Song BTF_STR_SEC("\0arg1\0arg2\0f\0tag"), 385135baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 385235baba7aSYonghong Song .map_name = "tag_type_check_btf", 385335baba7aSYonghong Song .key_size = sizeof(int), 385435baba7aSYonghong Song .value_size = 4, 385535baba7aSYonghong Song .key_type_id = 1, 385635baba7aSYonghong Song .value_type_id = 1, 385735baba7aSYonghong Song .max_entries = 1, 385835baba7aSYonghong Song .btf_load_err = true, 385935baba7aSYonghong Song .err_str = "Invalid component_idx", 386035baba7aSYonghong Song }, 386135baba7aSYonghong Song { 3862223f903eSYonghong Song .descr = "decl_tag test #12, < -1 component_idx", 386335baba7aSYonghong Song .raw_types = { 386435baba7aSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 386535baba7aSYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 386635baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 386735baba7aSYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 386835baba7aSYonghong Song BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 3869223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, -2), 387035baba7aSYonghong Song BTF_END_RAW, 387135baba7aSYonghong Song }, 387235baba7aSYonghong Song BTF_STR_SEC("\0arg1\0arg2\0f\0tag"), 387335baba7aSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 387435baba7aSYonghong Song .map_name = "tag_type_check_btf", 387535baba7aSYonghong Song .key_size = sizeof(int), 387635baba7aSYonghong Song .value_size = 4, 387735baba7aSYonghong Song .key_type_id = 1, 387835baba7aSYonghong Song .value_type_id = 1, 387935baba7aSYonghong Song .max_entries = 1, 388035baba7aSYonghong Song .btf_load_err = true, 388135baba7aSYonghong Song .err_str = "Invalid component_idx", 388235baba7aSYonghong Song }, 38839d19a12bSYonghong Song { 38849d19a12bSYonghong Song .descr = "decl_tag test #13, typedef, well-formed", 38859d19a12bSYonghong Song .raw_types = { 38869d19a12bSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 38879d19a12bSYonghong Song BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [2] */ 38889d19a12bSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), 38899d19a12bSYonghong Song BTF_END_RAW, 38909d19a12bSYonghong Song }, 38919d19a12bSYonghong Song BTF_STR_SEC("\0t\0tag"), 38929d19a12bSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 38939d19a12bSYonghong Song .map_name = "tag_type_check_btf", 38949d19a12bSYonghong Song .key_size = sizeof(int), 38959d19a12bSYonghong Song .value_size = 4, 38969d19a12bSYonghong Song .key_type_id = 1, 38979d19a12bSYonghong Song .value_type_id = 1, 38989d19a12bSYonghong Song .max_entries = 1, 38999d19a12bSYonghong Song }, 39009d19a12bSYonghong Song { 39019d19a12bSYonghong Song .descr = "decl_tag test #14, typedef, invalid component_idx", 39029d19a12bSYonghong Song .raw_types = { 39039d19a12bSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 39049d19a12bSYonghong Song BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [2] */ 39059d19a12bSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), 39069d19a12bSYonghong Song BTF_END_RAW, 39079d19a12bSYonghong Song }, 39089d19a12bSYonghong Song BTF_STR_SEC("\0local\0tag"), 39099d19a12bSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 39109d19a12bSYonghong Song .map_name = "tag_type_check_btf", 39119d19a12bSYonghong Song .key_size = sizeof(int), 39129d19a12bSYonghong Song .value_size = 4, 39139d19a12bSYonghong Song .key_type_id = 1, 39149d19a12bSYonghong Song .value_type_id = 1, 39159d19a12bSYonghong Song .max_entries = 1, 39169d19a12bSYonghong Song .btf_load_err = true, 39179d19a12bSYonghong Song .err_str = "Invalid component_idx", 39189d19a12bSYonghong Song }, 39196aa5dabcSYonghong Song { 3920cf1a4cbcSYonghong Song .descr = "decl_tag test #15, func, invalid func proto", 3921cf1a4cbcSYonghong Song .raw_types = { 3922cf1a4cbcSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 3923cf1a4cbcSYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 3, 0), /* [2] */ 3924cf1a4cbcSYonghong Song BTF_FUNC_ENC(NAME_TBD, 8), /* [3] */ 3925cf1a4cbcSYonghong Song BTF_END_RAW, 3926cf1a4cbcSYonghong Song }, 3927cf1a4cbcSYonghong Song BTF_STR_SEC("\0tag\0func"), 3928cf1a4cbcSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 3929cf1a4cbcSYonghong Song .map_name = "tag_type_check_btf", 3930cf1a4cbcSYonghong Song .key_size = sizeof(int), 3931cf1a4cbcSYonghong Song .value_size = 4, 3932cf1a4cbcSYonghong Song .key_type_id = 1, 3933cf1a4cbcSYonghong Song .value_type_id = 1, 3934cf1a4cbcSYonghong Song .max_entries = 1, 3935cf1a4cbcSYonghong Song .btf_load_err = true, 3936cf1a4cbcSYonghong Song .err_str = "Invalid type_id", 3937cf1a4cbcSYonghong Song }, 3938cf1a4cbcSYonghong Song { 393935cc9d62SStanislav Fomichev .descr = "decl_tag test #16, func proto, return type", 394035cc9d62SStanislav Fomichev .raw_types = { 394135cc9d62SStanislav Fomichev BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 394235cc9d62SStanislav Fomichev BTF_VAR_ENC(NAME_TBD, 1, 0), /* [2] */ 394335cc9d62SStanislav Fomichev BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), 2), (-1), /* [3] */ 394435cc9d62SStanislav Fomichev BTF_FUNC_PROTO_ENC(3, 0), /* [4] */ 394535cc9d62SStanislav Fomichev BTF_END_RAW, 394635cc9d62SStanislav Fomichev }, 394735cc9d62SStanislav Fomichev BTF_STR_SEC("\0local\0tag1"), 394835cc9d62SStanislav Fomichev .btf_load_err = true, 394935cc9d62SStanislav Fomichev .err_str = "Invalid return type", 395035cc9d62SStanislav Fomichev }, 395135cc9d62SStanislav Fomichev { 39526aa5dabcSYonghong Song .descr = "type_tag test #1", 39536aa5dabcSYonghong Song .raw_types = { 39546aa5dabcSYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 39556aa5dabcSYonghong Song BTF_TYPE_TAG_ENC(NAME_TBD, 1), /* [2] */ 39566aa5dabcSYonghong Song BTF_PTR_ENC(2), /* [3] */ 39576aa5dabcSYonghong Song BTF_END_RAW, 39586aa5dabcSYonghong Song }, 39596aa5dabcSYonghong Song BTF_STR_SEC("\0tag"), 39606aa5dabcSYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 39616aa5dabcSYonghong Song .map_name = "tag_type_check_btf", 39626aa5dabcSYonghong Song .key_size = sizeof(int), 39636aa5dabcSYonghong Song .value_size = 4, 39646aa5dabcSYonghong Song .key_type_id = 1, 39656aa5dabcSYonghong Song .value_type_id = 1, 39666aa5dabcSYonghong Song .max_entries = 1, 39676aa5dabcSYonghong Song }, 396824fe983aSKumar Kartikeya Dwivedi { 396924fe983aSKumar Kartikeya Dwivedi .descr = "type_tag test #2, type tag order", 397024fe983aSKumar Kartikeya Dwivedi .raw_types = { 397124fe983aSKumar Kartikeya Dwivedi BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 397224fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(3), /* [2] */ 397324fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 1), /* [3] */ 397424fe983aSKumar Kartikeya Dwivedi BTF_END_RAW, 397524fe983aSKumar Kartikeya Dwivedi }, 397624fe983aSKumar Kartikeya Dwivedi BTF_STR_SEC("\0tag"), 397724fe983aSKumar Kartikeya Dwivedi .map_type = BPF_MAP_TYPE_ARRAY, 397824fe983aSKumar Kartikeya Dwivedi .map_name = "tag_type_check_btf", 397924fe983aSKumar Kartikeya Dwivedi .key_size = sizeof(int), 398024fe983aSKumar Kartikeya Dwivedi .value_size = 4, 398124fe983aSKumar Kartikeya Dwivedi .key_type_id = 1, 398224fe983aSKumar Kartikeya Dwivedi .value_type_id = 1, 398324fe983aSKumar Kartikeya Dwivedi .max_entries = 1, 398424fe983aSKumar Kartikeya Dwivedi .btf_load_err = true, 398524fe983aSKumar Kartikeya Dwivedi .err_str = "Type tags don't precede modifiers", 398624fe983aSKumar Kartikeya Dwivedi }, 398724fe983aSKumar Kartikeya Dwivedi { 398824fe983aSKumar Kartikeya Dwivedi .descr = "type_tag test #3, type tag order", 398924fe983aSKumar Kartikeya Dwivedi .raw_types = { 399024fe983aSKumar Kartikeya Dwivedi BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 399124fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 3), /* [2] */ 399224fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(4), /* [3] */ 399324fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 1), /* [4] */ 399424fe983aSKumar Kartikeya Dwivedi BTF_END_RAW, 399524fe983aSKumar Kartikeya Dwivedi }, 399624fe983aSKumar Kartikeya Dwivedi BTF_STR_SEC("\0tag\0tag"), 399724fe983aSKumar Kartikeya Dwivedi .map_type = BPF_MAP_TYPE_ARRAY, 399824fe983aSKumar Kartikeya Dwivedi .map_name = "tag_type_check_btf", 399924fe983aSKumar Kartikeya Dwivedi .key_size = sizeof(int), 400024fe983aSKumar Kartikeya Dwivedi .value_size = 4, 400124fe983aSKumar Kartikeya Dwivedi .key_type_id = 1, 400224fe983aSKumar Kartikeya Dwivedi .value_type_id = 1, 400324fe983aSKumar Kartikeya Dwivedi .max_entries = 1, 400424fe983aSKumar Kartikeya Dwivedi .btf_load_err = true, 400524fe983aSKumar Kartikeya Dwivedi .err_str = "Type tags don't precede modifiers", 400624fe983aSKumar Kartikeya Dwivedi }, 400724fe983aSKumar Kartikeya Dwivedi { 400824fe983aSKumar Kartikeya Dwivedi .descr = "type_tag test #4, type tag order", 400924fe983aSKumar Kartikeya Dwivedi .raw_types = { 401024fe983aSKumar Kartikeya Dwivedi BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 401124fe983aSKumar Kartikeya Dwivedi BTF_TYPEDEF_ENC(NAME_TBD, 3), /* [2] */ 401224fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(4), /* [3] */ 401324fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 1), /* [4] */ 401424fe983aSKumar Kartikeya Dwivedi BTF_END_RAW, 401524fe983aSKumar Kartikeya Dwivedi }, 401624fe983aSKumar Kartikeya Dwivedi BTF_STR_SEC("\0tag\0tag"), 401724fe983aSKumar Kartikeya Dwivedi .map_type = BPF_MAP_TYPE_ARRAY, 401824fe983aSKumar Kartikeya Dwivedi .map_name = "tag_type_check_btf", 401924fe983aSKumar Kartikeya Dwivedi .key_size = sizeof(int), 402024fe983aSKumar Kartikeya Dwivedi .value_size = 4, 402124fe983aSKumar Kartikeya Dwivedi .key_type_id = 1, 402224fe983aSKumar Kartikeya Dwivedi .value_type_id = 1, 402324fe983aSKumar Kartikeya Dwivedi .max_entries = 1, 402424fe983aSKumar Kartikeya Dwivedi .btf_load_err = true, 402524fe983aSKumar Kartikeya Dwivedi .err_str = "Type tags don't precede modifiers", 402624fe983aSKumar Kartikeya Dwivedi }, 402724fe983aSKumar Kartikeya Dwivedi { 402824fe983aSKumar Kartikeya Dwivedi .descr = "type_tag test #5, type tag order", 402924fe983aSKumar Kartikeya Dwivedi .raw_types = { 403024fe983aSKumar Kartikeya Dwivedi BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 403124fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 3), /* [2] */ 403224fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(1), /* [3] */ 403324fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 2), /* [4] */ 403424fe983aSKumar Kartikeya Dwivedi BTF_END_RAW, 403524fe983aSKumar Kartikeya Dwivedi }, 403624fe983aSKumar Kartikeya Dwivedi BTF_STR_SEC("\0tag\0tag"), 403724fe983aSKumar Kartikeya Dwivedi .map_type = BPF_MAP_TYPE_ARRAY, 403824fe983aSKumar Kartikeya Dwivedi .map_name = "tag_type_check_btf", 403924fe983aSKumar Kartikeya Dwivedi .key_size = sizeof(int), 404024fe983aSKumar Kartikeya Dwivedi .value_size = 4, 404124fe983aSKumar Kartikeya Dwivedi .key_type_id = 1, 404224fe983aSKumar Kartikeya Dwivedi .value_type_id = 1, 404324fe983aSKumar Kartikeya Dwivedi .max_entries = 1, 404424fe983aSKumar Kartikeya Dwivedi }, 404524fe983aSKumar Kartikeya Dwivedi { 404624fe983aSKumar Kartikeya Dwivedi .descr = "type_tag test #6, type tag order", 404724fe983aSKumar Kartikeya Dwivedi .raw_types = { 404824fe983aSKumar Kartikeya Dwivedi BTF_PTR_ENC(2), /* [1] */ 404924fe983aSKumar Kartikeya Dwivedi BTF_TYPE_TAG_ENC(NAME_TBD, 3), /* [2] */ 405024fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(4), /* [3] */ 405124fe983aSKumar Kartikeya Dwivedi BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [4] */ 405224fe983aSKumar Kartikeya Dwivedi BTF_PTR_ENC(6), /* [5] */ 405324fe983aSKumar Kartikeya Dwivedi BTF_CONST_ENC(2), /* [6] */ 405424fe983aSKumar Kartikeya Dwivedi BTF_END_RAW, 405524fe983aSKumar Kartikeya Dwivedi }, 405624fe983aSKumar Kartikeya Dwivedi BTF_STR_SEC("\0tag"), 405724fe983aSKumar Kartikeya Dwivedi .map_type = BPF_MAP_TYPE_ARRAY, 405824fe983aSKumar Kartikeya Dwivedi .map_name = "tag_type_check_btf", 405924fe983aSKumar Kartikeya Dwivedi .key_size = sizeof(int), 406024fe983aSKumar Kartikeya Dwivedi .value_size = 4, 406124fe983aSKumar Kartikeya Dwivedi .key_type_id = 1, 406224fe983aSKumar Kartikeya Dwivedi .value_type_id = 1, 406324fe983aSKumar Kartikeya Dwivedi .max_entries = 1, 406424fe983aSKumar Kartikeya Dwivedi .btf_load_err = true, 406524fe983aSKumar Kartikeya Dwivedi .err_str = "Type tags don't precede modifiers", 406624fe983aSKumar Kartikeya Dwivedi }, 40673b532518SYonghong Song { 40683b532518SYonghong Song .descr = "enum64 test #1, unsigned, size 8", 40693b532518SYonghong Song .raw_types = { 40703b532518SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 40713b532518SYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8), /* [2] */ 40723b532518SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 0, 0), 40733b532518SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 1, 1), 40743b532518SYonghong Song BTF_END_RAW, 40753b532518SYonghong Song }, 40763b532518SYonghong Song BTF_STR_SEC("\0a\0b\0c"), 40773b532518SYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 40783b532518SYonghong Song .map_name = "tag_type_check_btf", 40793b532518SYonghong Song .key_size = sizeof(int), 40803b532518SYonghong Song .value_size = 8, 40813b532518SYonghong Song .key_type_id = 1, 40823b532518SYonghong Song .value_type_id = 2, 40833b532518SYonghong Song .max_entries = 1, 40843b532518SYonghong Song }, 40853b532518SYonghong Song { 40863b532518SYonghong Song .descr = "enum64 test #2, signed, size 4", 40873b532518SYonghong Song .raw_types = { 40883b532518SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 40893b532518SYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 1, 2), 4), /* [2] */ 40903b532518SYonghong Song BTF_ENUM64_ENC(NAME_TBD, -1, 0), 40913b532518SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 1, 0), 40923b532518SYonghong Song BTF_END_RAW, 40933b532518SYonghong Song }, 40943b532518SYonghong Song BTF_STR_SEC("\0a\0b\0c"), 40953b532518SYonghong Song .map_type = BPF_MAP_TYPE_ARRAY, 40963b532518SYonghong Song .map_name = "tag_type_check_btf", 40973b532518SYonghong Song .key_size = sizeof(int), 40983b532518SYonghong Song .value_size = 4, 40993b532518SYonghong Song .key_type_id = 1, 41003b532518SYonghong Song .value_type_id = 2, 41013b532518SYonghong Song .max_entries = 1, 41023b532518SYonghong Song }, 410335baba7aSYonghong Song 4104c64779e2SAndrii Nakryiko }; /* struct btf_raw_test raw_tests[] */ 4105c64779e2SAndrii Nakryiko 4106c64779e2SAndrii Nakryiko static const char *get_next_str(const char *start, const char *end) 4107c64779e2SAndrii Nakryiko { 4108c64779e2SAndrii Nakryiko return start < end - 1 ? start + 1 : NULL; 4109c64779e2SAndrii Nakryiko } 4110c64779e2SAndrii Nakryiko 4111c64779e2SAndrii Nakryiko static int get_raw_sec_size(const __u32 *raw_types) 4112c64779e2SAndrii Nakryiko { 4113c64779e2SAndrii Nakryiko int i; 4114c64779e2SAndrii Nakryiko 4115c64779e2SAndrii Nakryiko for (i = MAX_NR_RAW_U32 - 1; 4116c64779e2SAndrii Nakryiko i >= 0 && raw_types[i] != BTF_END_RAW; 4117c64779e2SAndrii Nakryiko i--) 4118c64779e2SAndrii Nakryiko ; 4119c64779e2SAndrii Nakryiko 4120c64779e2SAndrii Nakryiko return i < 0 ? i : i * sizeof(raw_types[0]); 4121c64779e2SAndrii Nakryiko } 4122c64779e2SAndrii Nakryiko 4123c64779e2SAndrii Nakryiko static void *btf_raw_create(const struct btf_header *hdr, 4124c64779e2SAndrii Nakryiko const __u32 *raw_types, 4125c64779e2SAndrii Nakryiko const char *str, 4126c64779e2SAndrii Nakryiko unsigned int str_sec_size, 4127c64779e2SAndrii Nakryiko unsigned int *btf_size, 4128c64779e2SAndrii Nakryiko const char **ret_next_str) 4129c64779e2SAndrii Nakryiko { 4130c64779e2SAndrii Nakryiko const char *next_str = str, *end_str = str + str_sec_size; 4131c64779e2SAndrii Nakryiko const char **strs_idx = NULL, **tmp_strs_idx; 4132c64779e2SAndrii Nakryiko int strs_cap = 0, strs_cnt = 0, next_str_idx = 0; 4133c64779e2SAndrii Nakryiko unsigned int size_needed, offset; 4134c64779e2SAndrii Nakryiko struct btf_header *ret_hdr; 4135c64779e2SAndrii Nakryiko int i, type_sec_size, err = 0; 4136c64779e2SAndrii Nakryiko uint32_t *ret_types; 4137c64779e2SAndrii Nakryiko void *raw_btf = NULL; 4138c64779e2SAndrii Nakryiko 4139c64779e2SAndrii Nakryiko type_sec_size = get_raw_sec_size(raw_types); 4140c64779e2SAndrii Nakryiko if (CHECK(type_sec_size < 0, "Cannot get nr_raw_types")) 4141c64779e2SAndrii Nakryiko return NULL; 4142c64779e2SAndrii Nakryiko 4143c64779e2SAndrii Nakryiko size_needed = sizeof(*hdr) + type_sec_size + str_sec_size; 4144c64779e2SAndrii Nakryiko raw_btf = malloc(size_needed); 4145c64779e2SAndrii Nakryiko if (CHECK(!raw_btf, "Cannot allocate memory for raw_btf")) 4146c64779e2SAndrii Nakryiko return NULL; 4147c64779e2SAndrii Nakryiko 4148c64779e2SAndrii Nakryiko /* Copy header */ 4149c64779e2SAndrii Nakryiko memcpy(raw_btf, hdr, sizeof(*hdr)); 4150c64779e2SAndrii Nakryiko offset = sizeof(*hdr); 4151c64779e2SAndrii Nakryiko 4152c64779e2SAndrii Nakryiko /* Index strings */ 4153c64779e2SAndrii Nakryiko while ((next_str = get_next_str(next_str, end_str))) { 4154c64779e2SAndrii Nakryiko if (strs_cnt == strs_cap) { 4155c64779e2SAndrii Nakryiko strs_cap += max(16, strs_cap / 2); 4156c64779e2SAndrii Nakryiko tmp_strs_idx = realloc(strs_idx, 4157c64779e2SAndrii Nakryiko sizeof(*strs_idx) * strs_cap); 4158c64779e2SAndrii Nakryiko if (CHECK(!tmp_strs_idx, 4159c64779e2SAndrii Nakryiko "Cannot allocate memory for strs_idx")) { 4160c64779e2SAndrii Nakryiko err = -1; 4161c64779e2SAndrii Nakryiko goto done; 4162c64779e2SAndrii Nakryiko } 4163c64779e2SAndrii Nakryiko strs_idx = tmp_strs_idx; 4164c64779e2SAndrii Nakryiko } 4165c64779e2SAndrii Nakryiko strs_idx[strs_cnt++] = next_str; 4166c64779e2SAndrii Nakryiko next_str += strlen(next_str); 4167c64779e2SAndrii Nakryiko } 4168c64779e2SAndrii Nakryiko 4169c64779e2SAndrii Nakryiko /* Copy type section */ 4170c64779e2SAndrii Nakryiko ret_types = raw_btf + offset; 4171c64779e2SAndrii Nakryiko for (i = 0; i < type_sec_size / sizeof(raw_types[0]); i++) { 4172c64779e2SAndrii Nakryiko if (raw_types[i] == NAME_TBD) { 4173c64779e2SAndrii Nakryiko if (CHECK(next_str_idx == strs_cnt, 4174c64779e2SAndrii Nakryiko "Error in getting next_str #%d", 4175c64779e2SAndrii Nakryiko next_str_idx)) { 4176c64779e2SAndrii Nakryiko err = -1; 4177c64779e2SAndrii Nakryiko goto done; 4178c64779e2SAndrii Nakryiko } 4179c64779e2SAndrii Nakryiko ret_types[i] = strs_idx[next_str_idx++] - str; 4180c64779e2SAndrii Nakryiko } else if (IS_NAME_NTH(raw_types[i])) { 4181c64779e2SAndrii Nakryiko int idx = GET_NAME_NTH_IDX(raw_types[i]); 4182c64779e2SAndrii Nakryiko 4183c64779e2SAndrii Nakryiko if (CHECK(idx <= 0 || idx > strs_cnt, 4184c64779e2SAndrii Nakryiko "Error getting string #%d, strs_cnt:%d", 4185c64779e2SAndrii Nakryiko idx, strs_cnt)) { 4186c64779e2SAndrii Nakryiko err = -1; 4187c64779e2SAndrii Nakryiko goto done; 4188c64779e2SAndrii Nakryiko } 4189c64779e2SAndrii Nakryiko ret_types[i] = strs_idx[idx-1] - str; 4190c64779e2SAndrii Nakryiko } else { 4191c64779e2SAndrii Nakryiko ret_types[i] = raw_types[i]; 4192c64779e2SAndrii Nakryiko } 4193c64779e2SAndrii Nakryiko } 4194c64779e2SAndrii Nakryiko offset += type_sec_size; 4195c64779e2SAndrii Nakryiko 4196c64779e2SAndrii Nakryiko /* Copy string section */ 4197c64779e2SAndrii Nakryiko memcpy(raw_btf + offset, str, str_sec_size); 4198c64779e2SAndrii Nakryiko 4199c64779e2SAndrii Nakryiko ret_hdr = (struct btf_header *)raw_btf; 4200c64779e2SAndrii Nakryiko ret_hdr->type_len = type_sec_size; 4201c64779e2SAndrii Nakryiko ret_hdr->str_off = type_sec_size; 4202c64779e2SAndrii Nakryiko ret_hdr->str_len = str_sec_size; 4203c64779e2SAndrii Nakryiko 4204c64779e2SAndrii Nakryiko *btf_size = size_needed; 4205c64779e2SAndrii Nakryiko if (ret_next_str) 4206c64779e2SAndrii Nakryiko *ret_next_str = 4207c64779e2SAndrii Nakryiko next_str_idx < strs_cnt ? strs_idx[next_str_idx] : NULL; 4208c64779e2SAndrii Nakryiko 4209c64779e2SAndrii Nakryiko done: 4210c64779e2SAndrii Nakryiko free(strs_idx); 42115309b516SAndrii Nakryiko if (err) { 42125309b516SAndrii Nakryiko free(raw_btf); 4213c64779e2SAndrii Nakryiko return NULL; 4214c64779e2SAndrii Nakryiko } 4215c64779e2SAndrii Nakryiko return raw_btf; 4216c64779e2SAndrii Nakryiko } 4217c64779e2SAndrii Nakryiko 4218dc94121bSAndrii Nakryiko static int load_raw_btf(const void *raw_data, size_t raw_size) 4219dc94121bSAndrii Nakryiko { 4220dc94121bSAndrii Nakryiko LIBBPF_OPTS(bpf_btf_load_opts, opts); 4221dc94121bSAndrii Nakryiko int btf_fd; 4222dc94121bSAndrii Nakryiko 4223dc94121bSAndrii Nakryiko if (always_log) { 4224dc94121bSAndrii Nakryiko opts.log_buf = btf_log_buf, 4225dc94121bSAndrii Nakryiko opts.log_size = BTF_LOG_BUF_SIZE, 4226dc94121bSAndrii Nakryiko opts.log_level = 1; 4227dc94121bSAndrii Nakryiko } 4228dc94121bSAndrii Nakryiko 4229dc94121bSAndrii Nakryiko btf_fd = bpf_btf_load(raw_data, raw_size, &opts); 4230dc94121bSAndrii Nakryiko if (btf_fd < 0 && !always_log) { 4231dc94121bSAndrii Nakryiko opts.log_buf = btf_log_buf, 4232dc94121bSAndrii Nakryiko opts.log_size = BTF_LOG_BUF_SIZE, 4233dc94121bSAndrii Nakryiko opts.log_level = 1; 4234dc94121bSAndrii Nakryiko btf_fd = bpf_btf_load(raw_data, raw_size, &opts); 4235dc94121bSAndrii Nakryiko } 4236dc94121bSAndrii Nakryiko 4237dc94121bSAndrii Nakryiko return btf_fd; 4238dc94121bSAndrii Nakryiko } 4239dc94121bSAndrii Nakryiko 4240c64779e2SAndrii Nakryiko static void do_test_raw(unsigned int test_num) 4241c64779e2SAndrii Nakryiko { 4242c64779e2SAndrii Nakryiko struct btf_raw_test *test = &raw_tests[test_num - 1]; 42432fe256a4SAndrii Nakryiko LIBBPF_OPTS(bpf_map_create_opts, opts); 4244c64779e2SAndrii Nakryiko int map_fd = -1, btf_fd = -1; 4245c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4246c64779e2SAndrii Nakryiko struct btf_header *hdr; 4247c64779e2SAndrii Nakryiko void *raw_btf; 4248c64779e2SAndrii Nakryiko int err; 4249c64779e2SAndrii Nakryiko 4250c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 4251c64779e2SAndrii Nakryiko return; 4252c64779e2SAndrii Nakryiko 4253c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4254c64779e2SAndrii Nakryiko test->raw_types, 4255c64779e2SAndrii Nakryiko test->str_sec, 4256c64779e2SAndrii Nakryiko test->str_sec_size, 4257c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4258c64779e2SAndrii Nakryiko if (!raw_btf) 4259c64779e2SAndrii Nakryiko return; 4260c64779e2SAndrii Nakryiko 4261c64779e2SAndrii Nakryiko hdr = raw_btf; 4262c64779e2SAndrii Nakryiko 4263c64779e2SAndrii Nakryiko hdr->hdr_len = (int)hdr->hdr_len + test->hdr_len_delta; 4264c64779e2SAndrii Nakryiko hdr->type_off = (int)hdr->type_off + test->type_off_delta; 4265c64779e2SAndrii Nakryiko hdr->str_off = (int)hdr->str_off + test->str_off_delta; 4266c64779e2SAndrii Nakryiko hdr->str_len = (int)hdr->str_len + test->str_len_delta; 4267c64779e2SAndrii Nakryiko 4268c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4269dc94121bSAndrii Nakryiko btf_fd = load_raw_btf(raw_btf, raw_btf_size); 4270c64779e2SAndrii Nakryiko free(raw_btf); 4271c64779e2SAndrii Nakryiko 4272bad2e478SAndrii Nakryiko err = ((btf_fd < 0) != test->btf_load_err); 4273c64779e2SAndrii Nakryiko if (CHECK(err, "btf_fd:%d test->btf_load_err:%u", 4274c64779e2SAndrii Nakryiko btf_fd, test->btf_load_err) || 4275c64779e2SAndrii Nakryiko CHECK(test->err_str && !strstr(btf_log_buf, test->err_str), 4276dc94121bSAndrii Nakryiko "expected err_str:%s\n", test->err_str)) { 4277c64779e2SAndrii Nakryiko err = -1; 4278c64779e2SAndrii Nakryiko goto done; 4279c64779e2SAndrii Nakryiko } 4280c64779e2SAndrii Nakryiko 4281bad2e478SAndrii Nakryiko if (err || btf_fd < 0) 4282c64779e2SAndrii Nakryiko goto done; 4283c64779e2SAndrii Nakryiko 42842fe256a4SAndrii Nakryiko opts.btf_fd = btf_fd; 42852fe256a4SAndrii Nakryiko opts.btf_key_type_id = test->key_type_id; 42862fe256a4SAndrii Nakryiko opts.btf_value_type_id = test->value_type_id; 42872fe256a4SAndrii Nakryiko map_fd = bpf_map_create(test->map_type, test->map_name, 42882fe256a4SAndrii Nakryiko test->key_size, test->value_size, test->max_entries, &opts); 4289c64779e2SAndrii Nakryiko 4290bad2e478SAndrii Nakryiko err = ((map_fd < 0) != test->map_create_err); 4291c64779e2SAndrii Nakryiko CHECK(err, "map_fd:%d test->map_create_err:%u", 4292c64779e2SAndrii Nakryiko map_fd, test->map_create_err); 4293c64779e2SAndrii Nakryiko 4294c64779e2SAndrii Nakryiko done: 4295c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4296c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4297bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4298c64779e2SAndrii Nakryiko close(btf_fd); 4299bad2e478SAndrii Nakryiko if (map_fd >= 0) 4300c64779e2SAndrii Nakryiko close(map_fd); 4301c64779e2SAndrii Nakryiko } 4302c64779e2SAndrii Nakryiko 4303c64779e2SAndrii Nakryiko struct btf_get_info_test { 4304c64779e2SAndrii Nakryiko const char *descr; 4305c64779e2SAndrii Nakryiko const char *str_sec; 4306c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 4307c64779e2SAndrii Nakryiko __u32 str_sec_size; 4308c64779e2SAndrii Nakryiko int btf_size_delta; 4309c64779e2SAndrii Nakryiko int (*special_test)(unsigned int test_num); 4310c64779e2SAndrii Nakryiko }; 4311c64779e2SAndrii Nakryiko 4312c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num); 4313c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num); 4314c64779e2SAndrii Nakryiko 4315c64779e2SAndrii Nakryiko const struct btf_get_info_test get_info_tests[] = { 4316c64779e2SAndrii Nakryiko { 4317c64779e2SAndrii Nakryiko .descr = "== raw_btf_size+1", 4318c64779e2SAndrii Nakryiko .raw_types = { 4319c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4320c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4321c64779e2SAndrii Nakryiko BTF_END_RAW, 4322c64779e2SAndrii Nakryiko }, 4323c64779e2SAndrii Nakryiko .str_sec = "", 4324c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4325c64779e2SAndrii Nakryiko .btf_size_delta = 1, 4326c64779e2SAndrii Nakryiko }, 4327c64779e2SAndrii Nakryiko { 4328c64779e2SAndrii Nakryiko .descr = "== raw_btf_size-3", 4329c64779e2SAndrii Nakryiko .raw_types = { 4330c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4331c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4332c64779e2SAndrii Nakryiko BTF_END_RAW, 4333c64779e2SAndrii Nakryiko }, 4334c64779e2SAndrii Nakryiko .str_sec = "", 4335c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4336c64779e2SAndrii Nakryiko .btf_size_delta = -3, 4337c64779e2SAndrii Nakryiko }, 4338c64779e2SAndrii Nakryiko { 4339c64779e2SAndrii Nakryiko .descr = "Large bpf_btf_info", 4340c64779e2SAndrii Nakryiko .raw_types = { 4341c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4342c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4343c64779e2SAndrii Nakryiko BTF_END_RAW, 4344c64779e2SAndrii Nakryiko }, 4345c64779e2SAndrii Nakryiko .str_sec = "", 4346c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4347c64779e2SAndrii Nakryiko .special_test = test_big_btf_info, 4348c64779e2SAndrii Nakryiko }, 4349c64779e2SAndrii Nakryiko { 4350c64779e2SAndrii Nakryiko .descr = "BTF ID", 4351c64779e2SAndrii Nakryiko .raw_types = { 4352c64779e2SAndrii Nakryiko /* int */ /* [1] */ 4353c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), 4354c64779e2SAndrii Nakryiko /* unsigned int */ /* [2] */ 4355c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), 4356c64779e2SAndrii Nakryiko BTF_END_RAW, 4357c64779e2SAndrii Nakryiko }, 4358c64779e2SAndrii Nakryiko .str_sec = "", 4359c64779e2SAndrii Nakryiko .str_sec_size = sizeof(""), 4360c64779e2SAndrii Nakryiko .special_test = test_btf_id, 4361c64779e2SAndrii Nakryiko }, 4362c64779e2SAndrii Nakryiko }; 4363c64779e2SAndrii Nakryiko 4364c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num) 4365c64779e2SAndrii Nakryiko { 4366c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 4367c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf = NULL; 4368c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4369c64779e2SAndrii Nakryiko struct { 4370c64779e2SAndrii Nakryiko struct bpf_btf_info info; 4371c64779e2SAndrii Nakryiko uint64_t garbage; 4372c64779e2SAndrii Nakryiko } info_garbage; 4373c64779e2SAndrii Nakryiko struct bpf_btf_info *info; 4374c64779e2SAndrii Nakryiko int btf_fd = -1, err; 4375c64779e2SAndrii Nakryiko uint32_t info_len; 4376c64779e2SAndrii Nakryiko 4377c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4378c64779e2SAndrii Nakryiko test->raw_types, 4379c64779e2SAndrii Nakryiko test->str_sec, 4380c64779e2SAndrii Nakryiko test->str_sec_size, 4381c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4382c64779e2SAndrii Nakryiko 4383c64779e2SAndrii Nakryiko if (!raw_btf) 4384c64779e2SAndrii Nakryiko return -1; 4385c64779e2SAndrii Nakryiko 4386c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4387c64779e2SAndrii Nakryiko 4388c64779e2SAndrii Nakryiko user_btf = malloc(raw_btf_size); 4389c64779e2SAndrii Nakryiko if (CHECK(!user_btf, "!user_btf")) { 4390c64779e2SAndrii Nakryiko err = -1; 4391c64779e2SAndrii Nakryiko goto done; 4392c64779e2SAndrii Nakryiko } 4393c64779e2SAndrii Nakryiko 4394dc94121bSAndrii Nakryiko btf_fd = load_raw_btf(raw_btf, raw_btf_size); 4395bad2e478SAndrii Nakryiko if (CHECK(btf_fd < 0, "errno:%d", errno)) { 4396c64779e2SAndrii Nakryiko err = -1; 4397c64779e2SAndrii Nakryiko goto done; 4398c64779e2SAndrii Nakryiko } 4399c64779e2SAndrii Nakryiko 4400c64779e2SAndrii Nakryiko /* 4401c64779e2SAndrii Nakryiko * GET_INFO should error out if the userspace info 4402c64779e2SAndrii Nakryiko * has non zero tailing bytes. 4403c64779e2SAndrii Nakryiko */ 4404c64779e2SAndrii Nakryiko info = &info_garbage.info; 4405c64779e2SAndrii Nakryiko memset(info, 0, sizeof(*info)); 4406c64779e2SAndrii Nakryiko info_garbage.garbage = 0xdeadbeef; 4407c64779e2SAndrii Nakryiko info_len = sizeof(info_garbage); 4408c64779e2SAndrii Nakryiko info->btf = ptr_to_u64(user_btf); 4409c64779e2SAndrii Nakryiko info->btf_size = raw_btf_size; 4410c64779e2SAndrii Nakryiko 4411c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len); 4412c64779e2SAndrii Nakryiko if (CHECK(!err, "!err")) { 4413c64779e2SAndrii Nakryiko err = -1; 4414c64779e2SAndrii Nakryiko goto done; 4415c64779e2SAndrii Nakryiko } 4416c64779e2SAndrii Nakryiko 4417c64779e2SAndrii Nakryiko /* 4418c64779e2SAndrii Nakryiko * GET_INFO should succeed even info_len is larger than 4419c64779e2SAndrii Nakryiko * the kernel supported as long as tailing bytes are zero. 4420c64779e2SAndrii Nakryiko * The kernel supported info len should also be returned 4421c64779e2SAndrii Nakryiko * to userspace. 4422c64779e2SAndrii Nakryiko */ 4423c64779e2SAndrii Nakryiko info_garbage.garbage = 0; 4424c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len); 4425c64779e2SAndrii Nakryiko if (CHECK(err || info_len != sizeof(*info), 4426c64779e2SAndrii Nakryiko "err:%d errno:%d info_len:%u sizeof(*info):%zu", 4427c64779e2SAndrii Nakryiko err, errno, info_len, sizeof(*info))) { 4428c64779e2SAndrii Nakryiko err = -1; 4429c64779e2SAndrii Nakryiko goto done; 4430c64779e2SAndrii Nakryiko } 4431c64779e2SAndrii Nakryiko 4432c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4433c64779e2SAndrii Nakryiko 4434c64779e2SAndrii Nakryiko done: 4435c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4436c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4437c64779e2SAndrii Nakryiko 4438c64779e2SAndrii Nakryiko free(raw_btf); 4439c64779e2SAndrii Nakryiko free(user_btf); 4440c64779e2SAndrii Nakryiko 4441bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4442c64779e2SAndrii Nakryiko close(btf_fd); 4443c64779e2SAndrii Nakryiko 4444c64779e2SAndrii Nakryiko return err; 4445c64779e2SAndrii Nakryiko } 4446c64779e2SAndrii Nakryiko 4447c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num) 4448c64779e2SAndrii Nakryiko { 4449c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 44502fe256a4SAndrii Nakryiko LIBBPF_OPTS(bpf_map_create_opts, opts); 4451c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf[2] = {}; 4452c64779e2SAndrii Nakryiko int btf_fd[2] = {-1, -1}, map_fd = -1; 4453c64779e2SAndrii Nakryiko struct bpf_map_info map_info = {}; 4454c64779e2SAndrii Nakryiko struct bpf_btf_info info[2] = {}; 4455c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 4456c64779e2SAndrii Nakryiko uint32_t info_len; 4457c64779e2SAndrii Nakryiko int err, i, ret; 4458c64779e2SAndrii Nakryiko 4459c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4460c64779e2SAndrii Nakryiko test->raw_types, 4461c64779e2SAndrii Nakryiko test->str_sec, 4462c64779e2SAndrii Nakryiko test->str_sec_size, 4463c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4464c64779e2SAndrii Nakryiko 4465c64779e2SAndrii Nakryiko if (!raw_btf) 4466c64779e2SAndrii Nakryiko return -1; 4467c64779e2SAndrii Nakryiko 4468c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4469c64779e2SAndrii Nakryiko 4470c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4471c64779e2SAndrii Nakryiko user_btf[i] = malloc(raw_btf_size); 4472c64779e2SAndrii Nakryiko if (CHECK(!user_btf[i], "!user_btf[%d]", i)) { 4473c64779e2SAndrii Nakryiko err = -1; 4474c64779e2SAndrii Nakryiko goto done; 4475c64779e2SAndrii Nakryiko } 4476c64779e2SAndrii Nakryiko info[i].btf = ptr_to_u64(user_btf[i]); 4477c64779e2SAndrii Nakryiko info[i].btf_size = raw_btf_size; 4478c64779e2SAndrii Nakryiko } 4479c64779e2SAndrii Nakryiko 4480dc94121bSAndrii Nakryiko btf_fd[0] = load_raw_btf(raw_btf, raw_btf_size); 4481bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) { 4482c64779e2SAndrii Nakryiko err = -1; 4483c64779e2SAndrii Nakryiko goto done; 4484c64779e2SAndrii Nakryiko } 4485c64779e2SAndrii Nakryiko 4486c64779e2SAndrii Nakryiko /* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */ 4487c64779e2SAndrii Nakryiko info_len = sizeof(info[0]); 4488c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd[0], &info[0], &info_len); 4489c64779e2SAndrii Nakryiko if (CHECK(err, "errno:%d", errno)) { 4490c64779e2SAndrii Nakryiko err = -1; 4491c64779e2SAndrii Nakryiko goto done; 4492c64779e2SAndrii Nakryiko } 4493c64779e2SAndrii Nakryiko 4494c64779e2SAndrii Nakryiko btf_fd[1] = bpf_btf_get_fd_by_id(info[0].id); 4495bad2e478SAndrii Nakryiko if (CHECK(btf_fd[1] < 0, "errno:%d", errno)) { 4496c64779e2SAndrii Nakryiko err = -1; 4497c64779e2SAndrii Nakryiko goto done; 4498c64779e2SAndrii Nakryiko } 4499c64779e2SAndrii Nakryiko 4500c64779e2SAndrii Nakryiko ret = 0; 4501c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd[1], &info[1], &info_len); 4502c64779e2SAndrii Nakryiko if (CHECK(err || info[0].id != info[1].id || 4503c64779e2SAndrii Nakryiko info[0].btf_size != info[1].btf_size || 4504c64779e2SAndrii Nakryiko (ret = memcmp(user_btf[0], user_btf[1], info[0].btf_size)), 4505c64779e2SAndrii Nakryiko "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d", 4506c64779e2SAndrii Nakryiko err, errno, info[0].id, info[1].id, 4507c64779e2SAndrii Nakryiko info[0].btf_size, info[1].btf_size, ret)) { 4508c64779e2SAndrii Nakryiko err = -1; 4509c64779e2SAndrii Nakryiko goto done; 4510c64779e2SAndrii Nakryiko } 4511c64779e2SAndrii Nakryiko 4512c64779e2SAndrii Nakryiko /* Test btf members in struct bpf_map_info */ 45132fe256a4SAndrii Nakryiko opts.btf_fd = btf_fd[0]; 45142fe256a4SAndrii Nakryiko opts.btf_key_type_id = 1; 45152fe256a4SAndrii Nakryiko opts.btf_value_type_id = 2; 45162fe256a4SAndrii Nakryiko map_fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "test_btf_id", 45172fe256a4SAndrii Nakryiko sizeof(int), sizeof(int), 4, &opts); 4518bad2e478SAndrii Nakryiko if (CHECK(map_fd < 0, "errno:%d", errno)) { 4519c64779e2SAndrii Nakryiko err = -1; 4520c64779e2SAndrii Nakryiko goto done; 4521c64779e2SAndrii Nakryiko } 4522c64779e2SAndrii Nakryiko 4523c64779e2SAndrii Nakryiko info_len = sizeof(map_info); 4524c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(map_fd, &map_info, &info_len); 4525c64779e2SAndrii Nakryiko if (CHECK(err || map_info.btf_id != info[0].id || 4526c64779e2SAndrii Nakryiko map_info.btf_key_type_id != 1 || map_info.btf_value_type_id != 2, 4527c64779e2SAndrii Nakryiko "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u", 4528c64779e2SAndrii Nakryiko err, errno, info[0].id, map_info.btf_id, map_info.btf_key_type_id, 4529c64779e2SAndrii Nakryiko map_info.btf_value_type_id)) { 4530c64779e2SAndrii Nakryiko err = -1; 4531c64779e2SAndrii Nakryiko goto done; 4532c64779e2SAndrii Nakryiko } 4533c64779e2SAndrii Nakryiko 4534c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4535c64779e2SAndrii Nakryiko close(btf_fd[i]); 4536c64779e2SAndrii Nakryiko btf_fd[i] = -1; 4537c64779e2SAndrii Nakryiko } 4538c64779e2SAndrii Nakryiko 4539c64779e2SAndrii Nakryiko /* Test BTF ID is removed from the kernel */ 4540c64779e2SAndrii Nakryiko btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id); 4541bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) { 4542c64779e2SAndrii Nakryiko err = -1; 4543c64779e2SAndrii Nakryiko goto done; 4544c64779e2SAndrii Nakryiko } 4545c64779e2SAndrii Nakryiko close(btf_fd[0]); 4546c64779e2SAndrii Nakryiko btf_fd[0] = -1; 4547c64779e2SAndrii Nakryiko 4548c64779e2SAndrii Nakryiko /* The map holds the last ref to BTF and its btf_id */ 4549c64779e2SAndrii Nakryiko close(map_fd); 4550c64779e2SAndrii Nakryiko map_fd = -1; 4551c64779e2SAndrii Nakryiko btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id); 4552bad2e478SAndrii Nakryiko if (CHECK(btf_fd[0] >= 0, "BTF lingers")) { 4553c64779e2SAndrii Nakryiko err = -1; 4554c64779e2SAndrii Nakryiko goto done; 4555c64779e2SAndrii Nakryiko } 4556c64779e2SAndrii Nakryiko 4557c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4558c64779e2SAndrii Nakryiko 4559c64779e2SAndrii Nakryiko done: 4560c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4561c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4562c64779e2SAndrii Nakryiko 4563c64779e2SAndrii Nakryiko free(raw_btf); 4564bad2e478SAndrii Nakryiko if (map_fd >= 0) 4565c64779e2SAndrii Nakryiko close(map_fd); 4566c64779e2SAndrii Nakryiko for (i = 0; i < 2; i++) { 4567c64779e2SAndrii Nakryiko free(user_btf[i]); 4568bad2e478SAndrii Nakryiko if (btf_fd[i] >= 0) 4569c64779e2SAndrii Nakryiko close(btf_fd[i]); 4570c64779e2SAndrii Nakryiko } 4571c64779e2SAndrii Nakryiko 4572c64779e2SAndrii Nakryiko return err; 4573c64779e2SAndrii Nakryiko } 4574c64779e2SAndrii Nakryiko 4575c64779e2SAndrii Nakryiko static void do_test_get_info(unsigned int test_num) 4576c64779e2SAndrii Nakryiko { 4577c64779e2SAndrii Nakryiko const struct btf_get_info_test *test = &get_info_tests[test_num - 1]; 4578c64779e2SAndrii Nakryiko unsigned int raw_btf_size, user_btf_size, expected_nbytes; 4579c64779e2SAndrii Nakryiko uint8_t *raw_btf = NULL, *user_btf = NULL; 4580c64779e2SAndrii Nakryiko struct bpf_btf_info info = {}; 4581c64779e2SAndrii Nakryiko int btf_fd = -1, err, ret; 4582c64779e2SAndrii Nakryiko uint32_t info_len; 4583c64779e2SAndrii Nakryiko 4584c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 4585c64779e2SAndrii Nakryiko return; 4586c64779e2SAndrii Nakryiko 4587c64779e2SAndrii Nakryiko if (test->special_test) { 4588c64779e2SAndrii Nakryiko err = test->special_test(test_num); 4589c64779e2SAndrii Nakryiko if (CHECK(err, "failed: %d\n", err)) 4590c64779e2SAndrii Nakryiko return; 4591c64779e2SAndrii Nakryiko } 4592c64779e2SAndrii Nakryiko 4593c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, 4594c64779e2SAndrii Nakryiko test->raw_types, 4595c64779e2SAndrii Nakryiko test->str_sec, 4596c64779e2SAndrii Nakryiko test->str_sec_size, 4597c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 4598c64779e2SAndrii Nakryiko 4599c64779e2SAndrii Nakryiko if (!raw_btf) 4600c64779e2SAndrii Nakryiko return; 4601c64779e2SAndrii Nakryiko 4602c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 4603c64779e2SAndrii Nakryiko 4604c64779e2SAndrii Nakryiko user_btf = malloc(raw_btf_size); 4605c64779e2SAndrii Nakryiko if (CHECK(!user_btf, "!user_btf")) { 4606c64779e2SAndrii Nakryiko err = -1; 4607c64779e2SAndrii Nakryiko goto done; 4608c64779e2SAndrii Nakryiko } 4609c64779e2SAndrii Nakryiko 4610dc94121bSAndrii Nakryiko btf_fd = load_raw_btf(raw_btf, raw_btf_size); 4611bad2e478SAndrii Nakryiko if (CHECK(btf_fd <= 0, "errno:%d", errno)) { 4612c64779e2SAndrii Nakryiko err = -1; 4613c64779e2SAndrii Nakryiko goto done; 4614c64779e2SAndrii Nakryiko } 4615c64779e2SAndrii Nakryiko 4616c64779e2SAndrii Nakryiko user_btf_size = (int)raw_btf_size + test->btf_size_delta; 4617c64779e2SAndrii Nakryiko expected_nbytes = min(raw_btf_size, user_btf_size); 4618c64779e2SAndrii Nakryiko if (raw_btf_size > expected_nbytes) 4619c64779e2SAndrii Nakryiko memset(user_btf + expected_nbytes, 0xff, 4620c64779e2SAndrii Nakryiko raw_btf_size - expected_nbytes); 4621c64779e2SAndrii Nakryiko 4622c64779e2SAndrii Nakryiko info_len = sizeof(info); 4623c64779e2SAndrii Nakryiko info.btf = ptr_to_u64(user_btf); 4624c64779e2SAndrii Nakryiko info.btf_size = user_btf_size; 4625c64779e2SAndrii Nakryiko 4626c64779e2SAndrii Nakryiko ret = 0; 4627c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(btf_fd, &info, &info_len); 4628c64779e2SAndrii Nakryiko if (CHECK(err || !info.id || info_len != sizeof(info) || 4629c64779e2SAndrii Nakryiko info.btf_size != raw_btf_size || 4630c64779e2SAndrii Nakryiko (ret = memcmp(raw_btf, user_btf, expected_nbytes)), 4631c64779e2SAndrii 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", 4632c64779e2SAndrii Nakryiko err, errno, info.id, info_len, sizeof(info), 4633c64779e2SAndrii Nakryiko raw_btf_size, info.btf_size, expected_nbytes, ret)) { 4634c64779e2SAndrii Nakryiko err = -1; 4635c64779e2SAndrii Nakryiko goto done; 4636c64779e2SAndrii Nakryiko } 4637c64779e2SAndrii Nakryiko 4638c64779e2SAndrii Nakryiko while (expected_nbytes < raw_btf_size) { 4639c64779e2SAndrii Nakryiko fprintf(stderr, "%u...", expected_nbytes); 4640c64779e2SAndrii Nakryiko if (CHECK(user_btf[expected_nbytes++] != 0xff, 4641c64779e2SAndrii Nakryiko "user_btf[%u]:%x != 0xff", expected_nbytes - 1, 4642c64779e2SAndrii Nakryiko user_btf[expected_nbytes - 1])) { 4643c64779e2SAndrii Nakryiko err = -1; 4644c64779e2SAndrii Nakryiko goto done; 4645c64779e2SAndrii Nakryiko } 4646c64779e2SAndrii Nakryiko } 4647c64779e2SAndrii Nakryiko 4648c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4649c64779e2SAndrii Nakryiko 4650c64779e2SAndrii Nakryiko done: 4651c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 4652c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 4653c64779e2SAndrii Nakryiko 4654c64779e2SAndrii Nakryiko free(raw_btf); 4655c64779e2SAndrii Nakryiko free(user_btf); 4656c64779e2SAndrii Nakryiko 4657bad2e478SAndrii Nakryiko if (btf_fd >= 0) 4658c64779e2SAndrii Nakryiko close(btf_fd); 4659c64779e2SAndrii Nakryiko } 4660c64779e2SAndrii Nakryiko 4661c64779e2SAndrii Nakryiko struct btf_file_test { 4662c64779e2SAndrii Nakryiko const char *file; 4663c64779e2SAndrii Nakryiko bool btf_kv_notfound; 4664c64779e2SAndrii Nakryiko }; 4665c64779e2SAndrii Nakryiko 4666c64779e2SAndrii Nakryiko static struct btf_file_test file_tests[] = { 4667afef88e6SDaniel Müller { .file = "test_btf_newkv.bpf.o", }, 4668afef88e6SDaniel Müller { .file = "test_btf_nokv.bpf.o", .btf_kv_notfound = true, }, 4669c64779e2SAndrii Nakryiko }; 4670c64779e2SAndrii Nakryiko 4671c64779e2SAndrii Nakryiko static void do_test_file(unsigned int test_num) 4672c64779e2SAndrii Nakryiko { 4673c64779e2SAndrii Nakryiko const struct btf_file_test *test = &file_tests[test_num - 1]; 4674c64779e2SAndrii Nakryiko const char *expected_fnames[] = {"_dummy_tracepoint", 4675c64779e2SAndrii Nakryiko "test_long_fname_1", 4676c64779e2SAndrii Nakryiko "test_long_fname_2"}; 4677c64779e2SAndrii Nakryiko struct btf_ext *btf_ext = NULL; 4678c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 4679c64779e2SAndrii Nakryiko struct bpf_object *obj = NULL; 4680c64779e2SAndrii Nakryiko struct bpf_func_info *finfo; 4681c64779e2SAndrii Nakryiko struct bpf_program *prog; 4682c64779e2SAndrii Nakryiko __u32 info_len, rec_size; 4683c64779e2SAndrii Nakryiko bool has_btf_ext = false; 4684c64779e2SAndrii Nakryiko struct btf *btf = NULL; 4685c64779e2SAndrii Nakryiko void *func_info = NULL; 4686c64779e2SAndrii Nakryiko struct bpf_map *map; 4687c64779e2SAndrii Nakryiko int i, err, prog_fd; 4688c64779e2SAndrii Nakryiko 4689c64779e2SAndrii Nakryiko if (!test__start_subtest(test->file)) 4690c64779e2SAndrii Nakryiko return; 4691c64779e2SAndrii Nakryiko 4692c64779e2SAndrii Nakryiko btf = btf__parse_elf(test->file, &btf_ext); 4693bad2e478SAndrii Nakryiko err = libbpf_get_error(btf); 4694bad2e478SAndrii Nakryiko if (err) { 4695bad2e478SAndrii Nakryiko if (err == -ENOENT) { 4696c64779e2SAndrii Nakryiko printf("%s:SKIP: No ELF %s found", __func__, BTF_ELF_SEC); 4697c64779e2SAndrii Nakryiko test__skip(); 4698c64779e2SAndrii Nakryiko return; 4699c64779e2SAndrii Nakryiko } 4700c64779e2SAndrii Nakryiko return; 4701c64779e2SAndrii Nakryiko } 4702c64779e2SAndrii Nakryiko btf__free(btf); 4703c64779e2SAndrii Nakryiko 4704c64779e2SAndrii Nakryiko has_btf_ext = btf_ext != NULL; 4705c64779e2SAndrii Nakryiko btf_ext__free(btf_ext); 4706c64779e2SAndrii Nakryiko 470793b8952dSAndrii Nakryiko /* temporary disable LIBBPF_STRICT_MAP_DEFINITIONS to test legacy maps */ 47082b9e2eadSMauricio Vásquez libbpf_set_strict_mode(LIBBPF_STRICT_ALL & ~LIBBPF_STRICT_MAP_DEFINITIONS); 4709c64779e2SAndrii Nakryiko obj = bpf_object__open(test->file); 4710bad2e478SAndrii Nakryiko err = libbpf_get_error(obj); 4711bad2e478SAndrii Nakryiko if (CHECK(err, "obj: %d", err)) 4712c64779e2SAndrii Nakryiko return; 4713c64779e2SAndrii Nakryiko 47146f2b219bSHengqi Chen prog = bpf_object__next_program(obj, NULL); 4715c64779e2SAndrii Nakryiko if (CHECK(!prog, "Cannot find bpf_prog")) { 4716c64779e2SAndrii Nakryiko err = -1; 4717c64779e2SAndrii Nakryiko goto done; 4718c64779e2SAndrii Nakryiko } 4719c64779e2SAndrii Nakryiko 4720c64779e2SAndrii Nakryiko bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT); 4721c64779e2SAndrii Nakryiko err = bpf_object__load(obj); 4722c64779e2SAndrii Nakryiko if (CHECK(err < 0, "bpf_object__load: %d", err)) 4723c64779e2SAndrii Nakryiko goto done; 4724c64779e2SAndrii Nakryiko prog_fd = bpf_program__fd(prog); 4725c64779e2SAndrii Nakryiko 4726c64779e2SAndrii Nakryiko map = bpf_object__find_map_by_name(obj, "btf_map"); 4727c64779e2SAndrii Nakryiko if (CHECK(!map, "btf_map not found")) { 4728c64779e2SAndrii Nakryiko err = -1; 4729c64779e2SAndrii Nakryiko goto done; 4730c64779e2SAndrii Nakryiko } 4731c64779e2SAndrii Nakryiko 4732c64779e2SAndrii Nakryiko err = (bpf_map__btf_key_type_id(map) == 0 || bpf_map__btf_value_type_id(map) == 0) 4733c64779e2SAndrii Nakryiko != test->btf_kv_notfound; 4734c64779e2SAndrii Nakryiko if (CHECK(err, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u", 4735c64779e2SAndrii Nakryiko bpf_map__btf_key_type_id(map), bpf_map__btf_value_type_id(map), 4736c64779e2SAndrii Nakryiko test->btf_kv_notfound)) 4737c64779e2SAndrii Nakryiko goto done; 4738c64779e2SAndrii Nakryiko 4739c64779e2SAndrii Nakryiko if (!has_btf_ext) 4740c64779e2SAndrii Nakryiko goto skip; 4741c64779e2SAndrii Nakryiko 4742c64779e2SAndrii Nakryiko /* get necessary program info */ 4743c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 4744c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 4745c64779e2SAndrii Nakryiko 4746bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) { 4747c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 4748c64779e2SAndrii Nakryiko err = -1; 4749c64779e2SAndrii Nakryiko goto done; 4750c64779e2SAndrii Nakryiko } 4751c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != 3, 4752c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (1st) %d", 4753c64779e2SAndrii Nakryiko info.nr_func_info)) { 4754c64779e2SAndrii Nakryiko err = -1; 4755c64779e2SAndrii Nakryiko goto done; 4756c64779e2SAndrii Nakryiko } 4757c64779e2SAndrii Nakryiko rec_size = info.func_info_rec_size; 4758c64779e2SAndrii Nakryiko if (CHECK(rec_size != sizeof(struct bpf_func_info), 4759c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (1st) %d\n", rec_size)) { 4760c64779e2SAndrii Nakryiko err = -1; 4761c64779e2SAndrii Nakryiko goto done; 4762c64779e2SAndrii Nakryiko } 4763c64779e2SAndrii Nakryiko 4764c64779e2SAndrii Nakryiko func_info = malloc(info.nr_func_info * rec_size); 4765c64779e2SAndrii Nakryiko if (CHECK(!func_info, "out of memory")) { 4766c64779e2SAndrii Nakryiko err = -1; 4767c64779e2SAndrii Nakryiko goto done; 4768c64779e2SAndrii Nakryiko } 4769c64779e2SAndrii Nakryiko 4770c64779e2SAndrii Nakryiko /* reset info to only retrieve func_info related data */ 4771c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 4772c64779e2SAndrii Nakryiko info.nr_func_info = 3; 4773c64779e2SAndrii Nakryiko info.func_info_rec_size = rec_size; 4774c64779e2SAndrii Nakryiko info.func_info = ptr_to_u64(func_info); 4775c64779e2SAndrii Nakryiko 4776c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 4777c64779e2SAndrii Nakryiko 4778bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) { 4779c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 4780c64779e2SAndrii Nakryiko err = -1; 4781c64779e2SAndrii Nakryiko goto done; 4782c64779e2SAndrii Nakryiko } 4783c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != 3, 4784c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (2nd) %d", 4785c64779e2SAndrii Nakryiko info.nr_func_info)) { 4786c64779e2SAndrii Nakryiko err = -1; 4787c64779e2SAndrii Nakryiko goto done; 4788c64779e2SAndrii Nakryiko } 4789c64779e2SAndrii Nakryiko if (CHECK(info.func_info_rec_size != rec_size, 4790c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (2nd) %d", 4791c64779e2SAndrii Nakryiko info.func_info_rec_size)) { 4792c64779e2SAndrii Nakryiko err = -1; 4793c64779e2SAndrii Nakryiko goto done; 4794c64779e2SAndrii Nakryiko } 4795c64779e2SAndrii Nakryiko 479686f4b7f2SQuentin Monnet btf = btf__load_from_kernel_by_id(info.btf_id); 479786f4b7f2SQuentin Monnet err = libbpf_get_error(btf); 4798c64779e2SAndrii Nakryiko if (CHECK(err, "cannot get btf from kernel, err: %d", err)) 4799c64779e2SAndrii Nakryiko goto done; 4800c64779e2SAndrii Nakryiko 4801c64779e2SAndrii Nakryiko /* check three functions */ 4802c64779e2SAndrii Nakryiko finfo = func_info; 4803c64779e2SAndrii Nakryiko for (i = 0; i < 3; i++) { 4804c64779e2SAndrii Nakryiko const struct btf_type *t; 4805c64779e2SAndrii Nakryiko const char *fname; 4806c64779e2SAndrii Nakryiko 4807c64779e2SAndrii Nakryiko t = btf__type_by_id(btf, finfo->type_id); 4808c64779e2SAndrii Nakryiko if (CHECK(!t, "btf__type_by_id failure: id %u", 4809c64779e2SAndrii Nakryiko finfo->type_id)) { 4810c64779e2SAndrii Nakryiko err = -1; 4811c64779e2SAndrii Nakryiko goto done; 4812c64779e2SAndrii Nakryiko } 4813c64779e2SAndrii Nakryiko 4814c64779e2SAndrii Nakryiko fname = btf__name_by_offset(btf, t->name_off); 4815c64779e2SAndrii Nakryiko err = strcmp(fname, expected_fnames[i]); 4816c64779e2SAndrii Nakryiko /* for the second and third functions in .text section, 4817c64779e2SAndrii Nakryiko * the compiler may order them either way. 4818c64779e2SAndrii Nakryiko */ 4819c64779e2SAndrii Nakryiko if (i && err) 4820c64779e2SAndrii Nakryiko err = strcmp(fname, expected_fnames[3 - i]); 4821c64779e2SAndrii Nakryiko if (CHECK(err, "incorrect fname %s", fname ? : "")) { 4822c64779e2SAndrii Nakryiko err = -1; 4823c64779e2SAndrii Nakryiko goto done; 4824c64779e2SAndrii Nakryiko } 4825c64779e2SAndrii Nakryiko 4826c64779e2SAndrii Nakryiko finfo = (void *)finfo + rec_size; 4827c64779e2SAndrii Nakryiko } 4828c64779e2SAndrii Nakryiko 4829c64779e2SAndrii Nakryiko skip: 4830c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 4831c64779e2SAndrii Nakryiko 4832c64779e2SAndrii Nakryiko done: 483393b8952dSAndrii Nakryiko libbpf_set_strict_mode(LIBBPF_STRICT_ALL); 483493b8952dSAndrii Nakryiko 4835369e955bSQuentin Monnet btf__free(btf); 4836c64779e2SAndrii Nakryiko free(func_info); 4837c64779e2SAndrii Nakryiko bpf_object__close(obj); 4838c64779e2SAndrii Nakryiko } 4839c64779e2SAndrii Nakryiko 4840c64779e2SAndrii Nakryiko const char *pprint_enum_str[] = { 4841c64779e2SAndrii Nakryiko "ENUM_ZERO", 4842c64779e2SAndrii Nakryiko "ENUM_ONE", 4843c64779e2SAndrii Nakryiko "ENUM_TWO", 4844c64779e2SAndrii Nakryiko "ENUM_THREE", 4845c64779e2SAndrii Nakryiko }; 4846c64779e2SAndrii Nakryiko 4847c64779e2SAndrii Nakryiko struct pprint_mapv { 4848c64779e2SAndrii Nakryiko uint32_t ui32; 4849c64779e2SAndrii Nakryiko uint16_t ui16; 4850c64779e2SAndrii Nakryiko /* 2 bytes hole */ 4851c64779e2SAndrii Nakryiko int32_t si32; 4852c64779e2SAndrii Nakryiko uint32_t unused_bits2a:2, 4853c64779e2SAndrii Nakryiko bits28:28, 4854c64779e2SAndrii Nakryiko unused_bits2b:2; 4855c64779e2SAndrii Nakryiko union { 4856c64779e2SAndrii Nakryiko uint64_t ui64; 4857c64779e2SAndrii Nakryiko uint8_t ui8a[8]; 4858c64779e2SAndrii Nakryiko }; 4859c64779e2SAndrii Nakryiko enum { 4860c64779e2SAndrii Nakryiko ENUM_ZERO, 4861c64779e2SAndrii Nakryiko ENUM_ONE, 4862c64779e2SAndrii Nakryiko ENUM_TWO, 4863c64779e2SAndrii Nakryiko ENUM_THREE, 4864c64779e2SAndrii Nakryiko } aenum; 4865c64779e2SAndrii Nakryiko uint32_t ui32b; 4866c64779e2SAndrii Nakryiko uint32_t bits2c:2; 4867c64779e2SAndrii Nakryiko uint8_t si8_4[2][2]; 4868c64779e2SAndrii Nakryiko }; 4869c64779e2SAndrii Nakryiko 4870c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 4871c64779e2SAndrii Nakryiko struct pprint_mapv_int128 { 4872c64779e2SAndrii Nakryiko __int128 si128a; 4873c64779e2SAndrii Nakryiko __int128 si128b; 4874c64779e2SAndrii Nakryiko unsigned __int128 bits3:3; 4875c64779e2SAndrii Nakryiko unsigned __int128 bits80:80; 4876c64779e2SAndrii Nakryiko unsigned __int128 ui128; 4877c64779e2SAndrii Nakryiko }; 4878c64779e2SAndrii Nakryiko #endif 4879c64779e2SAndrii Nakryiko 4880c64779e2SAndrii Nakryiko static struct btf_raw_test pprint_test_template[] = { 4881c64779e2SAndrii Nakryiko { 4882c64779e2SAndrii Nakryiko .raw_types = { 4883c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 4884c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 4885c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 4886c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 4887c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 4888c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4889c64779e2SAndrii Nakryiko /* int */ /* [4] */ 4890c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 4891c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 4892c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 4893c64779e2SAndrii Nakryiko /* 2 bits */ /* [6] */ 4894c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 2, 2), 4895c64779e2SAndrii Nakryiko /* 28 bits */ /* [7] */ 4896c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 28, 4), 4897c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 4898c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 4899c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 4900c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 4901c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 4902c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 4903c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 4904c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 4905c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 4906c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 4907c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 4908c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 4909c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 4910c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 4911c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 4912c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 4913c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 4914c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 4915c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 4916c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 4917c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 4918c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 4919c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 4920c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 11), 40), 4921c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, 0), /* uint32_t ui32 */ 4922c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, 32), /* uint16_t ui16 */ 4923c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, 64), /* int32_t si32 */ 4924c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 96), /* unused_bits2a */ 4925c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, 98), /* bits28 */ 4926c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 126), /* unused_bits2b */ 4927c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, 128), /* union (anon) */ 4928c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, 192), /* aenum */ 4929c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, 224), /* uint32_t ui32b */ 4930c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, 256), /* bits2c */ 4931c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */ 4932c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */ 4933c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */ 4934c64779e2SAndrii Nakryiko BTF_END_RAW, 4935c64779e2SAndrii Nakryiko }, 4936c64779e2SAndrii 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"), 4937c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 4938c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 4939c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 4940c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 4941c64779e2SAndrii Nakryiko .max_entries = 128, 4942c64779e2SAndrii Nakryiko }, 4943c64779e2SAndrii Nakryiko 4944c64779e2SAndrii Nakryiko { 4945c64779e2SAndrii Nakryiko /* this type will have the same type as the 4946c64779e2SAndrii Nakryiko * first .raw_types definition, but struct type will 4947c64779e2SAndrii Nakryiko * be encoded with kind_flag set. 4948c64779e2SAndrii Nakryiko */ 4949c64779e2SAndrii Nakryiko .raw_types = { 4950c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 4951c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 4952c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 4953c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 4954c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 4955c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 4956c64779e2SAndrii Nakryiko /* int */ /* [4] */ 4957c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 4958c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 4959c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 4960c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */ 4961c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */ 4962c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 4963c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 4964c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 4965c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 4966c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 4967c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 4968c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 4969c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 4970c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 4971c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 4972c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 4973c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 4974c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 4975c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 4976c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 4977c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 4978c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 4979c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 4980c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 4981c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 4982c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 4983c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 4984c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 4985c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40), 4986c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */ 4987c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */ 4988c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */ 4989c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */ 4990c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */ 4991c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)), /* unused_bits2b */ 4992c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */ 4993c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */ 4994c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */ 4995c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */ 4996c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, 264), /* si8_4 */ 4997c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(18, 1, 2), /* [17] */ 4998c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [18] */ 4999c64779e2SAndrii Nakryiko BTF_END_RAW, 5000c64779e2SAndrii Nakryiko }, 5001c64779e2SAndrii 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"), 5002c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 5003c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 5004c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 5005c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 5006c64779e2SAndrii Nakryiko .max_entries = 128, 5007c64779e2SAndrii Nakryiko }, 5008c64779e2SAndrii Nakryiko 5009c64779e2SAndrii Nakryiko { 5010c64779e2SAndrii Nakryiko /* this type will have the same layout as the 5011c64779e2SAndrii Nakryiko * first .raw_types definition. The struct type will 5012c64779e2SAndrii Nakryiko * be encoded with kind_flag set, bitfield members 5013c64779e2SAndrii Nakryiko * are added typedef/const/volatile, and bitfield members 5014c64779e2SAndrii Nakryiko * will have both int and enum types. 5015c64779e2SAndrii Nakryiko */ 5016c64779e2SAndrii Nakryiko .raw_types = { 5017c64779e2SAndrii Nakryiko /* unsighed char */ /* [1] */ 5018c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1), 5019c64779e2SAndrii Nakryiko /* unsigned short */ /* [2] */ 5020c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2), 5021c64779e2SAndrii Nakryiko /* unsigned int */ /* [3] */ 5022c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 5023c64779e2SAndrii Nakryiko /* int */ /* [4] */ 5024c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 5025c64779e2SAndrii Nakryiko /* unsigned long long */ /* [5] */ 5026c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), 5027c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [6] */ 5028c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, 0, 0, 32, 4), /* [7] */ 5029c64779e2SAndrii Nakryiko /* uint8_t[8] */ /* [8] */ 5030c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(9, 1, 8), 5031c64779e2SAndrii Nakryiko /* typedef unsigned char uint8_t */ /* [9] */ 5032c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), 5033c64779e2SAndrii Nakryiko /* typedef unsigned short uint16_t */ /* [10] */ 5034c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), 5035c64779e2SAndrii Nakryiko /* typedef unsigned int uint32_t */ /* [11] */ 5036c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 3), 5037c64779e2SAndrii Nakryiko /* typedef int int32_t */ /* [12] */ 5038c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 4), 5039c64779e2SAndrii Nakryiko /* typedef unsigned long long uint64_t *//* [13] */ 5040c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 5), 5041c64779e2SAndrii Nakryiko /* union (anon) */ /* [14] */ 5042c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8), 5043c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */ 5044c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 8, 0), /* uint8_t ui8a[8]; */ 5045c64779e2SAndrii Nakryiko /* enum (anon) */ /* [15] */ 5046c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4), 5047c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 5048c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 5049c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 2), 5050c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 3), 5051c64779e2SAndrii Nakryiko /* struct pprint_mapv */ /* [16] */ 5052c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40), 5053c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */ 5054c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */ 5055c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */ 5056c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 96)), /* unused_bits2a */ 5057c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)), /* bits28 */ 5058c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */ 5059c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */ 5060c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */ 5061c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */ 5062c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */ 5063c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 20, BTF_MEMBER_OFFSET(0, 264)), /* si8_4 */ 5064c64779e2SAndrii Nakryiko /* typedef unsigned int ___int */ /* [17] */ 5065c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 18), 5066c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6), /* [18] */ 5067c64779e2SAndrii Nakryiko BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15), /* [19] */ 5068c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(21, 1, 2), /* [20] */ 5069c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 2), /* [21] */ 5070c64779e2SAndrii Nakryiko BTF_END_RAW, 5071c64779e2SAndrii Nakryiko }, 5072c64779e2SAndrii 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"), 5073c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 5074c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv), 5075c64779e2SAndrii Nakryiko .key_type_id = 3, /* unsigned int */ 5076c64779e2SAndrii Nakryiko .value_type_id = 16, /* struct pprint_mapv */ 5077c64779e2SAndrii Nakryiko .max_entries = 128, 5078c64779e2SAndrii Nakryiko }, 5079c64779e2SAndrii Nakryiko 5080c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5081c64779e2SAndrii Nakryiko { 5082c64779e2SAndrii Nakryiko /* test int128 */ 5083c64779e2SAndrii Nakryiko .raw_types = { 5084c64779e2SAndrii Nakryiko /* unsigned int */ /* [1] */ 5085c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), 5086c64779e2SAndrii Nakryiko /* __int128 */ /* [2] */ 5087c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 128, 16), 5088c64779e2SAndrii Nakryiko /* unsigned __int128 */ /* [3] */ 5089c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 128, 16), 5090c64779e2SAndrii Nakryiko /* struct pprint_mapv_int128 */ /* [4] */ 5091c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 5), 64), 5092c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)), /* si128a */ 5093c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 128)), /* si128b */ 5094c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(3, 256)), /* bits3 */ 5095c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(80, 259)), /* bits80 */ 5096c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(0, 384)), /* ui128 */ 5097c64779e2SAndrii Nakryiko BTF_END_RAW, 5098c64779e2SAndrii Nakryiko }, 5099c64779e2SAndrii Nakryiko BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"), 5100c64779e2SAndrii Nakryiko .key_size = sizeof(unsigned int), 5101c64779e2SAndrii Nakryiko .value_size = sizeof(struct pprint_mapv_int128), 5102c64779e2SAndrii Nakryiko .key_type_id = 1, 5103c64779e2SAndrii Nakryiko .value_type_id = 4, 5104c64779e2SAndrii Nakryiko .max_entries = 128, 5105c64779e2SAndrii Nakryiko .mapv_kind = PPRINT_MAPV_KIND_INT128, 5106c64779e2SAndrii Nakryiko }, 5107c64779e2SAndrii Nakryiko #endif 5108c64779e2SAndrii Nakryiko 5109c64779e2SAndrii Nakryiko }; 5110c64779e2SAndrii Nakryiko 5111c64779e2SAndrii Nakryiko static struct btf_pprint_test_meta { 5112c64779e2SAndrii Nakryiko const char *descr; 5113c64779e2SAndrii Nakryiko enum bpf_map_type map_type; 5114c64779e2SAndrii Nakryiko const char *map_name; 5115c64779e2SAndrii Nakryiko bool ordered_map; 5116c64779e2SAndrii Nakryiko bool lossless_map; 5117c64779e2SAndrii Nakryiko bool percpu_map; 5118c64779e2SAndrii Nakryiko } pprint_tests_meta[] = { 5119c64779e2SAndrii Nakryiko { 5120c64779e2SAndrii Nakryiko .descr = "BTF pretty print array", 5121c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_ARRAY, 5122c64779e2SAndrii Nakryiko .map_name = "pprint_test_array", 5123c64779e2SAndrii Nakryiko .ordered_map = true, 5124c64779e2SAndrii Nakryiko .lossless_map = true, 5125c64779e2SAndrii Nakryiko .percpu_map = false, 5126c64779e2SAndrii Nakryiko }, 5127c64779e2SAndrii Nakryiko 5128c64779e2SAndrii Nakryiko { 5129c64779e2SAndrii Nakryiko .descr = "BTF pretty print hash", 5130c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_HASH, 5131c64779e2SAndrii Nakryiko .map_name = "pprint_test_hash", 5132c64779e2SAndrii Nakryiko .ordered_map = false, 5133c64779e2SAndrii Nakryiko .lossless_map = true, 5134c64779e2SAndrii Nakryiko .percpu_map = false, 5135c64779e2SAndrii Nakryiko }, 5136c64779e2SAndrii Nakryiko 5137c64779e2SAndrii Nakryiko { 5138c64779e2SAndrii Nakryiko .descr = "BTF pretty print lru hash", 5139c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_LRU_HASH, 5140c64779e2SAndrii Nakryiko .map_name = "pprint_test_lru_hash", 5141c64779e2SAndrii Nakryiko .ordered_map = false, 5142c64779e2SAndrii Nakryiko .lossless_map = false, 5143c64779e2SAndrii Nakryiko .percpu_map = false, 5144c64779e2SAndrii Nakryiko }, 5145c64779e2SAndrii Nakryiko 5146c64779e2SAndrii Nakryiko { 5147c64779e2SAndrii Nakryiko .descr = "BTF pretty print percpu array", 5148c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_PERCPU_ARRAY, 5149c64779e2SAndrii Nakryiko .map_name = "pprint_test_percpu_array", 5150c64779e2SAndrii Nakryiko .ordered_map = true, 5151c64779e2SAndrii Nakryiko .lossless_map = true, 5152c64779e2SAndrii Nakryiko .percpu_map = true, 5153c64779e2SAndrii Nakryiko }, 5154c64779e2SAndrii Nakryiko 5155c64779e2SAndrii Nakryiko { 5156c64779e2SAndrii Nakryiko .descr = "BTF pretty print percpu hash", 5157c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_PERCPU_HASH, 5158c64779e2SAndrii Nakryiko .map_name = "pprint_test_percpu_hash", 5159c64779e2SAndrii Nakryiko .ordered_map = false, 5160c64779e2SAndrii Nakryiko .lossless_map = true, 5161c64779e2SAndrii Nakryiko .percpu_map = true, 5162c64779e2SAndrii Nakryiko }, 5163c64779e2SAndrii Nakryiko 5164c64779e2SAndrii Nakryiko { 5165c64779e2SAndrii Nakryiko .descr = "BTF pretty print lru percpu hash", 5166c64779e2SAndrii Nakryiko .map_type = BPF_MAP_TYPE_LRU_PERCPU_HASH, 5167c64779e2SAndrii Nakryiko .map_name = "pprint_test_lru_percpu_hash", 5168c64779e2SAndrii Nakryiko .ordered_map = false, 5169c64779e2SAndrii Nakryiko .lossless_map = false, 5170c64779e2SAndrii Nakryiko .percpu_map = true, 5171c64779e2SAndrii Nakryiko }, 5172c64779e2SAndrii Nakryiko 5173c64779e2SAndrii Nakryiko }; 5174c64779e2SAndrii Nakryiko 5175c64779e2SAndrii Nakryiko static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind) 5176c64779e2SAndrii Nakryiko { 5177c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) 5178c64779e2SAndrii Nakryiko return sizeof(struct pprint_mapv); 5179c64779e2SAndrii Nakryiko 5180c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5181c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) 5182c64779e2SAndrii Nakryiko return sizeof(struct pprint_mapv_int128); 5183c64779e2SAndrii Nakryiko #endif 5184c64779e2SAndrii Nakryiko 5185c64779e2SAndrii Nakryiko assert(0); 5186c64779e2SAndrii Nakryiko } 5187c64779e2SAndrii Nakryiko 5188c64779e2SAndrii Nakryiko static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind, 5189c64779e2SAndrii Nakryiko void *mapv, uint32_t i, 5190c64779e2SAndrii Nakryiko int num_cpus, int rounded_value_size) 5191c64779e2SAndrii Nakryiko { 5192c64779e2SAndrii Nakryiko int cpu; 5193c64779e2SAndrii Nakryiko 5194c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) { 5195c64779e2SAndrii Nakryiko struct pprint_mapv *v = mapv; 5196c64779e2SAndrii Nakryiko 5197c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 5198c64779e2SAndrii Nakryiko v->ui32 = i + cpu; 5199c64779e2SAndrii Nakryiko v->si32 = -i; 5200c64779e2SAndrii Nakryiko v->unused_bits2a = 3; 5201c64779e2SAndrii Nakryiko v->bits28 = i; 5202c64779e2SAndrii Nakryiko v->unused_bits2b = 3; 5203c64779e2SAndrii Nakryiko v->ui64 = i; 5204c64779e2SAndrii Nakryiko v->aenum = i & 0x03; 5205c64779e2SAndrii Nakryiko v->ui32b = 4; 5206c64779e2SAndrii Nakryiko v->bits2c = 1; 5207c64779e2SAndrii Nakryiko v->si8_4[0][0] = (cpu + i) & 0xff; 5208c64779e2SAndrii Nakryiko v->si8_4[0][1] = (cpu + i + 1) & 0xff; 5209c64779e2SAndrii Nakryiko v->si8_4[1][0] = (cpu + i + 2) & 0xff; 5210c64779e2SAndrii Nakryiko v->si8_4[1][1] = (cpu + i + 3) & 0xff; 5211c64779e2SAndrii Nakryiko v = (void *)v + rounded_value_size; 5212c64779e2SAndrii Nakryiko } 5213c64779e2SAndrii Nakryiko } 5214c64779e2SAndrii Nakryiko 5215c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5216c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) { 5217c64779e2SAndrii Nakryiko struct pprint_mapv_int128 *v = mapv; 5218c64779e2SAndrii Nakryiko 5219c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 5220c64779e2SAndrii Nakryiko v->si128a = i; 5221c64779e2SAndrii Nakryiko v->si128b = -i; 5222c64779e2SAndrii Nakryiko v->bits3 = i & 0x07; 5223c64779e2SAndrii Nakryiko v->bits80 = (((unsigned __int128)1) << 64) + i; 5224c64779e2SAndrii Nakryiko v->ui128 = (((unsigned __int128)2) << 64) + i; 5225c64779e2SAndrii Nakryiko v = (void *)v + rounded_value_size; 5226c64779e2SAndrii Nakryiko } 5227c64779e2SAndrii Nakryiko } 5228c64779e2SAndrii Nakryiko #endif 5229c64779e2SAndrii Nakryiko } 5230c64779e2SAndrii Nakryiko 5231c64779e2SAndrii Nakryiko ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind, 5232c64779e2SAndrii Nakryiko char *expected_line, ssize_t line_size, 5233c64779e2SAndrii Nakryiko bool percpu_map, unsigned int next_key, 5234c64779e2SAndrii Nakryiko int cpu, void *mapv) 5235c64779e2SAndrii Nakryiko { 5236c64779e2SAndrii Nakryiko ssize_t nexpected_line = -1; 5237c64779e2SAndrii Nakryiko 5238c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_BASIC) { 5239c64779e2SAndrii Nakryiko struct pprint_mapv *v = mapv; 5240c64779e2SAndrii Nakryiko 5241c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, line_size, 5242c64779e2SAndrii Nakryiko "%s%u: {%u,0,%d,0x%x,0x%x,0x%x," 5243c64779e2SAndrii Nakryiko "{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s," 5244c64779e2SAndrii Nakryiko "%u,0x%x,[[%d,%d],[%d,%d]]}\n", 5245c64779e2SAndrii Nakryiko percpu_map ? "\tcpu" : "", 5246c64779e2SAndrii Nakryiko percpu_map ? cpu : next_key, 5247c64779e2SAndrii Nakryiko v->ui32, v->si32, 5248c64779e2SAndrii Nakryiko v->unused_bits2a, 5249c64779e2SAndrii Nakryiko v->bits28, 5250c64779e2SAndrii Nakryiko v->unused_bits2b, 5251c64779e2SAndrii Nakryiko (__u64)v->ui64, 5252c64779e2SAndrii Nakryiko v->ui8a[0], v->ui8a[1], 5253c64779e2SAndrii Nakryiko v->ui8a[2], v->ui8a[3], 5254c64779e2SAndrii Nakryiko v->ui8a[4], v->ui8a[5], 5255c64779e2SAndrii Nakryiko v->ui8a[6], v->ui8a[7], 5256c64779e2SAndrii Nakryiko pprint_enum_str[v->aenum], 5257c64779e2SAndrii Nakryiko v->ui32b, 5258c64779e2SAndrii Nakryiko v->bits2c, 5259c64779e2SAndrii Nakryiko v->si8_4[0][0], v->si8_4[0][1], 5260c64779e2SAndrii Nakryiko v->si8_4[1][0], v->si8_4[1][1]); 5261c64779e2SAndrii Nakryiko } 5262c64779e2SAndrii Nakryiko 5263c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__ 5264c64779e2SAndrii Nakryiko if (mapv_kind == PPRINT_MAPV_KIND_INT128) { 5265c64779e2SAndrii Nakryiko struct pprint_mapv_int128 *v = mapv; 5266c64779e2SAndrii Nakryiko 5267c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, line_size, 5268c64779e2SAndrii Nakryiko "%s%u: {0x%lx,0x%lx,0x%lx," 5269c64779e2SAndrii Nakryiko "0x%lx%016lx,0x%lx%016lx}\n", 5270c64779e2SAndrii Nakryiko percpu_map ? "\tcpu" : "", 5271c64779e2SAndrii Nakryiko percpu_map ? cpu : next_key, 5272c64779e2SAndrii Nakryiko (uint64_t)v->si128a, 5273c64779e2SAndrii Nakryiko (uint64_t)v->si128b, 5274c64779e2SAndrii Nakryiko (uint64_t)v->bits3, 5275c64779e2SAndrii Nakryiko (uint64_t)(v->bits80 >> 64), 5276c64779e2SAndrii Nakryiko (uint64_t)v->bits80, 5277c64779e2SAndrii Nakryiko (uint64_t)(v->ui128 >> 64), 5278c64779e2SAndrii Nakryiko (uint64_t)v->ui128); 5279c64779e2SAndrii Nakryiko } 5280c64779e2SAndrii Nakryiko #endif 5281c64779e2SAndrii Nakryiko 5282c64779e2SAndrii Nakryiko return nexpected_line; 5283c64779e2SAndrii Nakryiko } 5284c64779e2SAndrii Nakryiko 5285c64779e2SAndrii Nakryiko static int check_line(const char *expected_line, int nexpected_line, 5286c64779e2SAndrii Nakryiko int expected_line_len, const char *line) 5287c64779e2SAndrii Nakryiko { 5288c64779e2SAndrii Nakryiko if (CHECK(nexpected_line == expected_line_len, 5289c64779e2SAndrii Nakryiko "expected_line is too long")) 5290c64779e2SAndrii Nakryiko return -1; 5291c64779e2SAndrii Nakryiko 5292c64779e2SAndrii Nakryiko if (strcmp(expected_line, line)) { 5293c64779e2SAndrii Nakryiko fprintf(stderr, "unexpected pprint output\n"); 5294c64779e2SAndrii Nakryiko fprintf(stderr, "expected: %s", expected_line); 5295c64779e2SAndrii Nakryiko fprintf(stderr, " read: %s", line); 5296c64779e2SAndrii Nakryiko return -1; 5297c64779e2SAndrii Nakryiko } 5298c64779e2SAndrii Nakryiko 5299c64779e2SAndrii Nakryiko return 0; 5300c64779e2SAndrii Nakryiko } 5301c64779e2SAndrii Nakryiko 5302c64779e2SAndrii Nakryiko 5303c64779e2SAndrii Nakryiko static void do_test_pprint(int test_num) 5304c64779e2SAndrii Nakryiko { 5305c64779e2SAndrii Nakryiko const struct btf_raw_test *test = &pprint_test_template[test_num]; 5306c64779e2SAndrii Nakryiko enum pprint_mapv_kind_t mapv_kind = test->mapv_kind; 53072fe256a4SAndrii Nakryiko LIBBPF_OPTS(bpf_map_create_opts, opts); 5308c64779e2SAndrii Nakryiko bool ordered_map, lossless_map, percpu_map; 5309c64779e2SAndrii Nakryiko int err, ret, num_cpus, rounded_value_size; 5310c64779e2SAndrii Nakryiko unsigned int key, nr_read_elems; 5311c64779e2SAndrii Nakryiko int map_fd = -1, btf_fd = -1; 5312c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 5313c64779e2SAndrii Nakryiko char expected_line[255]; 5314c64779e2SAndrii Nakryiko FILE *pin_file = NULL; 5315c64779e2SAndrii Nakryiko char pin_path[255]; 5316c64779e2SAndrii Nakryiko size_t line_len = 0; 5317c64779e2SAndrii Nakryiko char *line = NULL; 5318c64779e2SAndrii Nakryiko void *mapv = NULL; 5319c64779e2SAndrii Nakryiko uint8_t *raw_btf; 5320c64779e2SAndrii Nakryiko ssize_t nread; 5321c64779e2SAndrii Nakryiko 5322c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 5323c64779e2SAndrii Nakryiko return; 5324c64779e2SAndrii Nakryiko 5325c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types, 5326c64779e2SAndrii Nakryiko test->str_sec, test->str_sec_size, 5327c64779e2SAndrii Nakryiko &raw_btf_size, NULL); 5328c64779e2SAndrii Nakryiko 5329c64779e2SAndrii Nakryiko if (!raw_btf) 5330c64779e2SAndrii Nakryiko return; 5331c64779e2SAndrii Nakryiko 5332c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 5333dc94121bSAndrii Nakryiko btf_fd = load_raw_btf(raw_btf, raw_btf_size); 5334c64779e2SAndrii Nakryiko free(raw_btf); 5335c64779e2SAndrii Nakryiko 5336dc94121bSAndrii Nakryiko if (CHECK(btf_fd < 0, "errno:%d\n", errno)) { 5337c64779e2SAndrii Nakryiko err = -1; 5338c64779e2SAndrii Nakryiko goto done; 5339c64779e2SAndrii Nakryiko } 5340c64779e2SAndrii Nakryiko 53412fe256a4SAndrii Nakryiko opts.btf_fd = btf_fd; 53422fe256a4SAndrii Nakryiko opts.btf_key_type_id = test->key_type_id; 53432fe256a4SAndrii Nakryiko opts.btf_value_type_id = test->value_type_id; 53442fe256a4SAndrii Nakryiko map_fd = bpf_map_create(test->map_type, test->map_name, 53452fe256a4SAndrii Nakryiko test->key_size, test->value_size, test->max_entries, &opts); 5346bad2e478SAndrii Nakryiko if (CHECK(map_fd < 0, "errno:%d", errno)) { 5347c64779e2SAndrii Nakryiko err = -1; 5348c64779e2SAndrii Nakryiko goto done; 5349c64779e2SAndrii Nakryiko } 5350c64779e2SAndrii Nakryiko 5351c64779e2SAndrii Nakryiko ret = snprintf(pin_path, sizeof(pin_path), "%s/%s", 5352c64779e2SAndrii Nakryiko "/sys/fs/bpf", test->map_name); 5353c64779e2SAndrii Nakryiko 5354c5d22f4cSDan Carpenter if (CHECK(ret >= sizeof(pin_path), "pin_path %s/%s is too long", 5355c64779e2SAndrii Nakryiko "/sys/fs/bpf", test->map_name)) { 5356c64779e2SAndrii Nakryiko err = -1; 5357c64779e2SAndrii Nakryiko goto done; 5358c64779e2SAndrii Nakryiko } 5359c64779e2SAndrii Nakryiko 5360c64779e2SAndrii Nakryiko err = bpf_obj_pin(map_fd, pin_path); 5361c64779e2SAndrii Nakryiko if (CHECK(err, "bpf_obj_pin(%s): errno:%d.", pin_path, errno)) 5362c64779e2SAndrii Nakryiko goto done; 5363c64779e2SAndrii Nakryiko 5364c64779e2SAndrii Nakryiko percpu_map = test->percpu_map; 5365c64779e2SAndrii Nakryiko num_cpus = percpu_map ? bpf_num_possible_cpus() : 1; 5366c64779e2SAndrii Nakryiko rounded_value_size = round_up(get_pprint_mapv_size(mapv_kind), 8); 5367c64779e2SAndrii Nakryiko mapv = calloc(num_cpus, rounded_value_size); 5368c64779e2SAndrii Nakryiko if (CHECK(!mapv, "mapv allocation failure")) { 5369c64779e2SAndrii Nakryiko err = -1; 5370c64779e2SAndrii Nakryiko goto done; 5371c64779e2SAndrii Nakryiko } 5372c64779e2SAndrii Nakryiko 5373c64779e2SAndrii Nakryiko for (key = 0; key < test->max_entries; key++) { 5374c64779e2SAndrii Nakryiko set_pprint_mapv(mapv_kind, mapv, key, num_cpus, rounded_value_size); 5375c64779e2SAndrii Nakryiko bpf_map_update_elem(map_fd, &key, mapv, 0); 5376c64779e2SAndrii Nakryiko } 5377c64779e2SAndrii Nakryiko 5378c64779e2SAndrii Nakryiko pin_file = fopen(pin_path, "r"); 5379c64779e2SAndrii Nakryiko if (CHECK(!pin_file, "fopen(%s): errno:%d", pin_path, errno)) { 5380c64779e2SAndrii Nakryiko err = -1; 5381c64779e2SAndrii Nakryiko goto done; 5382c64779e2SAndrii Nakryiko } 5383c64779e2SAndrii Nakryiko 5384c64779e2SAndrii Nakryiko /* Skip lines start with '#' */ 5385c64779e2SAndrii Nakryiko while ((nread = getline(&line, &line_len, pin_file)) > 0 && 5386c64779e2SAndrii Nakryiko *line == '#') 5387c64779e2SAndrii Nakryiko ; 5388c64779e2SAndrii Nakryiko 5389c64779e2SAndrii Nakryiko if (CHECK(nread <= 0, "Unexpected EOF")) { 5390c64779e2SAndrii Nakryiko err = -1; 5391c64779e2SAndrii Nakryiko goto done; 5392c64779e2SAndrii Nakryiko } 5393c64779e2SAndrii Nakryiko 5394c64779e2SAndrii Nakryiko nr_read_elems = 0; 5395c64779e2SAndrii Nakryiko ordered_map = test->ordered_map; 5396c64779e2SAndrii Nakryiko lossless_map = test->lossless_map; 5397c64779e2SAndrii Nakryiko do { 5398c64779e2SAndrii Nakryiko ssize_t nexpected_line; 5399c64779e2SAndrii Nakryiko unsigned int next_key; 5400c64779e2SAndrii Nakryiko void *cmapv; 5401c64779e2SAndrii Nakryiko int cpu; 5402c64779e2SAndrii Nakryiko 5403c64779e2SAndrii Nakryiko next_key = ordered_map ? nr_read_elems : atoi(line); 5404c64779e2SAndrii Nakryiko set_pprint_mapv(mapv_kind, mapv, next_key, num_cpus, rounded_value_size); 5405c64779e2SAndrii Nakryiko cmapv = mapv; 5406c64779e2SAndrii Nakryiko 5407c64779e2SAndrii Nakryiko for (cpu = 0; cpu < num_cpus; cpu++) { 5408c64779e2SAndrii Nakryiko if (percpu_map) { 5409c64779e2SAndrii Nakryiko /* for percpu map, the format looks like: 5410c64779e2SAndrii Nakryiko * <key>: { 5411c64779e2SAndrii Nakryiko * cpu0: <value_on_cpu0> 5412c64779e2SAndrii Nakryiko * cpu1: <value_on_cpu1> 5413c64779e2SAndrii Nakryiko * ... 5414c64779e2SAndrii Nakryiko * cpun: <value_on_cpun> 5415c64779e2SAndrii Nakryiko * } 5416c64779e2SAndrii Nakryiko * 5417c64779e2SAndrii Nakryiko * let us verify the line containing the key here. 5418c64779e2SAndrii Nakryiko */ 5419c64779e2SAndrii Nakryiko if (cpu == 0) { 5420c64779e2SAndrii Nakryiko nexpected_line = snprintf(expected_line, 5421c64779e2SAndrii Nakryiko sizeof(expected_line), 5422c64779e2SAndrii Nakryiko "%u: {\n", 5423c64779e2SAndrii Nakryiko next_key); 5424c64779e2SAndrii Nakryiko 5425c64779e2SAndrii Nakryiko err = check_line(expected_line, nexpected_line, 5426c64779e2SAndrii Nakryiko sizeof(expected_line), line); 5427bad2e478SAndrii Nakryiko if (err < 0) 5428c64779e2SAndrii Nakryiko goto done; 5429c64779e2SAndrii Nakryiko } 5430c64779e2SAndrii Nakryiko 5431c64779e2SAndrii Nakryiko /* read value@cpu */ 5432c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5433c64779e2SAndrii Nakryiko if (nread < 0) 5434c64779e2SAndrii Nakryiko break; 5435c64779e2SAndrii Nakryiko } 5436c64779e2SAndrii Nakryiko 5437c64779e2SAndrii Nakryiko nexpected_line = get_pprint_expected_line(mapv_kind, expected_line, 5438c64779e2SAndrii Nakryiko sizeof(expected_line), 5439c64779e2SAndrii Nakryiko percpu_map, next_key, 5440c64779e2SAndrii Nakryiko cpu, cmapv); 5441c64779e2SAndrii Nakryiko err = check_line(expected_line, nexpected_line, 5442c64779e2SAndrii Nakryiko sizeof(expected_line), line); 5443bad2e478SAndrii Nakryiko if (err < 0) 5444c64779e2SAndrii Nakryiko goto done; 5445c64779e2SAndrii Nakryiko 5446c64779e2SAndrii Nakryiko cmapv = cmapv + rounded_value_size; 5447c64779e2SAndrii Nakryiko } 5448c64779e2SAndrii Nakryiko 5449c64779e2SAndrii Nakryiko if (percpu_map) { 5450c64779e2SAndrii Nakryiko /* skip the last bracket for the percpu map */ 5451c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5452c64779e2SAndrii Nakryiko if (nread < 0) 5453c64779e2SAndrii Nakryiko break; 5454c64779e2SAndrii Nakryiko } 5455c64779e2SAndrii Nakryiko 5456c64779e2SAndrii Nakryiko nread = getline(&line, &line_len, pin_file); 5457c64779e2SAndrii Nakryiko } while (++nr_read_elems < test->max_entries && nread > 0); 5458c64779e2SAndrii Nakryiko 5459c64779e2SAndrii Nakryiko if (lossless_map && 5460c64779e2SAndrii Nakryiko CHECK(nr_read_elems < test->max_entries, 5461c64779e2SAndrii Nakryiko "Unexpected EOF. nr_read_elems:%u test->max_entries:%u", 5462c64779e2SAndrii Nakryiko nr_read_elems, test->max_entries)) { 5463c64779e2SAndrii Nakryiko err = -1; 5464c64779e2SAndrii Nakryiko goto done; 5465c64779e2SAndrii Nakryiko } 5466c64779e2SAndrii Nakryiko 5467c64779e2SAndrii Nakryiko if (CHECK(nread > 0, "Unexpected extra pprint output: %s", line)) { 5468c64779e2SAndrii Nakryiko err = -1; 5469c64779e2SAndrii Nakryiko goto done; 5470c64779e2SAndrii Nakryiko } 5471c64779e2SAndrii Nakryiko 5472c64779e2SAndrii Nakryiko err = 0; 5473c64779e2SAndrii Nakryiko 5474c64779e2SAndrii Nakryiko done: 5475c64779e2SAndrii Nakryiko if (mapv) 5476c64779e2SAndrii Nakryiko free(mapv); 5477c64779e2SAndrii Nakryiko if (!err) 5478c64779e2SAndrii Nakryiko fprintf(stderr, "OK"); 5479c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 5480c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 5481bad2e478SAndrii Nakryiko if (btf_fd >= 0) 5482c64779e2SAndrii Nakryiko close(btf_fd); 5483bad2e478SAndrii Nakryiko if (map_fd >= 0) 5484c64779e2SAndrii Nakryiko close(map_fd); 5485c64779e2SAndrii Nakryiko if (pin_file) 5486c64779e2SAndrii Nakryiko fclose(pin_file); 5487c64779e2SAndrii Nakryiko unlink(pin_path); 5488c64779e2SAndrii Nakryiko free(line); 5489c64779e2SAndrii Nakryiko } 5490c64779e2SAndrii Nakryiko 5491c64779e2SAndrii Nakryiko static void test_pprint(void) 5492c64779e2SAndrii Nakryiko { 5493c64779e2SAndrii Nakryiko unsigned int i; 5494c64779e2SAndrii Nakryiko 5495c64779e2SAndrii Nakryiko /* test various maps with the first test template */ 5496c64779e2SAndrii Nakryiko for (i = 0; i < ARRAY_SIZE(pprint_tests_meta); i++) { 5497c64779e2SAndrii Nakryiko pprint_test_template[0].descr = pprint_tests_meta[i].descr; 5498c64779e2SAndrii Nakryiko pprint_test_template[0].map_type = pprint_tests_meta[i].map_type; 5499c64779e2SAndrii Nakryiko pprint_test_template[0].map_name = pprint_tests_meta[i].map_name; 5500c64779e2SAndrii Nakryiko pprint_test_template[0].ordered_map = pprint_tests_meta[i].ordered_map; 5501c64779e2SAndrii Nakryiko pprint_test_template[0].lossless_map = pprint_tests_meta[i].lossless_map; 5502c64779e2SAndrii Nakryiko pprint_test_template[0].percpu_map = pprint_tests_meta[i].percpu_map; 5503c64779e2SAndrii Nakryiko 5504c64779e2SAndrii Nakryiko do_test_pprint(0); 5505c64779e2SAndrii Nakryiko } 5506c64779e2SAndrii Nakryiko 5507c64779e2SAndrii Nakryiko /* test rest test templates with the first map */ 5508c64779e2SAndrii Nakryiko for (i = 1; i < ARRAY_SIZE(pprint_test_template); i++) { 5509c64779e2SAndrii Nakryiko pprint_test_template[i].descr = pprint_tests_meta[0].descr; 5510c64779e2SAndrii Nakryiko pprint_test_template[i].map_type = pprint_tests_meta[0].map_type; 5511c64779e2SAndrii Nakryiko pprint_test_template[i].map_name = pprint_tests_meta[0].map_name; 5512c64779e2SAndrii Nakryiko pprint_test_template[i].ordered_map = pprint_tests_meta[0].ordered_map; 5513c64779e2SAndrii Nakryiko pprint_test_template[i].lossless_map = pprint_tests_meta[0].lossless_map; 5514c64779e2SAndrii Nakryiko pprint_test_template[i].percpu_map = pprint_tests_meta[0].percpu_map; 5515c64779e2SAndrii Nakryiko do_test_pprint(i); 5516c64779e2SAndrii Nakryiko } 5517c64779e2SAndrii Nakryiko } 5518c64779e2SAndrii Nakryiko 5519c64779e2SAndrii Nakryiko #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \ 5520c64779e2SAndrii Nakryiko (insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff)) 5521c64779e2SAndrii Nakryiko 5522c64779e2SAndrii Nakryiko static struct prog_info_raw_test { 5523c64779e2SAndrii Nakryiko const char *descr; 5524c64779e2SAndrii Nakryiko const char *str_sec; 5525c64779e2SAndrii Nakryiko const char *err_str; 5526c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 5527c64779e2SAndrii Nakryiko __u32 str_sec_size; 5528c64779e2SAndrii Nakryiko struct bpf_insn insns[MAX_INSNS]; 5529c64779e2SAndrii Nakryiko __u32 prog_type; 5530c64779e2SAndrii Nakryiko __u32 func_info[MAX_SUBPROGS][2]; 5531c64779e2SAndrii Nakryiko __u32 func_info_rec_size; 5532c64779e2SAndrii Nakryiko __u32 func_info_cnt; 5533c64779e2SAndrii Nakryiko __u32 line_info[MAX_NR_RAW_U32]; 5534c64779e2SAndrii Nakryiko __u32 line_info_rec_size; 5535c64779e2SAndrii Nakryiko __u32 nr_jited_ksyms; 5536c64779e2SAndrii Nakryiko bool expected_prog_load_failure; 5537c64779e2SAndrii Nakryiko __u32 dead_code_cnt; 5538c64779e2SAndrii Nakryiko __u32 dead_code_mask; 5539c64779e2SAndrii Nakryiko __u32 dead_func_cnt; 5540c64779e2SAndrii Nakryiko __u32 dead_func_mask; 5541c64779e2SAndrii Nakryiko } info_raw_tests[] = { 5542c64779e2SAndrii Nakryiko { 5543c64779e2SAndrii Nakryiko .descr = "func_type (main func + one sub)", 5544c64779e2SAndrii Nakryiko .raw_types = { 5545c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5546c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5547c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5548c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5549c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5550c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5551c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5552c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5553c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5554c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5555c64779e2SAndrii Nakryiko BTF_END_RAW, 5556c64779e2SAndrii Nakryiko }, 5557c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5558c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5559c64779e2SAndrii Nakryiko .insns = { 5560c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5561c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5562c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5563c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5564c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5565c64779e2SAndrii Nakryiko }, 5566c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5567c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5568c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5569c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5570c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5571c64779e2SAndrii Nakryiko }, 5572c64779e2SAndrii Nakryiko 5573c64779e2SAndrii Nakryiko { 5574c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect func_info_rec_size)", 5575c64779e2SAndrii Nakryiko .raw_types = { 5576c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5577c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5578c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5579c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5580c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5581c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5582c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5583c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5584c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5585c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5586c64779e2SAndrii Nakryiko BTF_END_RAW, 5587c64779e2SAndrii Nakryiko }, 5588c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5589c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5590c64779e2SAndrii Nakryiko .insns = { 5591c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5592c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5593c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5594c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5595c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5596c64779e2SAndrii Nakryiko }, 5597c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5598c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5599c64779e2SAndrii Nakryiko .func_info_rec_size = 4, 5600c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5601c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5602c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5603c64779e2SAndrii Nakryiko }, 5604c64779e2SAndrii Nakryiko 5605c64779e2SAndrii Nakryiko { 5606c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect func_info_cnt)", 5607c64779e2SAndrii Nakryiko .raw_types = { 5608c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5609c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5610c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5611c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5612c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5613c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5614c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5615c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5616c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5617c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5618c64779e2SAndrii Nakryiko BTF_END_RAW, 5619c64779e2SAndrii Nakryiko }, 5620c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5621c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5622c64779e2SAndrii Nakryiko .insns = { 5623c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5624c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5625c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5626c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5627c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5628c64779e2SAndrii Nakryiko }, 5629c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5630c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {3, 6} }, 5631c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5632c64779e2SAndrii Nakryiko .func_info_cnt = 1, 5633c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5634c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5635c64779e2SAndrii Nakryiko }, 5636c64779e2SAndrii Nakryiko 5637c64779e2SAndrii Nakryiko { 5638c64779e2SAndrii Nakryiko .descr = "func_type (Incorrect bpf_func_info.insn_off)", 5639c64779e2SAndrii Nakryiko .raw_types = { 5640c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5641c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */ 5642c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [3] */ 5643c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5644c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5645c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [4] */ 5646c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2), 5647c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5648c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 3), /* [5] */ 5649c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 4), /* [6] */ 5650c64779e2SAndrii Nakryiko BTF_END_RAW, 5651c64779e2SAndrii Nakryiko }, 5652c64779e2SAndrii Nakryiko .str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB", 5653c64779e2SAndrii Nakryiko .str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"), 5654c64779e2SAndrii Nakryiko .insns = { 5655c64779e2SAndrii Nakryiko BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5656c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5657c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5658c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 2), 5659c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5660c64779e2SAndrii Nakryiko }, 5661c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5662c64779e2SAndrii Nakryiko .func_info = { {0, 5}, {2, 6} }, 5663c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5664c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5665c64779e2SAndrii Nakryiko .line_info = { BTF_END_RAW }, 5666c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5667c64779e2SAndrii Nakryiko }, 5668c64779e2SAndrii Nakryiko 5669c64779e2SAndrii Nakryiko { 5670c64779e2SAndrii Nakryiko .descr = "line_info (No subprog)", 5671c64779e2SAndrii Nakryiko .raw_types = { 5672c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5673c64779e2SAndrii Nakryiko BTF_END_RAW, 5674c64779e2SAndrii Nakryiko }, 5675c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5676c64779e2SAndrii Nakryiko .insns = { 5677c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5678c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5679c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5680c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5681c64779e2SAndrii Nakryiko }, 5682c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5683c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5684c64779e2SAndrii Nakryiko .line_info = { 5685c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5686c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5687c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5688c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5689c64779e2SAndrii Nakryiko BTF_END_RAW, 5690c64779e2SAndrii Nakryiko }, 5691c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5692c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5693c64779e2SAndrii Nakryiko }, 5694c64779e2SAndrii Nakryiko 5695c64779e2SAndrii Nakryiko { 5696c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. insn_off >= prog->len)", 5697c64779e2SAndrii Nakryiko .raw_types = { 5698c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5699c64779e2SAndrii Nakryiko BTF_END_RAW, 5700c64779e2SAndrii Nakryiko }, 5701c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5702c64779e2SAndrii Nakryiko .insns = { 5703c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5704c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5705c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5706c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5707c64779e2SAndrii Nakryiko }, 5708c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5709c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5710c64779e2SAndrii Nakryiko .line_info = { 5711c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5712c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5713c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5714c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5715c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, 0, 5, 6), 5716c64779e2SAndrii Nakryiko BTF_END_RAW, 5717c64779e2SAndrii Nakryiko }, 5718c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5719c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5720c64779e2SAndrii Nakryiko .err_str = "line_info[4].insn_off", 5721c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5722c64779e2SAndrii Nakryiko }, 5723c64779e2SAndrii Nakryiko 5724c64779e2SAndrii Nakryiko { 5725c64779e2SAndrii Nakryiko .descr = "line_info (Zero bpf insn code)", 5726c64779e2SAndrii Nakryiko .raw_types = { 5727c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5728c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8), /* [2] */ 5729c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 2), /* [3] */ 5730c64779e2SAndrii Nakryiko BTF_END_RAW, 5731c64779e2SAndrii Nakryiko }, 5732c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"), 5733c64779e2SAndrii Nakryiko .insns = { 5734c64779e2SAndrii Nakryiko BPF_LD_IMM64(BPF_REG_0, 1), 5735c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5736c64779e2SAndrii Nakryiko }, 5737c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5738c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5739c64779e2SAndrii Nakryiko .line_info = { 5740c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5741c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, 0, 2, 9), 5742c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5743c64779e2SAndrii Nakryiko BTF_END_RAW, 5744c64779e2SAndrii Nakryiko }, 5745c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5746c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5747c64779e2SAndrii Nakryiko .err_str = "Invalid insn code at line_info[1]", 5748c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5749c64779e2SAndrii Nakryiko }, 5750c64779e2SAndrii Nakryiko 5751c64779e2SAndrii Nakryiko { 5752c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. zero tailing line_info", 5753c64779e2SAndrii Nakryiko .raw_types = { 5754c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5755c64779e2SAndrii Nakryiko BTF_END_RAW, 5756c64779e2SAndrii Nakryiko }, 5757c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5758c64779e2SAndrii Nakryiko .insns = { 5759c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5760c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5761c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5762c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5763c64779e2SAndrii Nakryiko }, 5764c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5765c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5766c64779e2SAndrii Nakryiko .line_info = { 5767c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0, 5768c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0, 5769c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0, 5770c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 0, 5771c64779e2SAndrii Nakryiko BTF_END_RAW, 5772c64779e2SAndrii Nakryiko }, 5773c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32), 5774c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5775c64779e2SAndrii Nakryiko }, 5776c64779e2SAndrii Nakryiko 5777c64779e2SAndrii Nakryiko { 5778c64779e2SAndrii Nakryiko .descr = "line_info (No subprog. nonzero tailing line_info)", 5779c64779e2SAndrii Nakryiko .raw_types = { 5780c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5781c64779e2SAndrii Nakryiko BTF_END_RAW, 5782c64779e2SAndrii Nakryiko }, 5783c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5784c64779e2SAndrii Nakryiko .insns = { 5785c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5786c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5787c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5788c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5789c64779e2SAndrii Nakryiko }, 5790c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5791c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5792c64779e2SAndrii Nakryiko .line_info = { 5793c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0, 5794c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0, 5795c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0, 5796c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 1, 5797c64779e2SAndrii Nakryiko BTF_END_RAW, 5798c64779e2SAndrii Nakryiko }, 5799c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32), 5800c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5801c64779e2SAndrii Nakryiko .err_str = "nonzero tailing record in line_info", 5802c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5803c64779e2SAndrii Nakryiko }, 5804c64779e2SAndrii Nakryiko 5805c64779e2SAndrii Nakryiko { 5806c64779e2SAndrii Nakryiko .descr = "line_info (subprog)", 5807c64779e2SAndrii Nakryiko .raw_types = { 5808c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5809c64779e2SAndrii Nakryiko BTF_END_RAW, 5810c64779e2SAndrii Nakryiko }, 5811c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5812c64779e2SAndrii Nakryiko .insns = { 5813c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5814c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5815c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5816c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5817c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5818c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5819c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5820c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5821c64779e2SAndrii Nakryiko }, 5822c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5823c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5824c64779e2SAndrii Nakryiko .line_info = { 5825c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5826c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5827c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5828c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5829c64779e2SAndrii Nakryiko BTF_END_RAW, 5830c64779e2SAndrii Nakryiko }, 5831c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5832c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5833c64779e2SAndrii Nakryiko }, 5834c64779e2SAndrii Nakryiko 5835c64779e2SAndrii Nakryiko { 5836c64779e2SAndrii Nakryiko .descr = "line_info (subprog + func_info)", 5837c64779e2SAndrii Nakryiko .raw_types = { 5838c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5839c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 5840c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 5841c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 5842c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 5843c64779e2SAndrii Nakryiko BTF_END_RAW, 5844c64779e2SAndrii Nakryiko }, 5845c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5846c64779e2SAndrii Nakryiko .insns = { 5847c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5848c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5849c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5850c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5851c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5852c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5853c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5854c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5855c64779e2SAndrii Nakryiko }, 5856c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5857c64779e2SAndrii Nakryiko .func_info_cnt = 2, 5858c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 5859c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {5, 3} }, 5860c64779e2SAndrii Nakryiko .line_info = { 5861c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5862c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5863c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5864c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5865c64779e2SAndrii Nakryiko BTF_END_RAW, 5866c64779e2SAndrii Nakryiko }, 5867c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5868c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5869c64779e2SAndrii Nakryiko }, 5870c64779e2SAndrii Nakryiko 5871c64779e2SAndrii Nakryiko { 5872c64779e2SAndrii Nakryiko .descr = "line_info (subprog. missing 1st func line info)", 5873c64779e2SAndrii Nakryiko .raw_types = { 5874c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5875c64779e2SAndrii Nakryiko BTF_END_RAW, 5876c64779e2SAndrii Nakryiko }, 5877c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5878c64779e2SAndrii Nakryiko .insns = { 5879c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5880c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5881c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5882c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5883c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5884c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5885c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5886c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5887c64779e2SAndrii Nakryiko }, 5888c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5889c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5890c64779e2SAndrii Nakryiko .line_info = { 5891c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 1, 10), 5892c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5893c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8), 5894c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5895c64779e2SAndrii Nakryiko BTF_END_RAW, 5896c64779e2SAndrii Nakryiko }, 5897c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5898c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5899c64779e2SAndrii Nakryiko .err_str = "missing bpf_line_info for func#0", 5900c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5901c64779e2SAndrii Nakryiko }, 5902c64779e2SAndrii Nakryiko 5903c64779e2SAndrii Nakryiko { 5904c64779e2SAndrii Nakryiko .descr = "line_info (subprog. missing 2nd func line info)", 5905c64779e2SAndrii Nakryiko .raw_types = { 5906c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5907c64779e2SAndrii Nakryiko BTF_END_RAW, 5908c64779e2SAndrii Nakryiko }, 5909c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5910c64779e2SAndrii Nakryiko .insns = { 5911c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5912c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5913c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5914c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5915c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5916c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5917c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5918c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5919c64779e2SAndrii Nakryiko }, 5920c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5921c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5922c64779e2SAndrii Nakryiko .line_info = { 5923c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5924c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9), 5925c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 3, 8), 5926c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5927c64779e2SAndrii Nakryiko BTF_END_RAW, 5928c64779e2SAndrii Nakryiko }, 5929c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5930c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5931c64779e2SAndrii Nakryiko .err_str = "missing bpf_line_info for func#1", 5932c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5933c64779e2SAndrii Nakryiko }, 5934c64779e2SAndrii Nakryiko 5935c64779e2SAndrii Nakryiko { 5936c64779e2SAndrii Nakryiko .descr = "line_info (subprog. unordered insn offset)", 5937c64779e2SAndrii Nakryiko .raw_types = { 5938c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5939c64779e2SAndrii Nakryiko BTF_END_RAW, 5940c64779e2SAndrii Nakryiko }, 5941c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"), 5942c64779e2SAndrii Nakryiko .insns = { 5943c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 5944c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 5945c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5946c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 5947c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5948c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5949c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 5950c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5951c64779e2SAndrii Nakryiko }, 5952c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5953c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5954c64779e2SAndrii Nakryiko .line_info = { 5955c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5956c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 2, 9), 5957c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5958c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7), 5959c64779e2SAndrii Nakryiko BTF_END_RAW, 5960c64779e2SAndrii Nakryiko }, 5961c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5962c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 5963c64779e2SAndrii Nakryiko .err_str = "Invalid line_info[2].insn_off", 5964c64779e2SAndrii Nakryiko .expected_prog_load_failure = true, 5965c64779e2SAndrii Nakryiko }, 5966c64779e2SAndrii Nakryiko 5967c64779e2SAndrii Nakryiko { 5968c64779e2SAndrii Nakryiko .descr = "line_info (dead start)", 5969c64779e2SAndrii Nakryiko .raw_types = { 5970c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 5971c64779e2SAndrii Nakryiko BTF_END_RAW, 5972c64779e2SAndrii Nakryiko }, 5973c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"), 5974c64779e2SAndrii Nakryiko .insns = { 5975c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 5976c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 5977c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 5978c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5979c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 5980c64779e2SAndrii Nakryiko }, 5981c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5982c64779e2SAndrii Nakryiko .func_info_cnt = 0, 5983c64779e2SAndrii Nakryiko .line_info = { 5984c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 5985c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 5986c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 5987c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 5988c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 6), 5989c64779e2SAndrii Nakryiko BTF_END_RAW, 5990c64779e2SAndrii Nakryiko }, 5991c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 5992c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 5993c64779e2SAndrii Nakryiko .dead_code_cnt = 1, 5994c64779e2SAndrii Nakryiko .dead_code_mask = 0x01, 5995c64779e2SAndrii Nakryiko }, 5996c64779e2SAndrii Nakryiko 5997c64779e2SAndrii Nakryiko { 5998c64779e2SAndrii Nakryiko .descr = "line_info (dead end)", 5999c64779e2SAndrii Nakryiko .raw_types = { 6000c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6001c64779e2SAndrii Nakryiko BTF_END_RAW, 6002c64779e2SAndrii Nakryiko }, 6003c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"), 6004c64779e2SAndrii Nakryiko .insns = { 6005c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 1), 6006c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_1, 2), 6007c64779e2SAndrii Nakryiko BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6008c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1), 6009c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6010c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6011c64779e2SAndrii Nakryiko }, 6012c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6013c64779e2SAndrii Nakryiko .func_info_cnt = 0, 6014c64779e2SAndrii Nakryiko .line_info = { 6015c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 12), 6016c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 11), 6017c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 10), 6018c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 9), 6019c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 8), 6020c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 6, 7), 6021c64779e2SAndrii Nakryiko BTF_END_RAW, 6022c64779e2SAndrii Nakryiko }, 6023c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6024c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 6025c64779e2SAndrii Nakryiko .dead_code_cnt = 2, 6026c64779e2SAndrii Nakryiko .dead_code_mask = 0x28, 6027c64779e2SAndrii Nakryiko }, 6028c64779e2SAndrii Nakryiko 6029c64779e2SAndrii Nakryiko { 6030c64779e2SAndrii Nakryiko .descr = "line_info (dead code + subprog + func_info)", 6031c64779e2SAndrii Nakryiko .raw_types = { 6032c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6033c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6034c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6035c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6036c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6037c64779e2SAndrii Nakryiko BTF_END_RAW, 6038c64779e2SAndrii Nakryiko }, 6039c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */" 6040c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 6041c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 6042c64779e2SAndrii Nakryiko "\0return func(a);\0b+=1;\0return b;"), 6043c64779e2SAndrii Nakryiko .insns = { 6044c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6045c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 6046c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 6047c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 8), 6048c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6049c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6050c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6051c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6052c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6053c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6054c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6055c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6056c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6057c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6058c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 6059c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6060c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6061c64779e2SAndrii Nakryiko }, 6062c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6063c64779e2SAndrii Nakryiko .func_info_cnt = 2, 6064c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6065c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {14, 3} }, 6066c64779e2SAndrii Nakryiko .line_info = { 6067c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6068c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6069c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6070c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6071c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6072c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6073c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6074c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6075c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 6076c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 6077c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 6078c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(14, 0, NAME_TBD, 3, 8), 6079c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(16, 0, NAME_TBD, 4, 7), 6080c64779e2SAndrii Nakryiko BTF_END_RAW, 6081c64779e2SAndrii Nakryiko }, 6082c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6083c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6084c64779e2SAndrii Nakryiko .dead_code_cnt = 9, 6085c64779e2SAndrii Nakryiko .dead_code_mask = 0x3fe, 6086c64779e2SAndrii Nakryiko }, 6087c64779e2SAndrii Nakryiko 6088c64779e2SAndrii Nakryiko { 6089c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog)", 6090c64779e2SAndrii Nakryiko .raw_types = { 6091c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6092c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6093c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6094c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6095c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6096c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 6097c64779e2SAndrii Nakryiko BTF_END_RAW, 6098c64779e2SAndrii Nakryiko }, 6099c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */" 6100c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0/* dead */\0/* dead */" 6101c64779e2SAndrii Nakryiko "\0/* dead */\0return bla + 1;\0return bla + 1;" 6102c64779e2SAndrii Nakryiko "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"), 6103c64779e2SAndrii Nakryiko .insns = { 6104c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6105c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6106c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6107c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 6108c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6109c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6110c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6111c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6112c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6113c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 6114c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6115c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6116c64779e2SAndrii Nakryiko }, 6117c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6118c64779e2SAndrii Nakryiko .func_info_cnt = 3, 6119c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6120c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {6, 3}, {9, 5} }, 6121c64779e2SAndrii Nakryiko .line_info = { 6122c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6123c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6124c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6125c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6126c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6127c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6128c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6129c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6130c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 6131c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 6132c64779e2SAndrii Nakryiko BTF_END_RAW, 6133c64779e2SAndrii Nakryiko }, 6134c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6135c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6136c64779e2SAndrii Nakryiko .dead_code_cnt = 3, 6137c64779e2SAndrii Nakryiko .dead_code_mask = 0x70, 6138c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6139c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6140c64779e2SAndrii Nakryiko }, 6141c64779e2SAndrii Nakryiko 6142c64779e2SAndrii Nakryiko { 6143c64779e2SAndrii Nakryiko .descr = "line_info (dead last subprog)", 6144c64779e2SAndrii Nakryiko .raw_types = { 6145c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6146c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6147c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6148c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6149c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 6150c64779e2SAndrii Nakryiko BTF_END_RAW, 6151c64779e2SAndrii Nakryiko }, 6152c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */" 6153c64779e2SAndrii Nakryiko "\0return 0;\0/* dead */\0/* dead */"), 6154c64779e2SAndrii Nakryiko .insns = { 6155c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6156c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6157c64779e2SAndrii Nakryiko BPF_CALL_REL(2), 6158c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6159c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6160c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6161c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6162c64779e2SAndrii Nakryiko }, 6163c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6164c64779e2SAndrii Nakryiko .func_info_cnt = 2, 6165c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6166c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {5, 3} }, 6167c64779e2SAndrii Nakryiko .line_info = { 6168c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6169c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6170c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6171c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6172c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6173c64779e2SAndrii Nakryiko BTF_END_RAW, 6174c64779e2SAndrii Nakryiko }, 6175c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6176c64779e2SAndrii Nakryiko .nr_jited_ksyms = 1, 6177c64779e2SAndrii Nakryiko .dead_code_cnt = 2, 6178c64779e2SAndrii Nakryiko .dead_code_mask = 0x18, 6179c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6180c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6181c64779e2SAndrii Nakryiko }, 6182c64779e2SAndrii Nakryiko 6183c64779e2SAndrii Nakryiko { 6184c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog + dead start)", 6185c64779e2SAndrii Nakryiko .raw_types = { 6186c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6187c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6188c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6189c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6190c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6191c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 6192c64779e2SAndrii Nakryiko BTF_END_RAW, 6193c64779e2SAndrii Nakryiko }, 6194c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */" 6195c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0return 0;" 6196c64779e2SAndrii Nakryiko "\0/* dead */\0/* dead */\0/* dead */\0/* dead */" 6197c64779e2SAndrii Nakryiko "\0return b + 1;\0return b + 1;\0return b + 1;"), 6198c64779e2SAndrii Nakryiko .insns = { 6199c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6200c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6201c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6202c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6203c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 6204c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6205c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6206c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6207c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6208c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6209c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6210c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 6211c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6212c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6213c64779e2SAndrii Nakryiko }, 6214c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6215c64779e2SAndrii Nakryiko .func_info_cnt = 3, 6216c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6217c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {7, 3}, {10, 5} }, 6218c64779e2SAndrii Nakryiko .line_info = { 6219c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6220c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6221c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6222c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6223c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6224c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6225c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6226c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6227c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10), 6228c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9), 6229c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 6230c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(13, 0, NAME_TBD, 2, 9), 6231c64779e2SAndrii Nakryiko BTF_END_RAW, 6232c64779e2SAndrii Nakryiko }, 6233c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6234c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6235c64779e2SAndrii Nakryiko .dead_code_cnt = 5, 6236c64779e2SAndrii Nakryiko .dead_code_mask = 0x1e2, 6237c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6238c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6239c64779e2SAndrii Nakryiko }, 6240c64779e2SAndrii Nakryiko 6241c64779e2SAndrii Nakryiko { 6242c64779e2SAndrii Nakryiko .descr = "line_info (dead subprog + dead start w/ move)", 6243c64779e2SAndrii Nakryiko .raw_types = { 6244c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6245c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6246c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6247c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6248c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6249c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [5] */ 6250c64779e2SAndrii Nakryiko BTF_END_RAW, 6251c64779e2SAndrii Nakryiko }, 6252c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */" 6253c64779e2SAndrii Nakryiko "\0return 0;\0return 0;\0/* dead */\0/* dead */" 6254c64779e2SAndrii Nakryiko "\0/* dead */\0return bla + 1;\0return bla + 1;" 6255c64779e2SAndrii Nakryiko "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"), 6256c64779e2SAndrii Nakryiko .insns = { 6257c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_2, 1), 6258c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 6259c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6260c64779e2SAndrii Nakryiko BPF_CALL_REL(5), 6261c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6262c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6263c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6264c64779e2SAndrii Nakryiko BPF_CALL_REL(1), 6265c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6266c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6267c64779e2SAndrii Nakryiko BPF_MOV64_REG(BPF_REG_0, 2), 6268c64779e2SAndrii Nakryiko BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 6269c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6270c64779e2SAndrii Nakryiko }, 6271c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6272c64779e2SAndrii Nakryiko .func_info_cnt = 3, 6273c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6274c64779e2SAndrii Nakryiko .func_info = { {0, 4}, {6, 3}, {9, 5} }, 6275c64779e2SAndrii Nakryiko .line_info = { 6276c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6277c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10), 6278c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10), 6279c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10), 6280c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6281c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10), 6282c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10), 6283c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10), 6284c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 1, 10), 6285c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9), 6286c64779e2SAndrii Nakryiko BTF_END_RAW, 6287c64779e2SAndrii Nakryiko }, 6288c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6289c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6290c64779e2SAndrii Nakryiko .dead_code_cnt = 3, 6291c64779e2SAndrii Nakryiko .dead_code_mask = 0x70, 6292c64779e2SAndrii Nakryiko .dead_func_cnt = 1, 6293c64779e2SAndrii Nakryiko .dead_func_mask = 0x2, 6294c64779e2SAndrii Nakryiko }, 6295c64779e2SAndrii Nakryiko 6296c64779e2SAndrii Nakryiko { 6297c64779e2SAndrii Nakryiko .descr = "line_info (dead end + subprog start w/ no linfo)", 6298c64779e2SAndrii Nakryiko .raw_types = { 6299c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6300c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 1), /* [2] */ 6301c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 6302c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [3] */ 6303c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 2), /* [4] */ 6304c64779e2SAndrii Nakryiko BTF_END_RAW, 6305c64779e2SAndrii Nakryiko }, 6306c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"), 6307c64779e2SAndrii Nakryiko .insns = { 6308c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6309c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 1, 3), 6310c64779e2SAndrii Nakryiko BPF_CALL_REL(3), 6311c64779e2SAndrii Nakryiko BPF_MOV64_IMM(BPF_REG_0, 0), 6312c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6313c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6314c64779e2SAndrii Nakryiko BPF_JMP_IMM(BPF_JA, 0, 0, 0), 6315c64779e2SAndrii Nakryiko BPF_EXIT_INSN(), 6316c64779e2SAndrii Nakryiko }, 6317c64779e2SAndrii Nakryiko .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6318c64779e2SAndrii Nakryiko .func_info_cnt = 2, 6319c64779e2SAndrii Nakryiko .func_info_rec_size = 8, 6320c64779e2SAndrii Nakryiko .func_info = { {0, 3}, {6, 4}, }, 6321c64779e2SAndrii Nakryiko .line_info = { 6322c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 6323c64779e2SAndrii Nakryiko BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10), 6324c64779e2SAndrii Nakryiko BTF_END_RAW, 6325c64779e2SAndrii Nakryiko }, 6326c64779e2SAndrii Nakryiko .line_info_rec_size = sizeof(struct bpf_line_info), 6327c64779e2SAndrii Nakryiko .nr_jited_ksyms = 2, 6328c64779e2SAndrii Nakryiko }, 6329c64779e2SAndrii Nakryiko 6330c64779e2SAndrii Nakryiko }; 6331c64779e2SAndrii Nakryiko 6332c64779e2SAndrii Nakryiko static size_t probe_prog_length(const struct bpf_insn *fp) 6333c64779e2SAndrii Nakryiko { 6334c64779e2SAndrii Nakryiko size_t len; 6335c64779e2SAndrii Nakryiko 6336c64779e2SAndrii Nakryiko for (len = MAX_INSNS - 1; len > 0; --len) 6337c64779e2SAndrii Nakryiko if (fp[len].code != 0 || fp[len].imm != 0) 6338c64779e2SAndrii Nakryiko break; 6339c64779e2SAndrii Nakryiko return len + 1; 6340c64779e2SAndrii Nakryiko } 6341c64779e2SAndrii Nakryiko 6342c64779e2SAndrii Nakryiko static __u32 *patch_name_tbd(const __u32 *raw_u32, 6343c64779e2SAndrii Nakryiko const char *str, __u32 str_off, 6344c64779e2SAndrii Nakryiko unsigned int str_sec_size, 6345c64779e2SAndrii Nakryiko unsigned int *ret_size) 6346c64779e2SAndrii Nakryiko { 6347c64779e2SAndrii Nakryiko int i, raw_u32_size = get_raw_sec_size(raw_u32); 6348c64779e2SAndrii Nakryiko const char *end_str = str + str_sec_size; 6349c64779e2SAndrii Nakryiko const char *next_str = str + str_off; 6350c64779e2SAndrii Nakryiko __u32 *new_u32 = NULL; 6351c64779e2SAndrii Nakryiko 6352c64779e2SAndrii Nakryiko if (raw_u32_size == -1) 6353c64779e2SAndrii Nakryiko return ERR_PTR(-EINVAL); 6354c64779e2SAndrii Nakryiko 6355c64779e2SAndrii Nakryiko if (!raw_u32_size) { 6356c64779e2SAndrii Nakryiko *ret_size = 0; 6357c64779e2SAndrii Nakryiko return NULL; 6358c64779e2SAndrii Nakryiko } 6359c64779e2SAndrii Nakryiko 6360c64779e2SAndrii Nakryiko new_u32 = malloc(raw_u32_size); 6361c64779e2SAndrii Nakryiko if (!new_u32) 6362c64779e2SAndrii Nakryiko return ERR_PTR(-ENOMEM); 6363c64779e2SAndrii Nakryiko 6364c64779e2SAndrii Nakryiko for (i = 0; i < raw_u32_size / sizeof(raw_u32[0]); i++) { 6365c64779e2SAndrii Nakryiko if (raw_u32[i] == NAME_TBD) { 6366c64779e2SAndrii Nakryiko next_str = get_next_str(next_str, end_str); 6367c64779e2SAndrii Nakryiko if (CHECK(!next_str, "Error in getting next_str\n")) { 6368c64779e2SAndrii Nakryiko free(new_u32); 6369c64779e2SAndrii Nakryiko return ERR_PTR(-EINVAL); 6370c64779e2SAndrii Nakryiko } 6371c64779e2SAndrii Nakryiko new_u32[i] = next_str - str; 6372c64779e2SAndrii Nakryiko next_str += strlen(next_str); 6373c64779e2SAndrii Nakryiko } else { 6374c64779e2SAndrii Nakryiko new_u32[i] = raw_u32[i]; 6375c64779e2SAndrii Nakryiko } 6376c64779e2SAndrii Nakryiko } 6377c64779e2SAndrii Nakryiko 6378c64779e2SAndrii Nakryiko *ret_size = raw_u32_size; 6379c64779e2SAndrii Nakryiko return new_u32; 6380c64779e2SAndrii Nakryiko } 6381c64779e2SAndrii Nakryiko 6382c64779e2SAndrii Nakryiko static int test_get_finfo(const struct prog_info_raw_test *test, 6383c64779e2SAndrii Nakryiko int prog_fd) 6384c64779e2SAndrii Nakryiko { 6385c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 6386c64779e2SAndrii Nakryiko struct bpf_func_info *finfo; 6387c64779e2SAndrii Nakryiko __u32 info_len, rec_size, i; 6388c64779e2SAndrii Nakryiko void *func_info = NULL; 6389c64779e2SAndrii Nakryiko __u32 nr_func_info; 6390c64779e2SAndrii Nakryiko int err; 6391c64779e2SAndrii Nakryiko 6392c64779e2SAndrii Nakryiko /* get necessary lens */ 6393c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 6394c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6395bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) { 6396c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 6397c64779e2SAndrii Nakryiko return -1; 6398c64779e2SAndrii Nakryiko } 6399c64779e2SAndrii Nakryiko nr_func_info = test->func_info_cnt - test->dead_func_cnt; 6400c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != nr_func_info, 6401c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (1st) %d", 6402c64779e2SAndrii Nakryiko info.nr_func_info)) { 6403c64779e2SAndrii Nakryiko return -1; 6404c64779e2SAndrii Nakryiko } 6405c64779e2SAndrii Nakryiko 6406c64779e2SAndrii Nakryiko rec_size = info.func_info_rec_size; 6407c64779e2SAndrii Nakryiko if (CHECK(rec_size != sizeof(struct bpf_func_info), 6408c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (1st) %d", rec_size)) { 6409c64779e2SAndrii Nakryiko return -1; 6410c64779e2SAndrii Nakryiko } 6411c64779e2SAndrii Nakryiko 6412c64779e2SAndrii Nakryiko if (!info.nr_func_info) 6413c64779e2SAndrii Nakryiko return 0; 6414c64779e2SAndrii Nakryiko 6415c64779e2SAndrii Nakryiko func_info = malloc(info.nr_func_info * rec_size); 6416c64779e2SAndrii Nakryiko if (CHECK(!func_info, "out of memory")) 6417c64779e2SAndrii Nakryiko return -1; 6418c64779e2SAndrii Nakryiko 6419c64779e2SAndrii Nakryiko /* reset info to only retrieve func_info related data */ 6420c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 6421c64779e2SAndrii Nakryiko info.nr_func_info = nr_func_info; 6422c64779e2SAndrii Nakryiko info.func_info_rec_size = rec_size; 6423c64779e2SAndrii Nakryiko info.func_info = ptr_to_u64(func_info); 6424c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6425bad2e478SAndrii Nakryiko if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) { 6426c64779e2SAndrii Nakryiko fprintf(stderr, "%s\n", btf_log_buf); 6427c64779e2SAndrii Nakryiko err = -1; 6428c64779e2SAndrii Nakryiko goto done; 6429c64779e2SAndrii Nakryiko } 6430c64779e2SAndrii Nakryiko if (CHECK(info.nr_func_info != nr_func_info, 6431c64779e2SAndrii Nakryiko "incorrect info.nr_func_info (2nd) %d", 6432c64779e2SAndrii Nakryiko info.nr_func_info)) { 6433c64779e2SAndrii Nakryiko err = -1; 6434c64779e2SAndrii Nakryiko goto done; 6435c64779e2SAndrii Nakryiko } 6436c64779e2SAndrii Nakryiko if (CHECK(info.func_info_rec_size != rec_size, 6437c64779e2SAndrii Nakryiko "incorrect info.func_info_rec_size (2nd) %d", 6438c64779e2SAndrii Nakryiko info.func_info_rec_size)) { 6439c64779e2SAndrii Nakryiko err = -1; 6440c64779e2SAndrii Nakryiko goto done; 6441c64779e2SAndrii Nakryiko } 6442c64779e2SAndrii Nakryiko 6443c64779e2SAndrii Nakryiko finfo = func_info; 6444c64779e2SAndrii Nakryiko for (i = 0; i < nr_func_info; i++) { 6445c64779e2SAndrii Nakryiko if (test->dead_func_mask & (1 << i)) 6446c64779e2SAndrii Nakryiko continue; 6447c64779e2SAndrii Nakryiko if (CHECK(finfo->type_id != test->func_info[i][1], 6448c64779e2SAndrii Nakryiko "incorrect func_type %u expected %u", 6449c64779e2SAndrii Nakryiko finfo->type_id, test->func_info[i][1])) { 6450c64779e2SAndrii Nakryiko err = -1; 6451c64779e2SAndrii Nakryiko goto done; 6452c64779e2SAndrii Nakryiko } 6453c64779e2SAndrii Nakryiko finfo = (void *)finfo + rec_size; 6454c64779e2SAndrii Nakryiko } 6455c64779e2SAndrii Nakryiko 6456c64779e2SAndrii Nakryiko err = 0; 6457c64779e2SAndrii Nakryiko 6458c64779e2SAndrii Nakryiko done: 6459c64779e2SAndrii Nakryiko free(func_info); 6460c64779e2SAndrii Nakryiko return err; 6461c64779e2SAndrii Nakryiko } 6462c64779e2SAndrii Nakryiko 6463c64779e2SAndrii Nakryiko static int test_get_linfo(const struct prog_info_raw_test *test, 6464c64779e2SAndrii Nakryiko const void *patched_linfo, 6465c64779e2SAndrii Nakryiko __u32 cnt, int prog_fd) 6466c64779e2SAndrii Nakryiko { 6467c64779e2SAndrii Nakryiko __u32 i, info_len, nr_jited_ksyms, nr_jited_func_lens; 6468c64779e2SAndrii Nakryiko __u64 *jited_linfo = NULL, *jited_ksyms = NULL; 6469c64779e2SAndrii Nakryiko __u32 rec_size, jited_rec_size, jited_cnt; 6470c64779e2SAndrii Nakryiko struct bpf_line_info *linfo = NULL; 6471c64779e2SAndrii Nakryiko __u32 cur_func_len, ksyms_found; 6472c64779e2SAndrii Nakryiko struct bpf_prog_info info = {}; 6473c64779e2SAndrii Nakryiko __u32 *jited_func_lens = NULL; 6474c64779e2SAndrii Nakryiko __u64 cur_func_ksyms; 6475c64779e2SAndrii Nakryiko __u32 dead_insns; 6476c64779e2SAndrii Nakryiko int err; 6477c64779e2SAndrii Nakryiko 6478c64779e2SAndrii Nakryiko jited_cnt = cnt; 6479c64779e2SAndrii Nakryiko rec_size = sizeof(*linfo); 6480c64779e2SAndrii Nakryiko jited_rec_size = sizeof(*jited_linfo); 6481c64779e2SAndrii Nakryiko if (test->nr_jited_ksyms) 6482c64779e2SAndrii Nakryiko nr_jited_ksyms = test->nr_jited_ksyms; 6483c64779e2SAndrii Nakryiko else 6484c64779e2SAndrii Nakryiko nr_jited_ksyms = test->func_info_cnt - test->dead_func_cnt; 6485c64779e2SAndrii Nakryiko nr_jited_func_lens = nr_jited_ksyms; 6486c64779e2SAndrii Nakryiko 6487c64779e2SAndrii Nakryiko info_len = sizeof(struct bpf_prog_info); 6488c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6489bad2e478SAndrii Nakryiko if (CHECK(err < 0, "err:%d errno:%d", err, errno)) { 6490c64779e2SAndrii Nakryiko err = -1; 6491c64779e2SAndrii Nakryiko goto done; 6492c64779e2SAndrii Nakryiko } 6493c64779e2SAndrii Nakryiko 6494c64779e2SAndrii Nakryiko if (!info.jited_prog_len) { 6495c64779e2SAndrii Nakryiko /* prog is not jited */ 6496c64779e2SAndrii Nakryiko jited_cnt = 0; 6497c64779e2SAndrii Nakryiko nr_jited_ksyms = 1; 6498c64779e2SAndrii Nakryiko nr_jited_func_lens = 1; 6499c64779e2SAndrii Nakryiko } 6500c64779e2SAndrii Nakryiko 6501c64779e2SAndrii Nakryiko if (CHECK(info.nr_line_info != cnt || 6502c64779e2SAndrii Nakryiko info.nr_jited_line_info != jited_cnt || 6503c64779e2SAndrii Nakryiko info.nr_jited_ksyms != nr_jited_ksyms || 6504c64779e2SAndrii Nakryiko info.nr_jited_func_lens != nr_jited_func_lens || 6505c64779e2SAndrii Nakryiko (!info.nr_line_info && info.nr_jited_line_info), 6506c64779e2SAndrii 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)", 6507c64779e2SAndrii Nakryiko info.nr_line_info, cnt, 6508c64779e2SAndrii Nakryiko info.nr_jited_line_info, jited_cnt, 6509c64779e2SAndrii Nakryiko info.nr_jited_ksyms, nr_jited_ksyms, 6510c64779e2SAndrii Nakryiko info.nr_jited_func_lens, nr_jited_func_lens)) { 6511c64779e2SAndrii Nakryiko err = -1; 6512c64779e2SAndrii Nakryiko goto done; 6513c64779e2SAndrii Nakryiko } 6514c64779e2SAndrii Nakryiko 6515c64779e2SAndrii Nakryiko if (CHECK(info.line_info_rec_size != sizeof(struct bpf_line_info) || 6516c64779e2SAndrii Nakryiko info.jited_line_info_rec_size != sizeof(__u64), 6517c64779e2SAndrii Nakryiko "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)", 6518c64779e2SAndrii Nakryiko info.line_info_rec_size, rec_size, 6519c64779e2SAndrii Nakryiko info.jited_line_info_rec_size, jited_rec_size)) { 6520c64779e2SAndrii Nakryiko err = -1; 6521c64779e2SAndrii Nakryiko goto done; 6522c64779e2SAndrii Nakryiko } 6523c64779e2SAndrii Nakryiko 6524c64779e2SAndrii Nakryiko if (!cnt) 6525c64779e2SAndrii Nakryiko return 0; 6526c64779e2SAndrii Nakryiko 6527c64779e2SAndrii Nakryiko rec_size = info.line_info_rec_size; 6528c64779e2SAndrii Nakryiko jited_rec_size = info.jited_line_info_rec_size; 6529c64779e2SAndrii Nakryiko 6530c64779e2SAndrii Nakryiko memset(&info, 0, sizeof(info)); 6531c64779e2SAndrii Nakryiko 6532c64779e2SAndrii Nakryiko linfo = calloc(cnt, rec_size); 6533c64779e2SAndrii Nakryiko if (CHECK(!linfo, "!linfo")) { 6534c64779e2SAndrii Nakryiko err = -1; 6535c64779e2SAndrii Nakryiko goto done; 6536c64779e2SAndrii Nakryiko } 6537c64779e2SAndrii Nakryiko info.nr_line_info = cnt; 6538c64779e2SAndrii Nakryiko info.line_info_rec_size = rec_size; 6539c64779e2SAndrii Nakryiko info.line_info = ptr_to_u64(linfo); 6540c64779e2SAndrii Nakryiko 6541c64779e2SAndrii Nakryiko if (jited_cnt) { 6542c64779e2SAndrii Nakryiko jited_linfo = calloc(jited_cnt, jited_rec_size); 6543c64779e2SAndrii Nakryiko jited_ksyms = calloc(nr_jited_ksyms, sizeof(*jited_ksyms)); 6544c64779e2SAndrii Nakryiko jited_func_lens = calloc(nr_jited_func_lens, 6545c64779e2SAndrii Nakryiko sizeof(*jited_func_lens)); 6546c64779e2SAndrii Nakryiko if (CHECK(!jited_linfo || !jited_ksyms || !jited_func_lens, 6547c64779e2SAndrii Nakryiko "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p", 6548c64779e2SAndrii Nakryiko jited_linfo, jited_ksyms, jited_func_lens)) { 6549c64779e2SAndrii Nakryiko err = -1; 6550c64779e2SAndrii Nakryiko goto done; 6551c64779e2SAndrii Nakryiko } 6552c64779e2SAndrii Nakryiko 6553c64779e2SAndrii Nakryiko info.nr_jited_line_info = jited_cnt; 6554c64779e2SAndrii Nakryiko info.jited_line_info_rec_size = jited_rec_size; 6555c64779e2SAndrii Nakryiko info.jited_line_info = ptr_to_u64(jited_linfo); 6556c64779e2SAndrii Nakryiko info.nr_jited_ksyms = nr_jited_ksyms; 6557c64779e2SAndrii Nakryiko info.jited_ksyms = ptr_to_u64(jited_ksyms); 6558c64779e2SAndrii Nakryiko info.nr_jited_func_lens = nr_jited_func_lens; 6559c64779e2SAndrii Nakryiko info.jited_func_lens = ptr_to_u64(jited_func_lens); 6560c64779e2SAndrii Nakryiko } 6561c64779e2SAndrii Nakryiko 6562c64779e2SAndrii Nakryiko err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 6563c64779e2SAndrii Nakryiko 6564c64779e2SAndrii Nakryiko /* 6565c64779e2SAndrii Nakryiko * Only recheck the info.*line_info* fields. 6566c64779e2SAndrii Nakryiko * Other fields are not the concern of this test. 6567c64779e2SAndrii Nakryiko */ 6568bad2e478SAndrii Nakryiko if (CHECK(err < 0 || 6569c64779e2SAndrii Nakryiko info.nr_line_info != cnt || 6570c64779e2SAndrii Nakryiko (jited_cnt && !info.jited_line_info) || 6571c64779e2SAndrii Nakryiko info.nr_jited_line_info != jited_cnt || 6572c64779e2SAndrii Nakryiko info.line_info_rec_size != rec_size || 6573c64779e2SAndrii Nakryiko info.jited_line_info_rec_size != jited_rec_size, 6574c64779e2SAndrii 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", 6575c64779e2SAndrii Nakryiko err, errno, 6576c64779e2SAndrii Nakryiko info.nr_line_info, cnt, 6577c64779e2SAndrii Nakryiko info.nr_jited_line_info, jited_cnt, 6578c64779e2SAndrii Nakryiko info.line_info_rec_size, rec_size, 6579c64779e2SAndrii Nakryiko info.jited_line_info_rec_size, jited_rec_size, 6580c64779e2SAndrii Nakryiko (void *)(long)info.line_info, 6581c64779e2SAndrii Nakryiko (void *)(long)info.jited_line_info)) { 6582c64779e2SAndrii Nakryiko err = -1; 6583c64779e2SAndrii Nakryiko goto done; 6584c64779e2SAndrii Nakryiko } 6585c64779e2SAndrii Nakryiko 6586c64779e2SAndrii Nakryiko dead_insns = 0; 6587c64779e2SAndrii Nakryiko while (test->dead_code_mask & (1 << dead_insns)) 6588c64779e2SAndrii Nakryiko dead_insns++; 6589c64779e2SAndrii Nakryiko 6590c64779e2SAndrii Nakryiko CHECK(linfo[0].insn_off, "linfo[0].insn_off:%u", 6591c64779e2SAndrii Nakryiko linfo[0].insn_off); 6592c64779e2SAndrii Nakryiko for (i = 1; i < cnt; i++) { 6593c64779e2SAndrii Nakryiko const struct bpf_line_info *expected_linfo; 6594c64779e2SAndrii Nakryiko 6595c64779e2SAndrii Nakryiko while (test->dead_code_mask & (1 << (i + dead_insns))) 6596c64779e2SAndrii Nakryiko dead_insns++; 6597c64779e2SAndrii Nakryiko 6598c64779e2SAndrii Nakryiko expected_linfo = patched_linfo + 6599c64779e2SAndrii Nakryiko ((i + dead_insns) * test->line_info_rec_size); 6600c64779e2SAndrii Nakryiko if (CHECK(linfo[i].insn_off <= linfo[i - 1].insn_off, 6601c64779e2SAndrii Nakryiko "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u", 6602c64779e2SAndrii Nakryiko i, linfo[i].insn_off, 6603c64779e2SAndrii Nakryiko i - 1, linfo[i - 1].insn_off)) { 6604c64779e2SAndrii Nakryiko err = -1; 6605c64779e2SAndrii Nakryiko goto done; 6606c64779e2SAndrii Nakryiko } 6607c64779e2SAndrii Nakryiko if (CHECK(linfo[i].file_name_off != expected_linfo->file_name_off || 6608c64779e2SAndrii Nakryiko linfo[i].line_off != expected_linfo->line_off || 6609c64779e2SAndrii Nakryiko linfo[i].line_col != expected_linfo->line_col, 6610c64779e2SAndrii Nakryiko "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i, 6611c64779e2SAndrii Nakryiko linfo[i].file_name_off, 6612c64779e2SAndrii Nakryiko linfo[i].line_off, 6613c64779e2SAndrii Nakryiko linfo[i].line_col, 6614c64779e2SAndrii Nakryiko expected_linfo->file_name_off, 6615c64779e2SAndrii Nakryiko expected_linfo->line_off, 6616c64779e2SAndrii Nakryiko expected_linfo->line_col)) { 6617c64779e2SAndrii Nakryiko err = -1; 6618c64779e2SAndrii Nakryiko goto done; 6619c64779e2SAndrii Nakryiko } 6620c64779e2SAndrii Nakryiko } 6621c64779e2SAndrii Nakryiko 6622c64779e2SAndrii Nakryiko if (!jited_cnt) { 6623c64779e2SAndrii Nakryiko fprintf(stderr, "not jited. skipping jited_line_info check. "); 6624c64779e2SAndrii Nakryiko err = 0; 6625c64779e2SAndrii Nakryiko goto done; 6626c64779e2SAndrii Nakryiko } 6627c64779e2SAndrii Nakryiko 6628c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[0] != jited_ksyms[0], 6629c64779e2SAndrii Nakryiko "jited_linfo[0]:%lx != jited_ksyms[0]:%lx", 6630c64779e2SAndrii Nakryiko (long)(jited_linfo[0]), (long)(jited_ksyms[0]))) { 6631c64779e2SAndrii Nakryiko err = -1; 6632c64779e2SAndrii Nakryiko goto done; 6633c64779e2SAndrii Nakryiko } 6634c64779e2SAndrii Nakryiko 6635c64779e2SAndrii Nakryiko ksyms_found = 1; 6636c64779e2SAndrii Nakryiko cur_func_len = jited_func_lens[0]; 6637c64779e2SAndrii Nakryiko cur_func_ksyms = jited_ksyms[0]; 6638c64779e2SAndrii Nakryiko for (i = 1; i < jited_cnt; i++) { 6639c64779e2SAndrii Nakryiko if (ksyms_found < nr_jited_ksyms && 6640c64779e2SAndrii Nakryiko jited_linfo[i] == jited_ksyms[ksyms_found]) { 6641c64779e2SAndrii Nakryiko cur_func_ksyms = jited_ksyms[ksyms_found]; 6642c64779e2SAndrii Nakryiko cur_func_len = jited_ksyms[ksyms_found]; 6643c64779e2SAndrii Nakryiko ksyms_found++; 6644c64779e2SAndrii Nakryiko continue; 6645c64779e2SAndrii Nakryiko } 6646c64779e2SAndrii Nakryiko 6647c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[i] <= jited_linfo[i - 1], 6648c64779e2SAndrii Nakryiko "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx", 6649c64779e2SAndrii Nakryiko i, (long)jited_linfo[i], 6650c64779e2SAndrii Nakryiko i - 1, (long)(jited_linfo[i - 1]))) { 6651c64779e2SAndrii Nakryiko err = -1; 6652c64779e2SAndrii Nakryiko goto done; 6653c64779e2SAndrii Nakryiko } 6654c64779e2SAndrii Nakryiko 6655c64779e2SAndrii Nakryiko if (CHECK(jited_linfo[i] - cur_func_ksyms > cur_func_len, 6656c64779e2SAndrii Nakryiko "jited_linfo[%u]:%lx - %lx > %u", 6657c64779e2SAndrii Nakryiko i, (long)jited_linfo[i], (long)cur_func_ksyms, 6658c64779e2SAndrii Nakryiko cur_func_len)) { 6659c64779e2SAndrii Nakryiko err = -1; 6660c64779e2SAndrii Nakryiko goto done; 6661c64779e2SAndrii Nakryiko } 6662c64779e2SAndrii Nakryiko } 6663c64779e2SAndrii Nakryiko 6664c64779e2SAndrii Nakryiko if (CHECK(ksyms_found != nr_jited_ksyms, 6665c64779e2SAndrii Nakryiko "ksyms_found:%u != nr_jited_ksyms:%u", 6666c64779e2SAndrii Nakryiko ksyms_found, nr_jited_ksyms)) { 6667c64779e2SAndrii Nakryiko err = -1; 6668c64779e2SAndrii Nakryiko goto done; 6669c64779e2SAndrii Nakryiko } 6670c64779e2SAndrii Nakryiko 6671c64779e2SAndrii Nakryiko err = 0; 6672c64779e2SAndrii Nakryiko 6673c64779e2SAndrii Nakryiko done: 6674c64779e2SAndrii Nakryiko free(linfo); 6675c64779e2SAndrii Nakryiko free(jited_linfo); 6676c64779e2SAndrii Nakryiko free(jited_ksyms); 6677c64779e2SAndrii Nakryiko free(jited_func_lens); 6678c64779e2SAndrii Nakryiko return err; 6679c64779e2SAndrii Nakryiko } 6680c64779e2SAndrii Nakryiko 6681c64779e2SAndrii Nakryiko static void do_test_info_raw(unsigned int test_num) 6682c64779e2SAndrii Nakryiko { 6683c64779e2SAndrii Nakryiko const struct prog_info_raw_test *test = &info_raw_tests[test_num - 1]; 6684d3b0b800SAndrii Nakryiko unsigned int raw_btf_size, linfo_str_off, linfo_size = 0; 6685c64779e2SAndrii Nakryiko int btf_fd = -1, prog_fd = -1, err = 0; 6686c64779e2SAndrii Nakryiko void *raw_btf, *patched_linfo = NULL; 6687c64779e2SAndrii Nakryiko const char *ret_next_str; 6688c64779e2SAndrii Nakryiko union bpf_attr attr = {}; 6689c64779e2SAndrii Nakryiko 6690c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 6691c64779e2SAndrii Nakryiko return; 6692c64779e2SAndrii Nakryiko 6693c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types, 6694c64779e2SAndrii Nakryiko test->str_sec, test->str_sec_size, 6695c64779e2SAndrii Nakryiko &raw_btf_size, &ret_next_str); 6696c64779e2SAndrii Nakryiko if (!raw_btf) 6697c64779e2SAndrii Nakryiko return; 6698c64779e2SAndrii Nakryiko 6699c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 6700dc94121bSAndrii Nakryiko btf_fd = load_raw_btf(raw_btf, raw_btf_size); 6701c64779e2SAndrii Nakryiko free(raw_btf); 6702c64779e2SAndrii Nakryiko 6703bad2e478SAndrii Nakryiko if (CHECK(btf_fd < 0, "invalid btf_fd errno:%d", errno)) { 6704c64779e2SAndrii Nakryiko err = -1; 6705c64779e2SAndrii Nakryiko goto done; 6706c64779e2SAndrii Nakryiko } 6707c64779e2SAndrii Nakryiko 6708c64779e2SAndrii Nakryiko if (*btf_log_buf && always_log) 6709c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 6710c64779e2SAndrii Nakryiko *btf_log_buf = '\0'; 6711c64779e2SAndrii Nakryiko 6712c64779e2SAndrii Nakryiko linfo_str_off = ret_next_str - test->str_sec; 6713c64779e2SAndrii Nakryiko patched_linfo = patch_name_tbd(test->line_info, 6714c64779e2SAndrii Nakryiko test->str_sec, linfo_str_off, 6715c64779e2SAndrii Nakryiko test->str_sec_size, &linfo_size); 6716bad2e478SAndrii Nakryiko err = libbpf_get_error(patched_linfo); 6717bad2e478SAndrii Nakryiko if (err) { 6718c64779e2SAndrii Nakryiko fprintf(stderr, "error in creating raw bpf_line_info"); 6719c64779e2SAndrii Nakryiko err = -1; 6720c64779e2SAndrii Nakryiko goto done; 6721c64779e2SAndrii Nakryiko } 6722c64779e2SAndrii Nakryiko 6723c64779e2SAndrii Nakryiko attr.prog_type = test->prog_type; 6724c64779e2SAndrii Nakryiko attr.insns = ptr_to_u64(test->insns); 6725c64779e2SAndrii Nakryiko attr.insn_cnt = probe_prog_length(test->insns); 6726c64779e2SAndrii Nakryiko attr.license = ptr_to_u64("GPL"); 6727c64779e2SAndrii Nakryiko attr.prog_btf_fd = btf_fd; 6728c64779e2SAndrii Nakryiko attr.func_info_rec_size = test->func_info_rec_size; 6729c64779e2SAndrii Nakryiko attr.func_info_cnt = test->func_info_cnt; 6730c64779e2SAndrii Nakryiko attr.func_info = ptr_to_u64(test->func_info); 6731c64779e2SAndrii Nakryiko attr.log_buf = ptr_to_u64(btf_log_buf); 6732c64779e2SAndrii Nakryiko attr.log_size = BTF_LOG_BUF_SIZE; 6733c64779e2SAndrii Nakryiko attr.log_level = 1; 6734c64779e2SAndrii Nakryiko if (linfo_size) { 6735c64779e2SAndrii Nakryiko attr.line_info_rec_size = test->line_info_rec_size; 6736c64779e2SAndrii Nakryiko attr.line_info = ptr_to_u64(patched_linfo); 6737c64779e2SAndrii Nakryiko attr.line_info_cnt = linfo_size / attr.line_info_rec_size; 6738c64779e2SAndrii Nakryiko } 6739c64779e2SAndrii Nakryiko 6740c64779e2SAndrii Nakryiko prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr)); 6741bad2e478SAndrii Nakryiko err = ((prog_fd < 0) != test->expected_prog_load_failure); 6742c64779e2SAndrii Nakryiko if (CHECK(err, "prog_fd:%d expected_prog_load_failure:%u errno:%d", 6743c64779e2SAndrii Nakryiko prog_fd, test->expected_prog_load_failure, errno) || 6744c64779e2SAndrii Nakryiko CHECK(test->err_str && !strstr(btf_log_buf, test->err_str), 6745c64779e2SAndrii Nakryiko "expected err_str:%s", test->err_str)) { 6746c64779e2SAndrii Nakryiko err = -1; 6747c64779e2SAndrii Nakryiko goto done; 6748c64779e2SAndrii Nakryiko } 6749c64779e2SAndrii Nakryiko 6750bad2e478SAndrii Nakryiko if (prog_fd < 0) 6751c64779e2SAndrii Nakryiko goto done; 6752c64779e2SAndrii Nakryiko 6753c64779e2SAndrii Nakryiko err = test_get_finfo(test, prog_fd); 6754c64779e2SAndrii Nakryiko if (err) 6755c64779e2SAndrii Nakryiko goto done; 6756c64779e2SAndrii Nakryiko 6757c64779e2SAndrii Nakryiko err = test_get_linfo(test, patched_linfo, 6758c64779e2SAndrii Nakryiko attr.line_info_cnt - test->dead_code_cnt, 6759c64779e2SAndrii Nakryiko prog_fd); 6760c64779e2SAndrii Nakryiko if (err) 6761c64779e2SAndrii Nakryiko goto done; 6762c64779e2SAndrii Nakryiko 6763c64779e2SAndrii Nakryiko done: 6764c64779e2SAndrii Nakryiko if (*btf_log_buf && (err || always_log)) 6765c64779e2SAndrii Nakryiko fprintf(stderr, "\n%s", btf_log_buf); 6766c64779e2SAndrii Nakryiko 6767bad2e478SAndrii Nakryiko if (btf_fd >= 0) 6768c64779e2SAndrii Nakryiko close(btf_fd); 6769bad2e478SAndrii Nakryiko if (prog_fd >= 0) 6770c64779e2SAndrii Nakryiko close(prog_fd); 6771c64779e2SAndrii Nakryiko 6772bad2e478SAndrii Nakryiko if (!libbpf_get_error(patched_linfo)) 6773c64779e2SAndrii Nakryiko free(patched_linfo); 6774c64779e2SAndrii Nakryiko } 6775c64779e2SAndrii Nakryiko 6776c64779e2SAndrii Nakryiko struct btf_raw_data { 6777c64779e2SAndrii Nakryiko __u32 raw_types[MAX_NR_RAW_U32]; 6778c64779e2SAndrii Nakryiko const char *str_sec; 6779c64779e2SAndrii Nakryiko __u32 str_sec_size; 6780c64779e2SAndrii Nakryiko }; 6781c64779e2SAndrii Nakryiko 6782c64779e2SAndrii Nakryiko struct btf_dedup_test { 6783c64779e2SAndrii Nakryiko const char *descr; 6784c64779e2SAndrii Nakryiko struct btf_raw_data input; 6785c64779e2SAndrii Nakryiko struct btf_raw_data expect; 6786c64779e2SAndrii Nakryiko struct btf_dedup_opts opts; 6787c64779e2SAndrii Nakryiko }; 6788c64779e2SAndrii Nakryiko 6789957d350aSAndrii Nakryiko static struct btf_dedup_test dedup_tests[] = { 6790c64779e2SAndrii Nakryiko 6791c64779e2SAndrii Nakryiko { 6792c64779e2SAndrii Nakryiko .descr = "dedup: unused strings filtering", 6793c64779e2SAndrii Nakryiko .input = { 6794c64779e2SAndrii Nakryiko .raw_types = { 6795c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 4), 6796c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 64, 8), 6797c64779e2SAndrii Nakryiko BTF_END_RAW, 6798c64779e2SAndrii Nakryiko }, 6799c64779e2SAndrii Nakryiko BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"), 6800c64779e2SAndrii Nakryiko }, 6801c64779e2SAndrii Nakryiko .expect = { 6802c64779e2SAndrii Nakryiko .raw_types = { 6803c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6804c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6805c64779e2SAndrii Nakryiko BTF_END_RAW, 6806c64779e2SAndrii Nakryiko }, 6807c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long"), 6808c64779e2SAndrii Nakryiko }, 6809c64779e2SAndrii Nakryiko }, 6810c64779e2SAndrii Nakryiko { 6811c64779e2SAndrii Nakryiko .descr = "dedup: strings deduplication", 6812c64779e2SAndrii Nakryiko .input = { 6813c64779e2SAndrii Nakryiko .raw_types = { 6814c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6815c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6816c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED, 0, 32, 4), 6817c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 64, 8), 6818c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4), 6819c64779e2SAndrii Nakryiko BTF_END_RAW, 6820c64779e2SAndrii Nakryiko }, 6821c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long int\0int\0long int\0int"), 6822c64779e2SAndrii Nakryiko }, 6823c64779e2SAndrii Nakryiko .expect = { 6824c64779e2SAndrii Nakryiko .raw_types = { 6825c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 6826c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8), 6827c64779e2SAndrii Nakryiko BTF_END_RAW, 6828c64779e2SAndrii Nakryiko }, 6829c64779e2SAndrii Nakryiko BTF_STR_SEC("\0int\0long int"), 6830c64779e2SAndrii Nakryiko }, 6831c64779e2SAndrii Nakryiko }, 6832c64779e2SAndrii Nakryiko { 6833c64779e2SAndrii Nakryiko .descr = "dedup: struct example #1", 6834c64779e2SAndrii Nakryiko /* 6835c64779e2SAndrii Nakryiko * struct s { 6836c64779e2SAndrii Nakryiko * struct s *next; 6837c64779e2SAndrii Nakryiko * const int *a; 6838c64779e2SAndrii Nakryiko * int b[16]; 6839c64779e2SAndrii Nakryiko * int c; 6840c64779e2SAndrii Nakryiko * } 6841c64779e2SAndrii Nakryiko */ 6842c64779e2SAndrii Nakryiko .input = { 6843c64779e2SAndrii Nakryiko .raw_types = { 6844c64779e2SAndrii Nakryiko /* int */ 6845c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6846c64779e2SAndrii Nakryiko /* int[16] */ 6847c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */ 6848c64779e2SAndrii Nakryiko /* struct s { */ 68497999cf7dSIlya Leoshkevich BTF_STRUCT_ENC(NAME_NTH(2), 5, 88), /* [3] */ 6850c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(3), 4, 0), /* struct s *next; */ 6851c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(4), 5, 64), /* const int *a; */ 6852c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(5), 2, 128), /* int b[16]; */ 6853c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(6), 1, 640), /* int c; */ 6854ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(8), 15, 672), /* float d; */ 6855c64779e2SAndrii Nakryiko /* ptr -> [3] struct s */ 6856c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [4] */ 6857c64779e2SAndrii Nakryiko /* ptr -> [6] const int */ 6858c64779e2SAndrii Nakryiko BTF_PTR_ENC(6), /* [5] */ 6859c64779e2SAndrii Nakryiko /* const -> [1] int */ 6860c64779e2SAndrii Nakryiko BTF_CONST_ENC(1), /* [6] */ 6861ad526474SYonghong Song /* tag -> [3] struct s */ 6862223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1), /* [7] */ 6863ad526474SYonghong Song /* tag -> [3] struct s, member 1 */ 6864223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1), /* [8] */ 6865c64779e2SAndrii Nakryiko 6866c64779e2SAndrii Nakryiko /* full copy of the above */ 6867ad526474SYonghong Song BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), /* [9] */ 6868ad526474SYonghong Song BTF_TYPE_ARRAY_ENC(9, 9, 16), /* [10] */ 6869ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(2), 5, 88), /* [11] */ 6870ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 12, 0), 6871ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(4), 13, 64), 6872ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(5), 10, 128), 6873ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(6), 9, 640), 6874ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(8), 15, 672), 6875ad526474SYonghong Song BTF_PTR_ENC(11), /* [12] */ 6876ad526474SYonghong Song BTF_PTR_ENC(14), /* [13] */ 6877ad526474SYonghong Song BTF_CONST_ENC(9), /* [14] */ 6878ad526474SYonghong Song BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4), /* [15] */ 6879223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 11, -1), /* [16] */ 6880223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 11, 1), /* [17] */ 6881c64779e2SAndrii Nakryiko BTF_END_RAW, 6882c64779e2SAndrii Nakryiko }, 68837999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0float\0d"), 6884c64779e2SAndrii Nakryiko }, 6885c64779e2SAndrii Nakryiko .expect = { 6886c64779e2SAndrii Nakryiko .raw_types = { 6887c64779e2SAndrii Nakryiko /* int */ 68887999cf7dSIlya Leoshkevich BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 6889c64779e2SAndrii Nakryiko /* int[16] */ 6890c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(1, 1, 16), /* [2] */ 6891c64779e2SAndrii Nakryiko /* struct s { */ 68927999cf7dSIlya Leoshkevich BTF_STRUCT_ENC(NAME_NTH(8), 5, 88), /* [3] */ 68937999cf7dSIlya Leoshkevich BTF_MEMBER_ENC(NAME_NTH(7), 4, 0), /* struct s *next; */ 6894c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(1), 5, 64), /* const int *a; */ 6895c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 128), /* int b[16]; */ 6896c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(3), 1, 640), /* int c; */ 6897ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(4), 9, 672), /* float d; */ 6898c64779e2SAndrii Nakryiko /* ptr -> [3] struct s */ 6899c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [4] */ 6900c64779e2SAndrii Nakryiko /* ptr -> [6] const int */ 6901c64779e2SAndrii Nakryiko BTF_PTR_ENC(6), /* [5] */ 6902c64779e2SAndrii Nakryiko /* const -> [1] int */ 6903c64779e2SAndrii Nakryiko BTF_CONST_ENC(1), /* [6] */ 6904223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1), /* [7] */ 6905223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1), /* [8] */ 6906ad526474SYonghong Song BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4), /* [9] */ 6907c64779e2SAndrii Nakryiko BTF_END_RAW, 6908c64779e2SAndrii Nakryiko }, 69097999cf7dSIlya Leoshkevich BTF_STR_SEC("\0a\0b\0c\0d\0int\0float\0next\0s"), 6910c64779e2SAndrii Nakryiko }, 6911c64779e2SAndrii Nakryiko }, 6912c64779e2SAndrii Nakryiko { 6913c64779e2SAndrii Nakryiko .descr = "dedup: struct <-> fwd resolution w/ hash collision", 6914c64779e2SAndrii Nakryiko /* 6915c64779e2SAndrii Nakryiko * // CU 1: 6916c64779e2SAndrii Nakryiko * struct x; 6917c64779e2SAndrii Nakryiko * struct s { 6918c64779e2SAndrii Nakryiko * struct x *x; 6919c64779e2SAndrii Nakryiko * }; 6920c64779e2SAndrii Nakryiko * // CU 2: 6921c64779e2SAndrii Nakryiko * struct x {}; 6922c64779e2SAndrii Nakryiko * struct s { 6923c64779e2SAndrii Nakryiko * struct x *x; 6924c64779e2SAndrii Nakryiko * }; 6925c64779e2SAndrii Nakryiko */ 6926c64779e2SAndrii Nakryiko .input = { 6927c64779e2SAndrii Nakryiko .raw_types = { 6928c64779e2SAndrii Nakryiko /* CU 1 */ 6929c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 0 /* struct fwd */), /* [1] fwd x */ 6930c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6931c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [3] struct s */ 6932c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 2, 0), 6933c64779e2SAndrii Nakryiko /* CU 2 */ 6934c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 0, 0), /* [4] struct x */ 6935c64779e2SAndrii Nakryiko BTF_PTR_ENC(4), /* [5] ptr -> [4] */ 6936c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [6] struct s */ 6937c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 5, 0), 6938c64779e2SAndrii Nakryiko BTF_END_RAW, 6939c64779e2SAndrii Nakryiko }, 6940c64779e2SAndrii Nakryiko BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"), 6941c64779e2SAndrii Nakryiko }, 6942c64779e2SAndrii Nakryiko .expect = { 6943c64779e2SAndrii Nakryiko .raw_types = { 6944c64779e2SAndrii Nakryiko BTF_PTR_ENC(3), /* [1] ptr -> [3] */ 6945c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [2] struct s */ 6946c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 6947c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(2), 0, 0), /* [3] struct x */ 6948c64779e2SAndrii Nakryiko BTF_END_RAW, 6949c64779e2SAndrii Nakryiko }, 6950c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6951c64779e2SAndrii Nakryiko }, 6952c64779e2SAndrii Nakryiko .opts = { 6953957d350aSAndrii Nakryiko .force_collisions = true, /* force hash collisions */ 6954c64779e2SAndrii Nakryiko }, 6955c64779e2SAndrii Nakryiko }, 6956c64779e2SAndrii Nakryiko { 6957c64779e2SAndrii Nakryiko .descr = "dedup: void equiv check", 6958c64779e2SAndrii Nakryiko /* 6959c64779e2SAndrii Nakryiko * // CU 1: 6960c64779e2SAndrii Nakryiko * struct s { 6961c64779e2SAndrii Nakryiko * struct {} *x; 6962c64779e2SAndrii Nakryiko * }; 6963c64779e2SAndrii Nakryiko * // CU 2: 6964c64779e2SAndrii Nakryiko * struct s { 6965c64779e2SAndrii Nakryiko * int *x; 6966c64779e2SAndrii Nakryiko * }; 6967c64779e2SAndrii Nakryiko */ 6968c64779e2SAndrii Nakryiko .input = { 6969c64779e2SAndrii Nakryiko .raw_types = { 6970c64779e2SAndrii Nakryiko /* CU 1 */ 6971c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */ 6972c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6973c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */ 6974c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 6975c64779e2SAndrii Nakryiko /* CU 2 */ 6976c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [4] ptr -> void */ 6977c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */ 6978c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), 6979c64779e2SAndrii Nakryiko BTF_END_RAW, 6980c64779e2SAndrii Nakryiko }, 6981c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6982c64779e2SAndrii Nakryiko }, 6983c64779e2SAndrii Nakryiko .expect = { 6984c64779e2SAndrii Nakryiko .raw_types = { 6985c64779e2SAndrii Nakryiko /* CU 1 */ 6986c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(0, 0, 1), /* [1] struct {} */ 6987c64779e2SAndrii Nakryiko BTF_PTR_ENC(1), /* [2] ptr -> [1] */ 6988c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [3] struct s */ 6989c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 6990c64779e2SAndrii Nakryiko /* CU 2 */ 6991c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [4] ptr -> void */ 6992c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_NTH(1), 1, 8), /* [5] struct s */ 6993c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_NTH(2), 4, 0), 6994c64779e2SAndrii Nakryiko BTF_END_RAW, 6995c64779e2SAndrii Nakryiko }, 6996c64779e2SAndrii Nakryiko BTF_STR_SEC("\0s\0x"), 6997c64779e2SAndrii Nakryiko }, 6998c64779e2SAndrii Nakryiko .opts = { 6999957d350aSAndrii Nakryiko .force_collisions = true, /* force hash collisions */ 7000c64779e2SAndrii Nakryiko }, 7001c64779e2SAndrii Nakryiko }, 7002c64779e2SAndrii Nakryiko { 7003c64779e2SAndrii Nakryiko .descr = "dedup: all possible kinds (no duplicates)", 7004c64779e2SAndrii Nakryiko .input = { 7005c64779e2SAndrii Nakryiko .raw_types = { 7006c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */ 7007c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */ 7008c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 7009c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 7010c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */ 7011c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */ 7012c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */ 7013c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 7014c64779e2SAndrii Nakryiko BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */ 7015c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 7016c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */ 7017c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [8] ptr */ 7018c64779e2SAndrii Nakryiko BTF_CONST_ENC(8), /* [9] const */ 7019c64779e2SAndrii Nakryiko BTF_VOLATILE_ENC(8), /* [10] volatile */ 7020c64779e2SAndrii Nakryiko BTF_RESTRICT_ENC(8), /* [11] restrict */ 7021c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */ 7022c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 7023846f4826SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 18), 7024c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */ 70257999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [14] float */ 7026557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, -1), /* [15] decl_tag */ 7027557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] decl_tag */ 7028557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 7, -1), /* [17] decl_tag */ 7029846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_TBD, 8), /* [18] type_tag */ 7030adc26d13SYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8), /* [19] enum64 */ 7031adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 0, 0), 7032adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 1, 1), 7033c64779e2SAndrii Nakryiko BTF_END_RAW, 7034c64779e2SAndrii Nakryiko }, 7035adc26d13SYonghong Song BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"), 7036c64779e2SAndrii Nakryiko }, 7037c64779e2SAndrii Nakryiko .expect = { 7038c64779e2SAndrii Nakryiko .raw_types = { 7039c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8), /* [1] int */ 7040c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4), /* [2] enum */ 7041c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 0), 7042c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_TBD, 1), 7043c64779e2SAndrii Nakryiko BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */), /* [3] fwd */ 7044c64779e2SAndrii Nakryiko BTF_TYPE_ARRAY_ENC(2, 1, 7), /* [4] array */ 7045c64779e2SAndrii Nakryiko BTF_STRUCT_ENC(NAME_TBD, 1, 4), /* [5] struct */ 7046c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 7047c64779e2SAndrii Nakryiko BTF_UNION_ENC(NAME_TBD, 1, 4), /* [6] union */ 7048c64779e2SAndrii Nakryiko BTF_MEMBER_ENC(NAME_TBD, 1, 0), 7049c64779e2SAndrii Nakryiko BTF_TYPEDEF_ENC(NAME_TBD, 1), /* [7] typedef */ 7050c64779e2SAndrii Nakryiko BTF_PTR_ENC(0), /* [8] ptr */ 7051c64779e2SAndrii Nakryiko BTF_CONST_ENC(8), /* [9] const */ 7052c64779e2SAndrii Nakryiko BTF_VOLATILE_ENC(8), /* [10] volatile */ 7053c64779e2SAndrii Nakryiko BTF_RESTRICT_ENC(8), /* [11] restrict */ 7054c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ENC(1, 2), /* [12] func_proto */ 7055c64779e2SAndrii Nakryiko BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1), 7056846f4826SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 18), 7057c64779e2SAndrii Nakryiko BTF_FUNC_ENC(NAME_TBD, 12), /* [13] func */ 70587999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [14] float */ 7059557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, -1), /* [15] decl_tag */ 7060557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] decl_tag */ 7061557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_TBD, 7, -1), /* [17] decl_tag */ 7062846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_TBD, 8), /* [18] type_tag */ 7063adc26d13SYonghong Song BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8), /* [19] enum64 */ 7064adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 0, 0), 7065adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_TBD, 1, 1), 7066c64779e2SAndrii Nakryiko BTF_END_RAW, 7067c64779e2SAndrii Nakryiko }, 7068adc26d13SYonghong Song BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"), 7069c64779e2SAndrii Nakryiko }, 7070c64779e2SAndrii Nakryiko }, 7071c64779e2SAndrii Nakryiko { 70727999cf7dSIlya Leoshkevich .descr = "dedup: no int/float duplicates", 7073c64779e2SAndrii Nakryiko .input = { 7074c64779e2SAndrii Nakryiko .raw_types = { 7075c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8), 7076c64779e2SAndrii Nakryiko /* different name */ 7077c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8), 7078c64779e2SAndrii Nakryiko /* different encoding */ 7079c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8), 7080c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8), 7081c64779e2SAndrii Nakryiko /* different bit offset */ 7082c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8), 7083c64779e2SAndrii Nakryiko /* different bit size */ 7084c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8), 7085c64779e2SAndrii Nakryiko /* different byte size */ 7086c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 70877999cf7dSIlya Leoshkevich /* all allowed sizes */ 70887999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2), 70897999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4), 70907999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8), 70917999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12), 70927999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16), 7093c64779e2SAndrii Nakryiko BTF_END_RAW, 7094c64779e2SAndrii Nakryiko }, 70957999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0some other int\0float"), 7096c64779e2SAndrii Nakryiko }, 7097c64779e2SAndrii Nakryiko .expect = { 7098c64779e2SAndrii Nakryiko .raw_types = { 7099c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8), 7100c64779e2SAndrii Nakryiko /* different name */ 7101c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8), 7102c64779e2SAndrii Nakryiko /* different encoding */ 7103c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8), 7104c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8), 7105c64779e2SAndrii Nakryiko /* different bit offset */ 7106c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8), 7107c64779e2SAndrii Nakryiko /* different bit size */ 7108c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8), 7109c64779e2SAndrii Nakryiko /* different byte size */ 7110c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4), 71117999cf7dSIlya Leoshkevich /* all allowed sizes */ 71127999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2), 71137999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4), 71147999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8), 71157999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12), 71167999cf7dSIlya Leoshkevich BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16), 7117c64779e2SAndrii Nakryiko BTF_END_RAW, 7118c64779e2SAndrii Nakryiko }, 71197999cf7dSIlya Leoshkevich BTF_STR_SEC("\0int\0some other int\0float"), 7120c64779e2SAndrii Nakryiko }, 7121c64779e2SAndrii Nakryiko }, 7122c64779e2SAndrii Nakryiko { 7123c64779e2SAndrii Nakryiko .descr = "dedup: enum fwd resolution", 7124c64779e2SAndrii Nakryiko .input = { 7125c64779e2SAndrii Nakryiko .raw_types = { 7126c64779e2SAndrii Nakryiko /* [1] fwd enum 'e1' before full enum */ 7127c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 7128c64779e2SAndrii Nakryiko /* [2] full enum 'e1' after fwd */ 7129c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7130c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 123), 7131c64779e2SAndrii Nakryiko /* [3] full enum 'e2' before fwd */ 7132c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7133c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(4), 456), 7134c64779e2SAndrii Nakryiko /* [4] fwd enum 'e2' after full enum */ 7135c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 71362e20f50fSEduard Zingerman /* [5] fwd enum with different size, size does not matter for fwd */ 7137c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1), 7138c64779e2SAndrii Nakryiko /* [6] incompatible full enum with different value */ 7139c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7140c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 321), 7141c64779e2SAndrii Nakryiko BTF_END_RAW, 7142c64779e2SAndrii Nakryiko }, 7143c64779e2SAndrii Nakryiko BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7144c64779e2SAndrii Nakryiko }, 7145c64779e2SAndrii Nakryiko .expect = { 7146c64779e2SAndrii Nakryiko .raw_types = { 7147c64779e2SAndrii Nakryiko /* [1] full enum 'e1' */ 7148c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7149c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 123), 7150c64779e2SAndrii Nakryiko /* [2] full enum 'e2' */ 7151c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7152c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(4), 456), 71532e20f50fSEduard Zingerman /* [3] incompatible full enum with different value */ 7154c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7155c64779e2SAndrii Nakryiko BTF_ENUM_ENC(NAME_NTH(2), 321), 7156c64779e2SAndrii Nakryiko BTF_END_RAW, 7157c64779e2SAndrii Nakryiko }, 7158c64779e2SAndrii Nakryiko BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7159c64779e2SAndrii Nakryiko }, 7160c64779e2SAndrii Nakryiko }, 7161c64779e2SAndrii Nakryiko { 7162c64779e2SAndrii Nakryiko .descr = "dedup: datasec and vars pass-through", 7163c64779e2SAndrii Nakryiko .input = { 7164c64779e2SAndrii Nakryiko .raw_types = { 7165c64779e2SAndrii Nakryiko /* int */ 7166c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7167c64779e2SAndrii Nakryiko /* static int t */ 7168c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */ 7169c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 7170c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7171c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 7172c64779e2SAndrii Nakryiko /* int, referenced from [5] */ 7173c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [4] */ 7174c64779e2SAndrii Nakryiko /* another static int t */ 7175c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 4, 0), /* [5] */ 7176c64779e2SAndrii Nakryiko /* another .bss section */ /* [6] */ 7177c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7178c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(5, 0, 4), 7179c64779e2SAndrii Nakryiko BTF_END_RAW, 7180c64779e2SAndrii Nakryiko }, 7181c64779e2SAndrii Nakryiko BTF_STR_SEC("\0.bss\0t"), 7182c64779e2SAndrii Nakryiko }, 7183c64779e2SAndrii Nakryiko .expect = { 7184c64779e2SAndrii Nakryiko .raw_types = { 7185c64779e2SAndrii Nakryiko /* int */ 7186c64779e2SAndrii Nakryiko BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7187c64779e2SAndrii Nakryiko /* static int t */ 7188c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [2] */ 7189c64779e2SAndrii Nakryiko /* .bss section */ /* [3] */ 7190c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7191c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(2, 0, 4), 7192c64779e2SAndrii Nakryiko /* another static int t */ 7193c64779e2SAndrii Nakryiko BTF_VAR_ENC(NAME_NTH(2), 1, 0), /* [4] */ 7194c64779e2SAndrii Nakryiko /* another .bss section */ /* [5] */ 7195c64779e2SAndrii Nakryiko BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 7196c64779e2SAndrii Nakryiko BTF_VAR_SECINFO_ENC(4, 0, 4), 7197c64779e2SAndrii Nakryiko BTF_END_RAW, 7198c64779e2SAndrii Nakryiko }, 7199c64779e2SAndrii Nakryiko BTF_STR_SEC("\0.bss\0t"), 7200c64779e2SAndrii Nakryiko }, 7201c64779e2SAndrii Nakryiko .opts = { 7202957d350aSAndrii Nakryiko .force_collisions = true 7203c64779e2SAndrii Nakryiko }, 7204c64779e2SAndrii Nakryiko }, 7205ad526474SYonghong Song { 7206ad526474SYonghong Song .descr = "dedup: func/func_arg/var tags", 7207ad526474SYonghong Song .input = { 7208ad526474SYonghong Song .raw_types = { 7209ad526474SYonghong Song /* int */ 7210ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7211ad526474SYonghong Song /* static int t */ 7212ad526474SYonghong Song BTF_VAR_ENC(NAME_NTH(1), 1, 0), /* [2] */ 7213ad526474SYonghong Song /* void f(int a1, int a2) */ 7214ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 7215ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7216ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1), 7217ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(4), 2), /* [4] */ 7218ad526474SYonghong Song /* tag -> t */ 7219223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7220223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [6] */ 7221ad526474SYonghong Song /* tag -> func */ 7222223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [7] */ 7223223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [8] */ 7224ad526474SYonghong Song /* tag -> func arg a1 */ 7225223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [9] */ 7226223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [10] */ 7227ad526474SYonghong Song BTF_END_RAW, 7228ad526474SYonghong Song }, 7229ad526474SYonghong Song BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), 7230ad526474SYonghong Song }, 7231ad526474SYonghong Song .expect = { 7232ad526474SYonghong Song .raw_types = { 7233ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7234ad526474SYonghong Song BTF_VAR_ENC(NAME_NTH(1), 1, 0), /* [2] */ 7235ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [3] */ 7236ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7237ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1), 7238ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(4), 2), /* [4] */ 7239223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7240223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1), /* [6] */ 7241223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1), /* [7] */ 7242ad526474SYonghong Song BTF_END_RAW, 7243ad526474SYonghong Song }, 7244ad526474SYonghong Song BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), 7245ad526474SYonghong Song }, 7246ad526474SYonghong Song }, 7247ad526474SYonghong Song { 7248ad526474SYonghong Song .descr = "dedup: func/func_param tags", 7249ad526474SYonghong Song .input = { 7250ad526474SYonghong Song .raw_types = { 7251ad526474SYonghong Song /* int */ 7252ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7253ad526474SYonghong Song /* void f(int a1, int a2) */ 7254ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 7255ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7256ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7257ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 2), /* [3] */ 7258ad526474SYonghong Song /* void f(int a1, int a2) */ 7259ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [4] */ 7260ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7261ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7262ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 4), /* [5] */ 7263ad526474SYonghong Song /* tag -> f: tag1, tag2 */ 7264223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [6] */ 7265223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1), /* [7] */ 7266ad526474SYonghong Song /* tag -> f/a2: tag1, tag2 */ 7267223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [8] */ 7268223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1), /* [9] */ 7269ad526474SYonghong Song /* tag -> f: tag1, tag3 */ 7270223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 5, -1), /* [10] */ 7271223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 5, -1), /* [11] */ 7272ad526474SYonghong Song /* tag -> f/a2: tag1, tag3 */ 7273223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 5, 1), /* [12] */ 7274223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 5, 1), /* [13] */ 7275ad526474SYonghong Song BTF_END_RAW, 7276ad526474SYonghong Song }, 7277ad526474SYonghong Song BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), 7278ad526474SYonghong Song }, 7279ad526474SYonghong Song .expect = { 7280ad526474SYonghong Song .raw_types = { 7281ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7282ad526474SYonghong Song BTF_FUNC_PROTO_ENC(0, 2), /* [2] */ 7283ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1), 7284ad526474SYonghong Song BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1), 7285ad526474SYonghong Song BTF_FUNC_ENC(NAME_NTH(3), 2), /* [3] */ 7286223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [4] */ 7287223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1), /* [5] */ 7288223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1), /* [6] */ 7289223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [7] */ 7290223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1), /* [8] */ 7291223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1), /* [9] */ 7292ad526474SYonghong Song BTF_END_RAW, 7293ad526474SYonghong Song }, 7294ad526474SYonghong Song BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), 7295ad526474SYonghong Song }, 7296ad526474SYonghong Song }, 7297ad526474SYonghong Song { 7298ad526474SYonghong Song .descr = "dedup: struct/struct_member tags", 7299ad526474SYonghong Song .input = { 7300ad526474SYonghong Song .raw_types = { 7301ad526474SYonghong Song /* int */ 7302ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7303ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [2] */ 7304ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7305ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7306ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [3] */ 7307ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7308ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7309ad526474SYonghong Song /* tag -> t: tag1, tag2 */ 7310223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1), /* [4] */ 7311223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [5] */ 7312ad526474SYonghong Song /* tag -> t/m2: tag1, tag2 */ 7313223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1), /* [6] */ 7314223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1), /* [7] */ 7315ad526474SYonghong Song /* tag -> t: tag1, tag3 */ 7316223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [8] */ 7317223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1), /* [9] */ 7318ad526474SYonghong Song /* tag -> t/m2: tag1, tag3 */ 7319223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1), /* [10] */ 7320223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1), /* [11] */ 7321ad526474SYonghong Song BTF_END_RAW, 7322ad526474SYonghong Song }, 7323ad526474SYonghong Song BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), 7324ad526474SYonghong Song }, 7325ad526474SYonghong Song .expect = { 7326ad526474SYonghong Song .raw_types = { 7327ad526474SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7328ad526474SYonghong Song BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [2] */ 7329ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(2), 1, 0), 7330ad526474SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), 7331223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1), /* [3] */ 7332223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1), /* [4] */ 7333223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 2, -1), /* [5] */ 7334223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1), /* [6] */ 7335223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1), /* [7] */ 7336223f903eSYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(6), 2, 1), /* [8] */ 7337ad526474SYonghong Song BTF_END_RAW, 7338ad526474SYonghong Song }, 7339ad526474SYonghong Song BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), 7340ad526474SYonghong Song }, 7341ad526474SYonghong Song }, 7342557c8c48SYonghong Song { 7343557c8c48SYonghong Song .descr = "dedup: typedef tags", 7344557c8c48SYonghong Song .input = { 7345557c8c48SYonghong Song .raw_types = { 7346557c8c48SYonghong Song /* int */ 7347557c8c48SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7348557c8c48SYonghong Song BTF_TYPEDEF_ENC(NAME_NTH(1), 1), /* [2] */ 7349557c8c48SYonghong Song BTF_TYPEDEF_ENC(NAME_NTH(1), 1), /* [3] */ 7350557c8c48SYonghong Song /* tag -> t: tag1, tag2 */ 7351557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1), /* [4] */ 7352557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1), /* [5] */ 7353557c8c48SYonghong Song /* tag -> t: tag1, tag3 */ 7354557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1), /* [6] */ 7355557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1), /* [7] */ 7356557c8c48SYonghong Song BTF_END_RAW, 7357557c8c48SYonghong Song }, 7358557c8c48SYonghong Song BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"), 7359557c8c48SYonghong Song }, 7360557c8c48SYonghong Song .expect = { 7361557c8c48SYonghong Song .raw_types = { 7362557c8c48SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7363557c8c48SYonghong Song BTF_TYPEDEF_ENC(NAME_NTH(1), 1), /* [2] */ 7364557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1), /* [3] */ 7365557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1), /* [4] */ 7366557c8c48SYonghong Song BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1), /* [5] */ 7367557c8c48SYonghong Song BTF_END_RAW, 7368557c8c48SYonghong Song }, 7369557c8c48SYonghong Song BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"), 7370557c8c48SYonghong Song }, 7371557c8c48SYonghong Song }, 7372846f4826SYonghong Song { 7373846f4826SYonghong Song .descr = "dedup: btf_type_tag #1", 7374846f4826SYonghong Song .input = { 7375846f4826SYonghong Song .raw_types = { 7376846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7377846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7378846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7379846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7380846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7381846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7382846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [5] */ 7383846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 5), /* [6] */ 7384846f4826SYonghong Song BTF_PTR_ENC(6), /* [7] */ 7385846f4826SYonghong Song /* ptr -> tag1 -> int */ 7386846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [8] */ 7387846f4826SYonghong Song BTF_PTR_ENC(8), /* [9] */ 7388846f4826SYonghong Song BTF_END_RAW, 7389846f4826SYonghong Song }, 7390846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7391846f4826SYonghong Song }, 7392846f4826SYonghong Song .expect = { 7393846f4826SYonghong Song .raw_types = { 7394846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7395846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7396846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7397846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7398846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7399846f4826SYonghong Song /* ptr -> tag1 -> int */ 7400846f4826SYonghong Song BTF_PTR_ENC(2), /* [5] */ 7401846f4826SYonghong Song BTF_END_RAW, 7402846f4826SYonghong Song }, 7403846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7404846f4826SYonghong Song }, 7405846f4826SYonghong Song }, 7406846f4826SYonghong Song { 7407846f4826SYonghong Song .descr = "dedup: btf_type_tag #2", 7408846f4826SYonghong Song .input = { 7409846f4826SYonghong Song .raw_types = { 7410846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7411846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7412846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7413846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7414846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7415846f4826SYonghong Song /* ptr -> tag2 -> int */ 7416846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 1), /* [5] */ 7417846f4826SYonghong Song BTF_PTR_ENC(5), /* [6] */ 7418846f4826SYonghong Song BTF_END_RAW, 7419846f4826SYonghong Song }, 7420846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7421846f4826SYonghong Song }, 7422846f4826SYonghong Song .expect = { 7423846f4826SYonghong Song .raw_types = { 7424846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7425846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7426846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7427846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7428846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7429846f4826SYonghong Song /* ptr -> tag2 -> int */ 7430846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 1), /* [5] */ 7431846f4826SYonghong Song BTF_PTR_ENC(5), /* [6] */ 7432846f4826SYonghong Song BTF_END_RAW, 7433846f4826SYonghong Song }, 7434846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7435846f4826SYonghong Song }, 7436846f4826SYonghong Song }, 7437846f4826SYonghong Song { 7438846f4826SYonghong Song .descr = "dedup: btf_type_tag #3", 7439846f4826SYonghong Song .input = { 7440846f4826SYonghong Song .raw_types = { 7441846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7442846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7443846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7444846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7445846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7446846f4826SYonghong Song /* ptr -> tag1 -> tag2 -> int */ 7447846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 1), /* [5] */ 7448846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 5), /* [6] */ 7449846f4826SYonghong Song BTF_PTR_ENC(6), /* [7] */ 7450846f4826SYonghong Song BTF_END_RAW, 7451846f4826SYonghong Song }, 7452846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7453846f4826SYonghong Song }, 7454846f4826SYonghong Song .expect = { 7455846f4826SYonghong Song .raw_types = { 7456846f4826SYonghong Song /* ptr -> tag2 -> tag1 -> int */ 7457846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7458846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7459846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 2), /* [3] */ 7460846f4826SYonghong Song BTF_PTR_ENC(3), /* [4] */ 7461846f4826SYonghong Song /* ptr -> tag1 -> tag2 -> int */ 7462846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(2), 1), /* [5] */ 7463846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 5), /* [6] */ 7464846f4826SYonghong Song BTF_PTR_ENC(6), /* [7] */ 7465846f4826SYonghong Song BTF_END_RAW, 7466846f4826SYonghong Song }, 7467846f4826SYonghong Song BTF_STR_SEC("\0tag1\0tag2"), 7468846f4826SYonghong Song }, 7469846f4826SYonghong Song }, 7470846f4826SYonghong Song { 7471846f4826SYonghong Song .descr = "dedup: btf_type_tag #4", 7472846f4826SYonghong Song .input = { 7473846f4826SYonghong Song .raw_types = { 7474846f4826SYonghong Song /* ptr -> tag1 -> int */ 7475846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7476846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7477846f4826SYonghong Song BTF_PTR_ENC(2), /* [3] */ 7478846f4826SYonghong Song /* ptr -> tag1 -> long */ 7479846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8), /* [4] */ 7480846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 4), /* [5] */ 7481846f4826SYonghong Song BTF_PTR_ENC(5), /* [6] */ 7482846f4826SYonghong Song BTF_END_RAW, 7483846f4826SYonghong Song }, 7484846f4826SYonghong Song BTF_STR_SEC("\0tag1"), 7485846f4826SYonghong Song }, 7486846f4826SYonghong Song .expect = { 7487846f4826SYonghong Song .raw_types = { 7488846f4826SYonghong Song /* ptr -> tag1 -> int */ 7489846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 7490846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 7491846f4826SYonghong Song BTF_PTR_ENC(2), /* [3] */ 7492846f4826SYonghong Song /* ptr -> tag1 -> long */ 7493846f4826SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8), /* [4] */ 7494846f4826SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 4), /* [5] */ 7495846f4826SYonghong Song BTF_PTR_ENC(5), /* [6] */ 7496846f4826SYonghong Song BTF_END_RAW, 7497846f4826SYonghong Song }, 7498846f4826SYonghong Song BTF_STR_SEC("\0tag1"), 7499846f4826SYonghong Song }, 7500846f4826SYonghong Song }, 750147461583SYonghong Song { 750247461583SYonghong Song .descr = "dedup: btf_type_tag #5, struct", 750347461583SYonghong Song .input = { 750447461583SYonghong Song .raw_types = { 750547461583SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 750647461583SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 750747461583SYonghong Song BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4), /* [3] */ 750847461583SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 2, BTF_MEMBER_OFFSET(0, 0)), 750947461583SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [4] */ 751047461583SYonghong Song BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4), /* [5] */ 751147461583SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 4, BTF_MEMBER_OFFSET(0, 0)), 751247461583SYonghong Song BTF_END_RAW, 751347461583SYonghong Song }, 751447461583SYonghong Song BTF_STR_SEC("\0tag1\0t\0m"), 751547461583SYonghong Song }, 751647461583SYonghong Song .expect = { 751747461583SYonghong Song .raw_types = { 751847461583SYonghong Song BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ 751947461583SYonghong Song BTF_TYPE_TAG_ENC(NAME_NTH(1), 1), /* [2] */ 752047461583SYonghong Song BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4), /* [3] */ 752147461583SYonghong Song BTF_MEMBER_ENC(NAME_NTH(3), 2, BTF_MEMBER_OFFSET(0, 0)), 752247461583SYonghong Song BTF_END_RAW, 752347461583SYonghong Song }, 752447461583SYonghong Song BTF_STR_SEC("\0tag1\0t\0m"), 752547461583SYonghong Song }, 752647461583SYonghong Song }, 7527adc26d13SYonghong Song { 7528adc26d13SYonghong Song .descr = "dedup: enum64, standalone", 7529adc26d13SYonghong Song .input = { 7530adc26d13SYonghong Song .raw_types = { 7531adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7532adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7533adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7534adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7535adc26d13SYonghong Song BTF_END_RAW, 7536adc26d13SYonghong Song }, 7537adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val"), 7538adc26d13SYonghong Song }, 7539adc26d13SYonghong Song .expect = { 7540adc26d13SYonghong Song .raw_types = { 7541adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7542adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7543adc26d13SYonghong Song BTF_END_RAW, 7544adc26d13SYonghong Song }, 7545adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val"), 7546adc26d13SYonghong Song }, 7547adc26d13SYonghong Song }, 7548adc26d13SYonghong Song { 7549adc26d13SYonghong Song .descr = "dedup: enum64, fwd resolution", 7550adc26d13SYonghong Song .input = { 7551adc26d13SYonghong Song .raw_types = { 7552adc26d13SYonghong Song /* [1] fwd enum64 'e1' before full enum */ 7553adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 7554adc26d13SYonghong Song /* [2] full enum64 'e1' after fwd */ 7555adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7556adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7557adc26d13SYonghong Song /* [3] full enum64 'e2' before fwd */ 7558adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7559adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), 7560adc26d13SYonghong Song /* [4] fwd enum64 'e2' after full enum */ 7561adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 7562adc26d13SYonghong Song /* [5] incompatible full enum64 with different value */ 7563adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7564adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), 7565adc26d13SYonghong Song BTF_END_RAW, 7566adc26d13SYonghong Song }, 7567adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7568adc26d13SYonghong Song }, 7569adc26d13SYonghong Song .expect = { 7570adc26d13SYonghong Song .raw_types = { 7571adc26d13SYonghong Song /* [1] full enum64 'e1' */ 7572adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7573adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7574adc26d13SYonghong Song /* [2] full enum64 'e2' */ 7575adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7576adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), 7577adc26d13SYonghong Song /* [3] incompatible full enum64 with different value */ 7578adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7579adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), 7580adc26d13SYonghong Song BTF_END_RAW, 7581adc26d13SYonghong Song }, 7582adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7583adc26d13SYonghong Song }, 7584adc26d13SYonghong Song }, 7585adc26d13SYonghong Song { 7586adc26d13SYonghong Song .descr = "dedup: enum and enum64, no dedup", 7587adc26d13SYonghong Song .input = { 7588adc26d13SYonghong Song .raw_types = { 7589adc26d13SYonghong Song /* [1] enum 'e1' */ 7590adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7591adc26d13SYonghong Song BTF_ENUM_ENC(NAME_NTH(2), 1), 7592adc26d13SYonghong Song /* [2] enum64 'e1' */ 7593adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), 7594adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7595adc26d13SYonghong Song BTF_END_RAW, 7596adc26d13SYonghong Song }, 7597adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val"), 7598adc26d13SYonghong Song }, 7599adc26d13SYonghong Song .expect = { 7600adc26d13SYonghong Song .raw_types = { 7601adc26d13SYonghong Song /* [1] enum 'e1' */ 7602adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7603adc26d13SYonghong Song BTF_ENUM_ENC(NAME_NTH(2), 1), 7604adc26d13SYonghong Song /* [2] enum64 'e1' */ 7605adc26d13SYonghong Song BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), 7606adc26d13SYonghong Song BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7607adc26d13SYonghong Song BTF_END_RAW, 7608adc26d13SYonghong Song }, 7609adc26d13SYonghong Song BTF_STR_SEC("\0e1\0e1_val"), 7610adc26d13SYonghong Song }, 7611adc26d13SYonghong Song }, 76122e20f50fSEduard Zingerman { 76132e20f50fSEduard Zingerman .descr = "dedup: enum of different size: no dedup", 76142e20f50fSEduard Zingerman .input = { 76152e20f50fSEduard Zingerman .raw_types = { 76162e20f50fSEduard Zingerman /* [1] enum 'e1' */ 76172e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 76182e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76192e20f50fSEduard Zingerman /* [2] enum 'e1' */ 76202e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2), 76212e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76222e20f50fSEduard Zingerman BTF_END_RAW, 76232e20f50fSEduard Zingerman }, 76242e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val"), 76252e20f50fSEduard Zingerman }, 76262e20f50fSEduard Zingerman .expect = { 76272e20f50fSEduard Zingerman .raw_types = { 76282e20f50fSEduard Zingerman /* [1] enum 'e1' */ 76292e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 76302e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76312e20f50fSEduard Zingerman /* [2] enum 'e1' */ 76322e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2), 76332e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76342e20f50fSEduard Zingerman BTF_END_RAW, 76352e20f50fSEduard Zingerman }, 76362e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val"), 76372e20f50fSEduard Zingerman }, 76382e20f50fSEduard Zingerman }, 76392e20f50fSEduard Zingerman { 76402e20f50fSEduard Zingerman .descr = "dedup: enum fwd to enum64", 76412e20f50fSEduard Zingerman .input = { 76422e20f50fSEduard Zingerman .raw_types = { 76432e20f50fSEduard Zingerman /* [1] enum64 'e1' */ 76442e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 76452e20f50fSEduard Zingerman BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 76462e20f50fSEduard Zingerman /* [2] enum 'e1' fwd */ 76472e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4), 76482e20f50fSEduard Zingerman /* [3] typedef enum 'e1' td */ 76492e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2), 76502e20f50fSEduard Zingerman BTF_END_RAW, 76512e20f50fSEduard Zingerman }, 76522e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val\0td"), 76532e20f50fSEduard Zingerman }, 76542e20f50fSEduard Zingerman .expect = { 76552e20f50fSEduard Zingerman .raw_types = { 76562e20f50fSEduard Zingerman /* [1] enum64 'e1' */ 76572e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 76582e20f50fSEduard Zingerman BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 76592e20f50fSEduard Zingerman /* [2] typedef enum 'e1' td */ 76602e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1), 76612e20f50fSEduard Zingerman BTF_END_RAW, 76622e20f50fSEduard Zingerman }, 76632e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val\0td"), 76642e20f50fSEduard Zingerman }, 76652e20f50fSEduard Zingerman }, 76662e20f50fSEduard Zingerman { 76672e20f50fSEduard Zingerman .descr = "dedup: enum64 fwd to enum", 76682e20f50fSEduard Zingerman .input = { 76692e20f50fSEduard Zingerman .raw_types = { 76702e20f50fSEduard Zingerman /* [1] enum 'e1' */ 76712e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 76722e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76732e20f50fSEduard Zingerman /* [2] enum64 'e1' fwd */ 76742e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 76752e20f50fSEduard Zingerman /* [3] typedef enum 'e1' td */ 76762e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2), 76772e20f50fSEduard Zingerman BTF_END_RAW, 76782e20f50fSEduard Zingerman }, 76792e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val\0td"), 76802e20f50fSEduard Zingerman }, 76812e20f50fSEduard Zingerman .expect = { 76822e20f50fSEduard Zingerman .raw_types = { 76832e20f50fSEduard Zingerman /* [1] enum 'e1' */ 76842e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 76852e20f50fSEduard Zingerman BTF_ENUM_ENC(NAME_NTH(2), 1), 76862e20f50fSEduard Zingerman /* [2] typedef enum 'e1' td */ 76872e20f50fSEduard Zingerman BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1), 76882e20f50fSEduard Zingerman BTF_END_RAW, 76892e20f50fSEduard Zingerman }, 76902e20f50fSEduard Zingerman BTF_STR_SEC("\0e1\0e1_val\0td"), 76912e20f50fSEduard Zingerman }, 76922e20f50fSEduard Zingerman }, 7693*99e18fadSEduard Zingerman { 7694*99e18fadSEduard Zingerman .descr = "dedup: standalone fwd declaration struct", 7695*99e18fadSEduard Zingerman /* 7696*99e18fadSEduard Zingerman * Verify that CU1:foo and CU2:foo would be unified and that 7697*99e18fadSEduard Zingerman * typedef/ptr would be updated to point to CU1:foo. 7698*99e18fadSEduard Zingerman * 7699*99e18fadSEduard Zingerman * // CU 1: 7700*99e18fadSEduard Zingerman * struct foo { int x; }; 7701*99e18fadSEduard Zingerman * 7702*99e18fadSEduard Zingerman * // CU 2: 7703*99e18fadSEduard Zingerman * struct foo; 7704*99e18fadSEduard Zingerman * typedef struct foo *foo_ptr; 7705*99e18fadSEduard Zingerman */ 7706*99e18fadSEduard Zingerman .input = { 7707*99e18fadSEduard Zingerman .raw_types = { 7708*99e18fadSEduard Zingerman /* CU 1 */ 7709*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7710*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7711*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7712*99e18fadSEduard Zingerman /* CU 2 */ 7713*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_NTH(1), 0), /* [3] */ 7714*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7715*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 4), /* [5] */ 7716*99e18fadSEduard Zingerman BTF_END_RAW, 7717*99e18fadSEduard Zingerman }, 7718*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7719*99e18fadSEduard Zingerman }, 7720*99e18fadSEduard Zingerman .expect = { 7721*99e18fadSEduard Zingerman .raw_types = { 7722*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7723*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7724*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7725*99e18fadSEduard Zingerman BTF_PTR_ENC(1), /* [3] */ 7726*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 3), /* [4] */ 7727*99e18fadSEduard Zingerman BTF_END_RAW, 7728*99e18fadSEduard Zingerman }, 7729*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7730*99e18fadSEduard Zingerman }, 7731*99e18fadSEduard Zingerman }, 7732*99e18fadSEduard Zingerman { 7733*99e18fadSEduard Zingerman .descr = "dedup: standalone fwd declaration union", 7734*99e18fadSEduard Zingerman /* 7735*99e18fadSEduard Zingerman * Verify that CU1:foo and CU2:foo would be unified and that 7736*99e18fadSEduard Zingerman * typedef/ptr would be updated to point to CU1:foo. 7737*99e18fadSEduard Zingerman * Same as "dedup: standalone fwd declaration struct" but for unions. 7738*99e18fadSEduard Zingerman * 7739*99e18fadSEduard Zingerman * // CU 1: 7740*99e18fadSEduard Zingerman * union foo { int x; }; 7741*99e18fadSEduard Zingerman * 7742*99e18fadSEduard Zingerman * // CU 2: 7743*99e18fadSEduard Zingerman * union foo; 7744*99e18fadSEduard Zingerman * typedef union foo *foo_ptr; 7745*99e18fadSEduard Zingerman */ 7746*99e18fadSEduard Zingerman .input = { 7747*99e18fadSEduard Zingerman .raw_types = { 7748*99e18fadSEduard Zingerman /* CU 1 */ 7749*99e18fadSEduard Zingerman BTF_UNION_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7750*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7751*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7752*99e18fadSEduard Zingerman /* CU 2 */ 7753*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_TBD, 1), /* [3] */ 7754*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7755*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 4), /* [5] */ 7756*99e18fadSEduard Zingerman BTF_END_RAW, 7757*99e18fadSEduard Zingerman }, 7758*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7759*99e18fadSEduard Zingerman }, 7760*99e18fadSEduard Zingerman .expect = { 7761*99e18fadSEduard Zingerman .raw_types = { 7762*99e18fadSEduard Zingerman BTF_UNION_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7763*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7764*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7765*99e18fadSEduard Zingerman BTF_PTR_ENC(1), /* [3] */ 7766*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 3), /* [4] */ 7767*99e18fadSEduard Zingerman BTF_END_RAW, 7768*99e18fadSEduard Zingerman }, 7769*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7770*99e18fadSEduard Zingerman }, 7771*99e18fadSEduard Zingerman }, 7772*99e18fadSEduard Zingerman { 7773*99e18fadSEduard Zingerman .descr = "dedup: standalone fwd declaration wrong kind", 7774*99e18fadSEduard Zingerman /* 7775*99e18fadSEduard Zingerman * Negative test for btf_dedup_resolve_fwds: 7776*99e18fadSEduard Zingerman * - CU1:foo is a struct, C2:foo is a union, thus CU2:foo is not deduped; 7777*99e18fadSEduard Zingerman * - typedef/ptr should remain unchanged as well. 7778*99e18fadSEduard Zingerman * 7779*99e18fadSEduard Zingerman * // CU 1: 7780*99e18fadSEduard Zingerman * struct foo { int x; }; 7781*99e18fadSEduard Zingerman * 7782*99e18fadSEduard Zingerman * // CU 2: 7783*99e18fadSEduard Zingerman * union foo; 7784*99e18fadSEduard Zingerman * typedef union foo *foo_ptr; 7785*99e18fadSEduard Zingerman */ 7786*99e18fadSEduard Zingerman .input = { 7787*99e18fadSEduard Zingerman .raw_types = { 7788*99e18fadSEduard Zingerman /* CU 1 */ 7789*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7790*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7791*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7792*99e18fadSEduard Zingerman /* CU 2 */ 7793*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_NTH(3), 1), /* [3] */ 7794*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7795*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 4), /* [5] */ 7796*99e18fadSEduard Zingerman BTF_END_RAW, 7797*99e18fadSEduard Zingerman }, 7798*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7799*99e18fadSEduard Zingerman }, 7800*99e18fadSEduard Zingerman .expect = { 7801*99e18fadSEduard Zingerman .raw_types = { 7802*99e18fadSEduard Zingerman /* CU 1 */ 7803*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7804*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7805*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7806*99e18fadSEduard Zingerman /* CU 2 */ 7807*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_NTH(3), 1), /* [3] */ 7808*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7809*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(3), 4), /* [5] */ 7810*99e18fadSEduard Zingerman BTF_END_RAW, 7811*99e18fadSEduard Zingerman }, 7812*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0foo_ptr"), 7813*99e18fadSEduard Zingerman }, 7814*99e18fadSEduard Zingerman }, 7815*99e18fadSEduard Zingerman { 7816*99e18fadSEduard Zingerman .descr = "dedup: standalone fwd declaration name conflict", 7817*99e18fadSEduard Zingerman /* 7818*99e18fadSEduard Zingerman * Negative test for btf_dedup_resolve_fwds: 7819*99e18fadSEduard Zingerman * - two candidates for CU2:foo dedup, thus it is unchanged; 7820*99e18fadSEduard Zingerman * - typedef/ptr should remain unchanged as well. 7821*99e18fadSEduard Zingerman * 7822*99e18fadSEduard Zingerman * // CU 1: 7823*99e18fadSEduard Zingerman * struct foo { int x; }; 7824*99e18fadSEduard Zingerman * 7825*99e18fadSEduard Zingerman * // CU 2: 7826*99e18fadSEduard Zingerman * struct foo; 7827*99e18fadSEduard Zingerman * typedef struct foo *foo_ptr; 7828*99e18fadSEduard Zingerman * 7829*99e18fadSEduard Zingerman * // CU 3: 7830*99e18fadSEduard Zingerman * struct foo { int x; int y; }; 7831*99e18fadSEduard Zingerman */ 7832*99e18fadSEduard Zingerman .input = { 7833*99e18fadSEduard Zingerman .raw_types = { 7834*99e18fadSEduard Zingerman /* CU 1 */ 7835*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7836*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7837*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7838*99e18fadSEduard Zingerman /* CU 2 */ 7839*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_NTH(1), 0), /* [3] */ 7840*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7841*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(4), 4), /* [5] */ 7842*99e18fadSEduard Zingerman /* CU 3 */ 7843*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [6] */ 7844*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7845*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(3), 2, 0), 7846*99e18fadSEduard Zingerman BTF_END_RAW, 7847*99e18fadSEduard Zingerman }, 7848*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0y\0foo_ptr"), 7849*99e18fadSEduard Zingerman }, 7850*99e18fadSEduard Zingerman .expect = { 7851*99e18fadSEduard Zingerman .raw_types = { 7852*99e18fadSEduard Zingerman /* CU 1 */ 7853*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 1, 4), /* [1] */ 7854*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7855*99e18fadSEduard Zingerman BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */ 7856*99e18fadSEduard Zingerman /* CU 2 */ 7857*99e18fadSEduard Zingerman BTF_FWD_ENC(NAME_NTH(1), 0), /* [3] */ 7858*99e18fadSEduard Zingerman BTF_PTR_ENC(3), /* [4] */ 7859*99e18fadSEduard Zingerman BTF_TYPEDEF_ENC(NAME_NTH(4), 4), /* [5] */ 7860*99e18fadSEduard Zingerman /* CU 3 */ 7861*99e18fadSEduard Zingerman BTF_STRUCT_ENC(NAME_NTH(1), 2, 8), /* [6] */ 7862*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(2), 2, 0), 7863*99e18fadSEduard Zingerman BTF_MEMBER_ENC(NAME_NTH(3), 2, 0), 7864*99e18fadSEduard Zingerman BTF_END_RAW, 7865*99e18fadSEduard Zingerman }, 7866*99e18fadSEduard Zingerman BTF_STR_SEC("\0foo\0x\0y\0foo_ptr"), 7867*99e18fadSEduard Zingerman }, 7868*99e18fadSEduard Zingerman }, 7869c64779e2SAndrii Nakryiko }; 7870c64779e2SAndrii Nakryiko 7871c64779e2SAndrii Nakryiko static int btf_type_size(const struct btf_type *t) 7872c64779e2SAndrii Nakryiko { 7873c64779e2SAndrii Nakryiko int base_size = sizeof(struct btf_type); 7874c64779e2SAndrii Nakryiko __u16 vlen = BTF_INFO_VLEN(t->info); 7875c64779e2SAndrii Nakryiko __u16 kind = BTF_INFO_KIND(t->info); 7876c64779e2SAndrii Nakryiko 7877c64779e2SAndrii Nakryiko switch (kind) { 7878c64779e2SAndrii Nakryiko case BTF_KIND_FWD: 7879c64779e2SAndrii Nakryiko case BTF_KIND_CONST: 7880c64779e2SAndrii Nakryiko case BTF_KIND_VOLATILE: 7881c64779e2SAndrii Nakryiko case BTF_KIND_RESTRICT: 7882c64779e2SAndrii Nakryiko case BTF_KIND_PTR: 7883c64779e2SAndrii Nakryiko case BTF_KIND_TYPEDEF: 7884c64779e2SAndrii Nakryiko case BTF_KIND_FUNC: 78857e72aad3SIlya Leoshkevich case BTF_KIND_FLOAT: 78866aa5dabcSYonghong Song case BTF_KIND_TYPE_TAG: 7887c64779e2SAndrii Nakryiko return base_size; 7888c64779e2SAndrii Nakryiko case BTF_KIND_INT: 7889c64779e2SAndrii Nakryiko return base_size + sizeof(__u32); 7890c64779e2SAndrii Nakryiko case BTF_KIND_ENUM: 7891c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_enum); 7892adc26d13SYonghong Song case BTF_KIND_ENUM64: 7893adc26d13SYonghong Song return base_size + vlen * sizeof(struct btf_enum64); 7894c64779e2SAndrii Nakryiko case BTF_KIND_ARRAY: 7895c64779e2SAndrii Nakryiko return base_size + sizeof(struct btf_array); 7896c64779e2SAndrii Nakryiko case BTF_KIND_STRUCT: 7897c64779e2SAndrii Nakryiko case BTF_KIND_UNION: 7898c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_member); 7899c64779e2SAndrii Nakryiko case BTF_KIND_FUNC_PROTO: 7900c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_param); 7901c64779e2SAndrii Nakryiko case BTF_KIND_VAR: 7902c64779e2SAndrii Nakryiko return base_size + sizeof(struct btf_var); 7903c64779e2SAndrii Nakryiko case BTF_KIND_DATASEC: 7904c64779e2SAndrii Nakryiko return base_size + vlen * sizeof(struct btf_var_secinfo); 7905223f903eSYonghong Song case BTF_KIND_DECL_TAG: 7906223f903eSYonghong Song return base_size + sizeof(struct btf_decl_tag); 7907c64779e2SAndrii Nakryiko default: 7908c64779e2SAndrii Nakryiko fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind); 7909c64779e2SAndrii Nakryiko return -EINVAL; 7910c64779e2SAndrii Nakryiko } 7911c64779e2SAndrii Nakryiko } 7912c64779e2SAndrii Nakryiko 7913c64779e2SAndrii Nakryiko static void dump_btf_strings(const char *strs, __u32 len) 7914c64779e2SAndrii Nakryiko { 7915c64779e2SAndrii Nakryiko const char *cur = strs; 7916c64779e2SAndrii Nakryiko int i = 0; 7917c64779e2SAndrii Nakryiko 7918c64779e2SAndrii Nakryiko while (cur < strs + len) { 7919c64779e2SAndrii Nakryiko fprintf(stderr, "string #%d: '%s'\n", i, cur); 7920c64779e2SAndrii Nakryiko cur += strlen(cur) + 1; 7921c64779e2SAndrii Nakryiko i++; 7922c64779e2SAndrii Nakryiko } 7923c64779e2SAndrii Nakryiko } 7924c64779e2SAndrii Nakryiko 7925c64779e2SAndrii Nakryiko static void do_test_dedup(unsigned int test_num) 7926c64779e2SAndrii Nakryiko { 7927957d350aSAndrii Nakryiko struct btf_dedup_test *test = &dedup_tests[test_num - 1]; 7928c64779e2SAndrii Nakryiko __u32 test_nr_types, expect_nr_types, test_btf_size, expect_btf_size; 7929c64779e2SAndrii Nakryiko const struct btf_header *test_hdr, *expect_hdr; 7930c64779e2SAndrii Nakryiko struct btf *test_btf = NULL, *expect_btf = NULL; 7931c64779e2SAndrii Nakryiko const void *test_btf_data, *expect_btf_data; 7932c64779e2SAndrii Nakryiko const char *ret_test_next_str, *ret_expect_next_str; 7933c64779e2SAndrii Nakryiko const char *test_strs, *expect_strs; 7934d9448f94SAndrii Nakryiko const char *test_str_cur; 7935c64779e2SAndrii Nakryiko const char *expect_str_cur, *expect_str_end; 7936c64779e2SAndrii Nakryiko unsigned int raw_btf_size; 7937c64779e2SAndrii Nakryiko void *raw_btf; 7938c64779e2SAndrii Nakryiko int err = 0, i; 7939c64779e2SAndrii Nakryiko 7940c64779e2SAndrii Nakryiko if (!test__start_subtest(test->descr)) 7941c64779e2SAndrii Nakryiko return; 7942c64779e2SAndrii Nakryiko 7943c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->input.raw_types, 7944c64779e2SAndrii Nakryiko test->input.str_sec, test->input.str_sec_size, 7945c64779e2SAndrii Nakryiko &raw_btf_size, &ret_test_next_str); 7946c64779e2SAndrii Nakryiko if (!raw_btf) 7947c64779e2SAndrii Nakryiko return; 7948c64779e2SAndrii Nakryiko 7949c64779e2SAndrii Nakryiko test_btf = btf__new((__u8 *)raw_btf, raw_btf_size); 7950bad2e478SAndrii Nakryiko err = libbpf_get_error(test_btf); 7951c64779e2SAndrii Nakryiko free(raw_btf); 7952bad2e478SAndrii Nakryiko if (CHECK(err, "invalid test_btf errno:%d", err)) { 7953c64779e2SAndrii Nakryiko err = -1; 7954c64779e2SAndrii Nakryiko goto done; 7955c64779e2SAndrii Nakryiko } 7956c64779e2SAndrii Nakryiko 7957c64779e2SAndrii Nakryiko raw_btf = btf_raw_create(&hdr_tmpl, test->expect.raw_types, 7958c64779e2SAndrii Nakryiko test->expect.str_sec, 7959c64779e2SAndrii Nakryiko test->expect.str_sec_size, 7960c64779e2SAndrii Nakryiko &raw_btf_size, &ret_expect_next_str); 7961c64779e2SAndrii Nakryiko if (!raw_btf) 7962c64779e2SAndrii Nakryiko return; 7963c64779e2SAndrii Nakryiko expect_btf = btf__new((__u8 *)raw_btf, raw_btf_size); 7964bad2e478SAndrii Nakryiko err = libbpf_get_error(expect_btf); 7965c64779e2SAndrii Nakryiko free(raw_btf); 7966bad2e478SAndrii Nakryiko if (CHECK(err, "invalid expect_btf errno:%d", err)) { 7967c64779e2SAndrii Nakryiko err = -1; 7968c64779e2SAndrii Nakryiko goto done; 7969c64779e2SAndrii Nakryiko } 7970c64779e2SAndrii Nakryiko 7971957d350aSAndrii Nakryiko test->opts.sz = sizeof(test->opts); 7972957d350aSAndrii Nakryiko err = btf__dedup(test_btf, &test->opts); 7973c64779e2SAndrii Nakryiko if (CHECK(err, "btf_dedup failed errno:%d", err)) { 7974c64779e2SAndrii Nakryiko err = -1; 7975c64779e2SAndrii Nakryiko goto done; 7976c64779e2SAndrii Nakryiko } 7977c64779e2SAndrii Nakryiko 7978487ef148SHengqi Chen test_btf_data = btf__raw_data(test_btf, &test_btf_size); 7979487ef148SHengqi Chen expect_btf_data = btf__raw_data(expect_btf, &expect_btf_size); 7980c64779e2SAndrii Nakryiko if (CHECK(test_btf_size != expect_btf_size, 7981c64779e2SAndrii Nakryiko "test_btf_size:%u != expect_btf_size:%u", 7982c64779e2SAndrii Nakryiko test_btf_size, expect_btf_size)) { 7983c64779e2SAndrii Nakryiko err = -1; 7984c64779e2SAndrii Nakryiko goto done; 7985c64779e2SAndrii Nakryiko } 7986c64779e2SAndrii Nakryiko 7987c64779e2SAndrii Nakryiko test_hdr = test_btf_data; 7988c64779e2SAndrii Nakryiko test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off; 7989c64779e2SAndrii Nakryiko expect_hdr = expect_btf_data; 7990c64779e2SAndrii Nakryiko expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off; 7991c64779e2SAndrii Nakryiko if (CHECK(test_hdr->str_len != expect_hdr->str_len, 7992c64779e2SAndrii Nakryiko "test_hdr->str_len:%u != expect_hdr->str_len:%u", 7993c64779e2SAndrii Nakryiko test_hdr->str_len, expect_hdr->str_len)) { 7994c64779e2SAndrii Nakryiko fprintf(stderr, "\ntest strings:\n"); 7995c64779e2SAndrii Nakryiko dump_btf_strings(test_strs, test_hdr->str_len); 7996c64779e2SAndrii Nakryiko fprintf(stderr, "\nexpected strings:\n"); 7997c64779e2SAndrii Nakryiko dump_btf_strings(expect_strs, expect_hdr->str_len); 7998c64779e2SAndrii Nakryiko err = -1; 7999c64779e2SAndrii Nakryiko goto done; 8000c64779e2SAndrii Nakryiko } 8001c64779e2SAndrii Nakryiko 8002c64779e2SAndrii Nakryiko expect_str_cur = expect_strs; 8003c64779e2SAndrii Nakryiko expect_str_end = expect_strs + expect_hdr->str_len; 8004d9448f94SAndrii Nakryiko while (expect_str_cur < expect_str_end) { 8005c64779e2SAndrii Nakryiko size_t test_len, expect_len; 8006d9448f94SAndrii Nakryiko int off; 8007d9448f94SAndrii Nakryiko 8008d9448f94SAndrii Nakryiko off = btf__find_str(test_btf, expect_str_cur); 8009d9448f94SAndrii Nakryiko if (CHECK(off < 0, "exp str '%s' not found: %d\n", expect_str_cur, off)) { 8010d9448f94SAndrii Nakryiko err = -1; 8011d9448f94SAndrii Nakryiko goto done; 8012d9448f94SAndrii Nakryiko } 8013d9448f94SAndrii Nakryiko test_str_cur = btf__str_by_offset(test_btf, off); 8014c64779e2SAndrii Nakryiko 8015c64779e2SAndrii Nakryiko test_len = strlen(test_str_cur); 8016c64779e2SAndrii Nakryiko expect_len = strlen(expect_str_cur); 8017c64779e2SAndrii Nakryiko if (CHECK(test_len != expect_len, 8018c64779e2SAndrii Nakryiko "test_len:%zu != expect_len:%zu " 8019c64779e2SAndrii Nakryiko "(test_str:%s, expect_str:%s)", 8020c64779e2SAndrii Nakryiko test_len, expect_len, test_str_cur, expect_str_cur)) { 8021c64779e2SAndrii Nakryiko err = -1; 8022c64779e2SAndrii Nakryiko goto done; 8023c64779e2SAndrii Nakryiko } 8024c64779e2SAndrii Nakryiko if (CHECK(strcmp(test_str_cur, expect_str_cur), 8025c64779e2SAndrii Nakryiko "test_str:%s != expect_str:%s", 8026c64779e2SAndrii Nakryiko test_str_cur, expect_str_cur)) { 8027c64779e2SAndrii Nakryiko err = -1; 8028c64779e2SAndrii Nakryiko goto done; 8029c64779e2SAndrii Nakryiko } 8030c64779e2SAndrii Nakryiko expect_str_cur += expect_len + 1; 8031c64779e2SAndrii Nakryiko } 8032c64779e2SAndrii Nakryiko 8033487ef148SHengqi Chen test_nr_types = btf__type_cnt(test_btf); 8034487ef148SHengqi Chen expect_nr_types = btf__type_cnt(expect_btf); 8035c64779e2SAndrii Nakryiko if (CHECK(test_nr_types != expect_nr_types, 8036c64779e2SAndrii Nakryiko "test_nr_types:%u != expect_nr_types:%u", 8037c64779e2SAndrii Nakryiko test_nr_types, expect_nr_types)) { 8038c64779e2SAndrii Nakryiko err = -1; 8039c64779e2SAndrii Nakryiko goto done; 8040c64779e2SAndrii Nakryiko } 8041c64779e2SAndrii Nakryiko 8042487ef148SHengqi Chen for (i = 1; i < test_nr_types; i++) { 8043c64779e2SAndrii Nakryiko const struct btf_type *test_type, *expect_type; 8044c64779e2SAndrii Nakryiko int test_size, expect_size; 8045c64779e2SAndrii Nakryiko 8046c64779e2SAndrii Nakryiko test_type = btf__type_by_id(test_btf, i); 8047c64779e2SAndrii Nakryiko expect_type = btf__type_by_id(expect_btf, i); 8048c64779e2SAndrii Nakryiko test_size = btf_type_size(test_type); 8049c64779e2SAndrii Nakryiko expect_size = btf_type_size(expect_type); 8050c64779e2SAndrii Nakryiko 8051c64779e2SAndrii Nakryiko if (CHECK(test_size != expect_size, 8052c64779e2SAndrii Nakryiko "type #%d: test_size:%d != expect_size:%u", 8053c64779e2SAndrii Nakryiko i, test_size, expect_size)) { 8054c64779e2SAndrii Nakryiko err = -1; 8055c64779e2SAndrii Nakryiko goto done; 8056c64779e2SAndrii Nakryiko } 8057d9448f94SAndrii Nakryiko if (CHECK(btf_kind(test_type) != btf_kind(expect_type), 8058d9448f94SAndrii Nakryiko "type %d kind: exp %d != got %u\n", 8059d9448f94SAndrii Nakryiko i, btf_kind(expect_type), btf_kind(test_type))) { 8060d9448f94SAndrii Nakryiko err = -1; 8061d9448f94SAndrii Nakryiko goto done; 8062d9448f94SAndrii Nakryiko } 8063d9448f94SAndrii Nakryiko if (CHECK(test_type->info != expect_type->info, 8064d9448f94SAndrii Nakryiko "type %d info: exp %d != got %u\n", 8065d9448f94SAndrii Nakryiko i, expect_type->info, test_type->info)) { 8066d9448f94SAndrii Nakryiko err = -1; 8067d9448f94SAndrii Nakryiko goto done; 8068d9448f94SAndrii Nakryiko } 8069d9448f94SAndrii Nakryiko if (CHECK(test_type->size != expect_type->size, 8070d9448f94SAndrii Nakryiko "type %d size/type: exp %d != got %u\n", 8071d9448f94SAndrii Nakryiko i, expect_type->size, test_type->size)) { 8072c64779e2SAndrii Nakryiko err = -1; 8073c64779e2SAndrii Nakryiko goto done; 8074c64779e2SAndrii Nakryiko } 8075c64779e2SAndrii Nakryiko } 8076c64779e2SAndrii Nakryiko 8077c64779e2SAndrii Nakryiko done: 8078c64779e2SAndrii Nakryiko btf__free(test_btf); 8079c64779e2SAndrii Nakryiko btf__free(expect_btf); 8080c64779e2SAndrii Nakryiko } 8081c64779e2SAndrii Nakryiko 8082c64779e2SAndrii Nakryiko void test_btf(void) 8083c64779e2SAndrii Nakryiko { 8084c64779e2SAndrii Nakryiko int i; 8085c64779e2SAndrii Nakryiko 8086c64779e2SAndrii Nakryiko always_log = env.verbosity > VERBOSE_NONE; 8087c64779e2SAndrii Nakryiko 8088c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(raw_tests); i++) 8089c64779e2SAndrii Nakryiko do_test_raw(i); 8090c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(get_info_tests); i++) 8091c64779e2SAndrii Nakryiko do_test_get_info(i); 8092c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(file_tests); i++) 8093c64779e2SAndrii Nakryiko do_test_file(i); 8094c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(info_raw_tests); i++) 8095c64779e2SAndrii Nakryiko do_test_info_raw(i); 8096c64779e2SAndrii Nakryiko for (i = 1; i <= ARRAY_SIZE(dedup_tests); i++) 8097c64779e2SAndrii Nakryiko do_test_dedup(i); 8098c64779e2SAndrii Nakryiko test_pprint(); 8099c64779e2SAndrii Nakryiko } 8100