0001
0002
0003
0004 #include <byteswap.h>
0005 #include <endian.h>
0006 #include <stdio.h>
0007 #include <stdlib.h>
0008 #include <string.h>
0009 #include <fcntl.h>
0010 #include <unistd.h>
0011 #include <errno.h>
0012 #include <sys/utsname.h>
0013 #include <sys/param.h>
0014 #include <sys/stat.h>
0015 #include <linux/kernel.h>
0016 #include <linux/err.h>
0017 #include <linux/btf.h>
0018 #include <gelf.h>
0019 #include "btf.h"
0020 #include "bpf.h"
0021 #include "libbpf.h"
0022 #include "libbpf_internal.h"
0023 #include "hashmap.h"
0024 #include "strset.h"
0025
0026 #define BTF_MAX_NR_TYPES 0x7fffffffU
0027 #define BTF_MAX_STR_OFFSET 0x7fffffffU
0028
0029 static struct btf_type btf_void;
0030
0031 struct btf {
0032
0033 void *raw_data;
0034
0035 void *raw_data_swapped;
0036 __u32 raw_size;
0037
0038 bool swapped_endian;
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 struct btf_header *hdr;
0078
0079 void *types_data;
0080 size_t types_data_cap;
0081
0082
0083
0084
0085
0086
0087 __u32 *type_offs;
0088 size_t type_offs_cap;
0089
0090
0091
0092
0093 __u32 nr_types;
0094
0095
0096
0097 struct btf *base_btf;
0098
0099
0100
0101
0102 int start_id;
0103
0104
0105
0106
0107 int start_str_off;
0108
0109
0110
0111
0112
0113 void *strs_data;
0114
0115 struct strset *strs_set;
0116
0117 bool strs_deduped;
0118
0119
0120 int fd;
0121
0122
0123 int ptr_sz;
0124 };
0125
0126 static inline __u64 ptr_to_u64(const void *ptr)
0127 {
0128 return (__u64) (unsigned long) ptr;
0129 }
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz,
0142 size_t cur_cnt, size_t max_cnt, size_t add_cnt)
0143 {
0144 size_t new_cnt;
0145 void *new_data;
0146
0147 if (cur_cnt + add_cnt <= *cap_cnt)
0148 return *data + cur_cnt * elem_sz;
0149
0150
0151 if (cur_cnt + add_cnt > max_cnt)
0152 return NULL;
0153
0154 new_cnt = *cap_cnt;
0155 new_cnt += new_cnt / 4;
0156 if (new_cnt < 16)
0157 new_cnt = 16;
0158 if (new_cnt > max_cnt)
0159 new_cnt = max_cnt;
0160 if (new_cnt < cur_cnt + add_cnt)
0161 new_cnt = cur_cnt + add_cnt;
0162
0163 new_data = libbpf_reallocarray(*data, new_cnt, elem_sz);
0164 if (!new_data)
0165 return NULL;
0166
0167
0168 memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz);
0169
0170 *data = new_data;
0171 *cap_cnt = new_cnt;
0172 return new_data + cur_cnt * elem_sz;
0173 }
0174
0175
0176
0177
0178 int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt)
0179 {
0180 void *p;
0181
0182 if (need_cnt <= *cap_cnt)
0183 return 0;
0184
0185 p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt);
0186 if (!p)
0187 return -ENOMEM;
0188
0189 return 0;
0190 }
0191
0192 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt)
0193 {
0194 return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32),
0195 btf->nr_types, BTF_MAX_NR_TYPES, add_cnt);
0196 }
0197
0198 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off)
0199 {
0200 __u32 *p;
0201
0202 p = btf_add_type_offs_mem(btf, 1);
0203 if (!p)
0204 return -ENOMEM;
0205
0206 *p = type_off;
0207 return 0;
0208 }
0209
0210 static void btf_bswap_hdr(struct btf_header *h)
0211 {
0212 h->magic = bswap_16(h->magic);
0213 h->hdr_len = bswap_32(h->hdr_len);
0214 h->type_off = bswap_32(h->type_off);
0215 h->type_len = bswap_32(h->type_len);
0216 h->str_off = bswap_32(h->str_off);
0217 h->str_len = bswap_32(h->str_len);
0218 }
0219
0220 static int btf_parse_hdr(struct btf *btf)
0221 {
0222 struct btf_header *hdr = btf->hdr;
0223 __u32 meta_left;
0224
0225 if (btf->raw_size < sizeof(struct btf_header)) {
0226 pr_debug("BTF header not found\n");
0227 return -EINVAL;
0228 }
0229
0230 if (hdr->magic == bswap_16(BTF_MAGIC)) {
0231 btf->swapped_endian = true;
0232 if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) {
0233 pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n",
0234 bswap_32(hdr->hdr_len));
0235 return -ENOTSUP;
0236 }
0237 btf_bswap_hdr(hdr);
0238 } else if (hdr->magic != BTF_MAGIC) {
0239 pr_debug("Invalid BTF magic: %x\n", hdr->magic);
0240 return -EINVAL;
0241 }
0242
0243 if (btf->raw_size < hdr->hdr_len) {
0244 pr_debug("BTF header len %u larger than data size %u\n",
0245 hdr->hdr_len, btf->raw_size);
0246 return -EINVAL;
0247 }
0248
0249 meta_left = btf->raw_size - hdr->hdr_len;
0250 if (meta_left < (long long)hdr->str_off + hdr->str_len) {
0251 pr_debug("Invalid BTF total size: %u\n", btf->raw_size);
0252 return -EINVAL;
0253 }
0254
0255 if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
0256 pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n",
0257 hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
0258 return -EINVAL;
0259 }
0260
0261 if (hdr->type_off % 4) {
0262 pr_debug("BTF type section is not aligned to 4 bytes\n");
0263 return -EINVAL;
0264 }
0265
0266 return 0;
0267 }
0268
0269 static int btf_parse_str_sec(struct btf *btf)
0270 {
0271 const struct btf_header *hdr = btf->hdr;
0272 const char *start = btf->strs_data;
0273 const char *end = start + btf->hdr->str_len;
0274
0275 if (btf->base_btf && hdr->str_len == 0)
0276 return 0;
0277 if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) {
0278 pr_debug("Invalid BTF string section\n");
0279 return -EINVAL;
0280 }
0281 if (!btf->base_btf && start[0]) {
0282 pr_debug("Invalid BTF string section\n");
0283 return -EINVAL;
0284 }
0285 return 0;
0286 }
0287
0288 static int btf_type_size(const struct btf_type *t)
0289 {
0290 const int base_size = sizeof(struct btf_type);
0291 __u16 vlen = btf_vlen(t);
0292
0293 switch (btf_kind(t)) {
0294 case BTF_KIND_FWD:
0295 case BTF_KIND_CONST:
0296 case BTF_KIND_VOLATILE:
0297 case BTF_KIND_RESTRICT:
0298 case BTF_KIND_PTR:
0299 case BTF_KIND_TYPEDEF:
0300 case BTF_KIND_FUNC:
0301 case BTF_KIND_FLOAT:
0302 case BTF_KIND_TYPE_TAG:
0303 return base_size;
0304 case BTF_KIND_INT:
0305 return base_size + sizeof(__u32);
0306 case BTF_KIND_ENUM:
0307 return base_size + vlen * sizeof(struct btf_enum);
0308 case BTF_KIND_ENUM64:
0309 return base_size + vlen * sizeof(struct btf_enum64);
0310 case BTF_KIND_ARRAY:
0311 return base_size + sizeof(struct btf_array);
0312 case BTF_KIND_STRUCT:
0313 case BTF_KIND_UNION:
0314 return base_size + vlen * sizeof(struct btf_member);
0315 case BTF_KIND_FUNC_PROTO:
0316 return base_size + vlen * sizeof(struct btf_param);
0317 case BTF_KIND_VAR:
0318 return base_size + sizeof(struct btf_var);
0319 case BTF_KIND_DATASEC:
0320 return base_size + vlen * sizeof(struct btf_var_secinfo);
0321 case BTF_KIND_DECL_TAG:
0322 return base_size + sizeof(struct btf_decl_tag);
0323 default:
0324 pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
0325 return -EINVAL;
0326 }
0327 }
0328
0329 static void btf_bswap_type_base(struct btf_type *t)
0330 {
0331 t->name_off = bswap_32(t->name_off);
0332 t->info = bswap_32(t->info);
0333 t->type = bswap_32(t->type);
0334 }
0335
0336 static int btf_bswap_type_rest(struct btf_type *t)
0337 {
0338 struct btf_var_secinfo *v;
0339 struct btf_enum64 *e64;
0340 struct btf_member *m;
0341 struct btf_array *a;
0342 struct btf_param *p;
0343 struct btf_enum *e;
0344 __u16 vlen = btf_vlen(t);
0345 int i;
0346
0347 switch (btf_kind(t)) {
0348 case BTF_KIND_FWD:
0349 case BTF_KIND_CONST:
0350 case BTF_KIND_VOLATILE:
0351 case BTF_KIND_RESTRICT:
0352 case BTF_KIND_PTR:
0353 case BTF_KIND_TYPEDEF:
0354 case BTF_KIND_FUNC:
0355 case BTF_KIND_FLOAT:
0356 case BTF_KIND_TYPE_TAG:
0357 return 0;
0358 case BTF_KIND_INT:
0359 *(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1));
0360 return 0;
0361 case BTF_KIND_ENUM:
0362 for (i = 0, e = btf_enum(t); i < vlen; i++, e++) {
0363 e->name_off = bswap_32(e->name_off);
0364 e->val = bswap_32(e->val);
0365 }
0366 return 0;
0367 case BTF_KIND_ENUM64:
0368 for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) {
0369 e64->name_off = bswap_32(e64->name_off);
0370 e64->val_lo32 = bswap_32(e64->val_lo32);
0371 e64->val_hi32 = bswap_32(e64->val_hi32);
0372 }
0373 return 0;
0374 case BTF_KIND_ARRAY:
0375 a = btf_array(t);
0376 a->type = bswap_32(a->type);
0377 a->index_type = bswap_32(a->index_type);
0378 a->nelems = bswap_32(a->nelems);
0379 return 0;
0380 case BTF_KIND_STRUCT:
0381 case BTF_KIND_UNION:
0382 for (i = 0, m = btf_members(t); i < vlen; i++, m++) {
0383 m->name_off = bswap_32(m->name_off);
0384 m->type = bswap_32(m->type);
0385 m->offset = bswap_32(m->offset);
0386 }
0387 return 0;
0388 case BTF_KIND_FUNC_PROTO:
0389 for (i = 0, p = btf_params(t); i < vlen; i++, p++) {
0390 p->name_off = bswap_32(p->name_off);
0391 p->type = bswap_32(p->type);
0392 }
0393 return 0;
0394 case BTF_KIND_VAR:
0395 btf_var(t)->linkage = bswap_32(btf_var(t)->linkage);
0396 return 0;
0397 case BTF_KIND_DATASEC:
0398 for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) {
0399 v->type = bswap_32(v->type);
0400 v->offset = bswap_32(v->offset);
0401 v->size = bswap_32(v->size);
0402 }
0403 return 0;
0404 case BTF_KIND_DECL_TAG:
0405 btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx);
0406 return 0;
0407 default:
0408 pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
0409 return -EINVAL;
0410 }
0411 }
0412
0413 static int btf_parse_type_sec(struct btf *btf)
0414 {
0415 struct btf_header *hdr = btf->hdr;
0416 void *next_type = btf->types_data;
0417 void *end_type = next_type + hdr->type_len;
0418 int err, type_size;
0419
0420 while (next_type + sizeof(struct btf_type) <= end_type) {
0421 if (btf->swapped_endian)
0422 btf_bswap_type_base(next_type);
0423
0424 type_size = btf_type_size(next_type);
0425 if (type_size < 0)
0426 return type_size;
0427 if (next_type + type_size > end_type) {
0428 pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types);
0429 return -EINVAL;
0430 }
0431
0432 if (btf->swapped_endian && btf_bswap_type_rest(next_type))
0433 return -EINVAL;
0434
0435 err = btf_add_type_idx_entry(btf, next_type - btf->types_data);
0436 if (err)
0437 return err;
0438
0439 next_type += type_size;
0440 btf->nr_types++;
0441 }
0442
0443 if (next_type != end_type) {
0444 pr_warn("BTF types data is malformed\n");
0445 return -EINVAL;
0446 }
0447
0448 return 0;
0449 }
0450
0451 __u32 btf__type_cnt(const struct btf *btf)
0452 {
0453 return btf->start_id + btf->nr_types;
0454 }
0455
0456 const struct btf *btf__base_btf(const struct btf *btf)
0457 {
0458 return btf->base_btf;
0459 }
0460
0461
0462 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
0463 {
0464 if (type_id == 0)
0465 return &btf_void;
0466 if (type_id < btf->start_id)
0467 return btf_type_by_id(btf->base_btf, type_id);
0468 return btf->types_data + btf->type_offs[type_id - btf->start_id];
0469 }
0470
0471 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id)
0472 {
0473 if (type_id >= btf->start_id + btf->nr_types)
0474 return errno = EINVAL, NULL;
0475 return btf_type_by_id((struct btf *)btf, type_id);
0476 }
0477
0478 static int determine_ptr_size(const struct btf *btf)
0479 {
0480 static const char * const long_aliases[] = {
0481 "long",
0482 "long int",
0483 "int long",
0484 "unsigned long",
0485 "long unsigned",
0486 "unsigned long int",
0487 "unsigned int long",
0488 "long unsigned int",
0489 "long int unsigned",
0490 "int unsigned long",
0491 "int long unsigned",
0492 };
0493 const struct btf_type *t;
0494 const char *name;
0495 int i, j, n;
0496
0497 if (btf->base_btf && btf->base_btf->ptr_sz > 0)
0498 return btf->base_btf->ptr_sz;
0499
0500 n = btf__type_cnt(btf);
0501 for (i = 1; i < n; i++) {
0502 t = btf__type_by_id(btf, i);
0503 if (!btf_is_int(t))
0504 continue;
0505
0506 if (t->size != 4 && t->size != 8)
0507 continue;
0508
0509 name = btf__name_by_offset(btf, t->name_off);
0510 if (!name)
0511 continue;
0512
0513 for (j = 0; j < ARRAY_SIZE(long_aliases); j++) {
0514 if (strcmp(name, long_aliases[j]) == 0)
0515 return t->size;
0516 }
0517 }
0518
0519 return -1;
0520 }
0521
0522 static size_t btf_ptr_sz(const struct btf *btf)
0523 {
0524 if (!btf->ptr_sz)
0525 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
0526 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
0527 }
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537 size_t btf__pointer_size(const struct btf *btf)
0538 {
0539 if (!btf->ptr_sz)
0540 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
0541
0542 if (btf->ptr_sz < 0)
0543
0544 return 0;
0545
0546 return btf->ptr_sz;
0547 }
0548
0549
0550
0551
0552 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz)
0553 {
0554 if (ptr_sz != 4 && ptr_sz != 8)
0555 return libbpf_err(-EINVAL);
0556 btf->ptr_sz = ptr_sz;
0557 return 0;
0558 }
0559
0560 static bool is_host_big_endian(void)
0561 {
0562 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
0563 return false;
0564 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
0565 return true;
0566 #else
0567 # error "Unrecognized __BYTE_ORDER__"
0568 #endif
0569 }
0570
0571 enum btf_endianness btf__endianness(const struct btf *btf)
0572 {
0573 if (is_host_big_endian())
0574 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
0575 else
0576 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
0577 }
0578
0579 int btf__set_endianness(struct btf *btf, enum btf_endianness endian)
0580 {
0581 if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN)
0582 return libbpf_err(-EINVAL);
0583
0584 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
0585 if (!btf->swapped_endian) {
0586 free(btf->raw_data_swapped);
0587 btf->raw_data_swapped = NULL;
0588 }
0589 return 0;
0590 }
0591
0592 static bool btf_type_is_void(const struct btf_type *t)
0593 {
0594 return t == &btf_void || btf_is_fwd(t);
0595 }
0596
0597 static bool btf_type_is_void_or_null(const struct btf_type *t)
0598 {
0599 return !t || btf_type_is_void(t);
0600 }
0601
0602 #define MAX_RESOLVE_DEPTH 32
0603
0604 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
0605 {
0606 const struct btf_array *array;
0607 const struct btf_type *t;
0608 __u32 nelems = 1;
0609 __s64 size = -1;
0610 int i;
0611
0612 t = btf__type_by_id(btf, type_id);
0613 for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) {
0614 switch (btf_kind(t)) {
0615 case BTF_KIND_INT:
0616 case BTF_KIND_STRUCT:
0617 case BTF_KIND_UNION:
0618 case BTF_KIND_ENUM:
0619 case BTF_KIND_ENUM64:
0620 case BTF_KIND_DATASEC:
0621 case BTF_KIND_FLOAT:
0622 size = t->size;
0623 goto done;
0624 case BTF_KIND_PTR:
0625 size = btf_ptr_sz(btf);
0626 goto done;
0627 case BTF_KIND_TYPEDEF:
0628 case BTF_KIND_VOLATILE:
0629 case BTF_KIND_CONST:
0630 case BTF_KIND_RESTRICT:
0631 case BTF_KIND_VAR:
0632 case BTF_KIND_DECL_TAG:
0633 case BTF_KIND_TYPE_TAG:
0634 type_id = t->type;
0635 break;
0636 case BTF_KIND_ARRAY:
0637 array = btf_array(t);
0638 if (nelems && array->nelems > UINT32_MAX / nelems)
0639 return libbpf_err(-E2BIG);
0640 nelems *= array->nelems;
0641 type_id = array->type;
0642 break;
0643 default:
0644 return libbpf_err(-EINVAL);
0645 }
0646
0647 t = btf__type_by_id(btf, type_id);
0648 }
0649
0650 done:
0651 if (size < 0)
0652 return libbpf_err(-EINVAL);
0653 if (nelems && size > UINT32_MAX / nelems)
0654 return libbpf_err(-E2BIG);
0655
0656 return nelems * size;
0657 }
0658
0659 int btf__align_of(const struct btf *btf, __u32 id)
0660 {
0661 const struct btf_type *t = btf__type_by_id(btf, id);
0662 __u16 kind = btf_kind(t);
0663
0664 switch (kind) {
0665 case BTF_KIND_INT:
0666 case BTF_KIND_ENUM:
0667 case BTF_KIND_ENUM64:
0668 case BTF_KIND_FLOAT:
0669 return min(btf_ptr_sz(btf), (size_t)t->size);
0670 case BTF_KIND_PTR:
0671 return btf_ptr_sz(btf);
0672 case BTF_KIND_TYPEDEF:
0673 case BTF_KIND_VOLATILE:
0674 case BTF_KIND_CONST:
0675 case BTF_KIND_RESTRICT:
0676 case BTF_KIND_TYPE_TAG:
0677 return btf__align_of(btf, t->type);
0678 case BTF_KIND_ARRAY:
0679 return btf__align_of(btf, btf_array(t)->type);
0680 case BTF_KIND_STRUCT:
0681 case BTF_KIND_UNION: {
0682 const struct btf_member *m = btf_members(t);
0683 __u16 vlen = btf_vlen(t);
0684 int i, max_align = 1, align;
0685
0686 for (i = 0; i < vlen; i++, m++) {
0687 align = btf__align_of(btf, m->type);
0688 if (align <= 0)
0689 return libbpf_err(align);
0690 max_align = max(max_align, align);
0691 }
0692
0693 return max_align;
0694 }
0695 default:
0696 pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t));
0697 return errno = EINVAL, 0;
0698 }
0699 }
0700
0701 int btf__resolve_type(const struct btf *btf, __u32 type_id)
0702 {
0703 const struct btf_type *t;
0704 int depth = 0;
0705
0706 t = btf__type_by_id(btf, type_id);
0707 while (depth < MAX_RESOLVE_DEPTH &&
0708 !btf_type_is_void_or_null(t) &&
0709 (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) {
0710 type_id = t->type;
0711 t = btf__type_by_id(btf, type_id);
0712 depth++;
0713 }
0714
0715 if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t))
0716 return libbpf_err(-EINVAL);
0717
0718 return type_id;
0719 }
0720
0721 __s32 btf__find_by_name(const struct btf *btf, const char *type_name)
0722 {
0723 __u32 i, nr_types = btf__type_cnt(btf);
0724
0725 if (!strcmp(type_name, "void"))
0726 return 0;
0727
0728 for (i = 1; i < nr_types; i++) {
0729 const struct btf_type *t = btf__type_by_id(btf, i);
0730 const char *name = btf__name_by_offset(btf, t->name_off);
0731
0732 if (name && !strcmp(type_name, name))
0733 return i;
0734 }
0735
0736 return libbpf_err(-ENOENT);
0737 }
0738
0739 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id,
0740 const char *type_name, __u32 kind)
0741 {
0742 __u32 i, nr_types = btf__type_cnt(btf);
0743
0744 if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
0745 return 0;
0746
0747 for (i = start_id; i < nr_types; i++) {
0748 const struct btf_type *t = btf__type_by_id(btf, i);
0749 const char *name;
0750
0751 if (btf_kind(t) != kind)
0752 continue;
0753 name = btf__name_by_offset(btf, t->name_off);
0754 if (name && !strcmp(type_name, name))
0755 return i;
0756 }
0757
0758 return libbpf_err(-ENOENT);
0759 }
0760
0761 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
0762 __u32 kind)
0763 {
0764 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind);
0765 }
0766
0767 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
0768 __u32 kind)
0769 {
0770 return btf_find_by_name_kind(btf, 1, type_name, kind);
0771 }
0772
0773 static bool btf_is_modifiable(const struct btf *btf)
0774 {
0775 return (void *)btf->hdr != btf->raw_data;
0776 }
0777
0778 void btf__free(struct btf *btf)
0779 {
0780 if (IS_ERR_OR_NULL(btf))
0781 return;
0782
0783 if (btf->fd >= 0)
0784 close(btf->fd);
0785
0786 if (btf_is_modifiable(btf)) {
0787
0788
0789
0790
0791
0792
0793 free(btf->hdr);
0794 free(btf->types_data);
0795 strset__free(btf->strs_set);
0796 }
0797 free(btf->raw_data);
0798 free(btf->raw_data_swapped);
0799 free(btf->type_offs);
0800 free(btf);
0801 }
0802
0803 static struct btf *btf_new_empty(struct btf *base_btf)
0804 {
0805 struct btf *btf;
0806
0807 btf = calloc(1, sizeof(*btf));
0808 if (!btf)
0809 return ERR_PTR(-ENOMEM);
0810
0811 btf->nr_types = 0;
0812 btf->start_id = 1;
0813 btf->start_str_off = 0;
0814 btf->fd = -1;
0815 btf->ptr_sz = sizeof(void *);
0816 btf->swapped_endian = false;
0817
0818 if (base_btf) {
0819 btf->base_btf = base_btf;
0820 btf->start_id = btf__type_cnt(base_btf);
0821 btf->start_str_off = base_btf->hdr->str_len;
0822 }
0823
0824
0825 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1);
0826 btf->raw_data = calloc(1, btf->raw_size);
0827 if (!btf->raw_data) {
0828 free(btf);
0829 return ERR_PTR(-ENOMEM);
0830 }
0831
0832 btf->hdr = btf->raw_data;
0833 btf->hdr->hdr_len = sizeof(struct btf_header);
0834 btf->hdr->magic = BTF_MAGIC;
0835 btf->hdr->version = BTF_VERSION;
0836
0837 btf->types_data = btf->raw_data + btf->hdr->hdr_len;
0838 btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
0839 btf->hdr->str_len = base_btf ? 0 : 1;
0840
0841 return btf;
0842 }
0843
0844 struct btf *btf__new_empty(void)
0845 {
0846 return libbpf_ptr(btf_new_empty(NULL));
0847 }
0848
0849 struct btf *btf__new_empty_split(struct btf *base_btf)
0850 {
0851 return libbpf_ptr(btf_new_empty(base_btf));
0852 }
0853
0854 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf)
0855 {
0856 struct btf *btf;
0857 int err;
0858
0859 btf = calloc(1, sizeof(struct btf));
0860 if (!btf)
0861 return ERR_PTR(-ENOMEM);
0862
0863 btf->nr_types = 0;
0864 btf->start_id = 1;
0865 btf->start_str_off = 0;
0866 btf->fd = -1;
0867
0868 if (base_btf) {
0869 btf->base_btf = base_btf;
0870 btf->start_id = btf__type_cnt(base_btf);
0871 btf->start_str_off = base_btf->hdr->str_len;
0872 }
0873
0874 btf->raw_data = malloc(size);
0875 if (!btf->raw_data) {
0876 err = -ENOMEM;
0877 goto done;
0878 }
0879 memcpy(btf->raw_data, data, size);
0880 btf->raw_size = size;
0881
0882 btf->hdr = btf->raw_data;
0883 err = btf_parse_hdr(btf);
0884 if (err)
0885 goto done;
0886
0887 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
0888 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off;
0889
0890 err = btf_parse_str_sec(btf);
0891 err = err ?: btf_parse_type_sec(btf);
0892 if (err)
0893 goto done;
0894
0895 done:
0896 if (err) {
0897 btf__free(btf);
0898 return ERR_PTR(err);
0899 }
0900
0901 return btf;
0902 }
0903
0904 struct btf *btf__new(const void *data, __u32 size)
0905 {
0906 return libbpf_ptr(btf_new(data, size, NULL));
0907 }
0908
0909 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf,
0910 struct btf_ext **btf_ext)
0911 {
0912 Elf_Data *btf_data = NULL, *btf_ext_data = NULL;
0913 int err = 0, fd = -1, idx = 0;
0914 struct btf *btf = NULL;
0915 Elf_Scn *scn = NULL;
0916 Elf *elf = NULL;
0917 GElf_Ehdr ehdr;
0918 size_t shstrndx;
0919
0920 if (elf_version(EV_CURRENT) == EV_NONE) {
0921 pr_warn("failed to init libelf for %s\n", path);
0922 return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
0923 }
0924
0925 fd = open(path, O_RDONLY | O_CLOEXEC);
0926 if (fd < 0) {
0927 err = -errno;
0928 pr_warn("failed to open %s: %s\n", path, strerror(errno));
0929 return ERR_PTR(err);
0930 }
0931
0932 err = -LIBBPF_ERRNO__FORMAT;
0933
0934 elf = elf_begin(fd, ELF_C_READ, NULL);
0935 if (!elf) {
0936 pr_warn("failed to open %s as ELF file\n", path);
0937 goto done;
0938 }
0939 if (!gelf_getehdr(elf, &ehdr)) {
0940 pr_warn("failed to get EHDR from %s\n", path);
0941 goto done;
0942 }
0943
0944 if (elf_getshdrstrndx(elf, &shstrndx)) {
0945 pr_warn("failed to get section names section index for %s\n",
0946 path);
0947 goto done;
0948 }
0949
0950 if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) {
0951 pr_warn("failed to get e_shstrndx from %s\n", path);
0952 goto done;
0953 }
0954
0955 while ((scn = elf_nextscn(elf, scn)) != NULL) {
0956 GElf_Shdr sh;
0957 char *name;
0958
0959 idx++;
0960 if (gelf_getshdr(scn, &sh) != &sh) {
0961 pr_warn("failed to get section(%d) header from %s\n",
0962 idx, path);
0963 goto done;
0964 }
0965 name = elf_strptr(elf, shstrndx, sh.sh_name);
0966 if (!name) {
0967 pr_warn("failed to get section(%d) name from %s\n",
0968 idx, path);
0969 goto done;
0970 }
0971 if (strcmp(name, BTF_ELF_SEC) == 0) {
0972 btf_data = elf_getdata(scn, 0);
0973 if (!btf_data) {
0974 pr_warn("failed to get section(%d, %s) data from %s\n",
0975 idx, name, path);
0976 goto done;
0977 }
0978 continue;
0979 } else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) {
0980 btf_ext_data = elf_getdata(scn, 0);
0981 if (!btf_ext_data) {
0982 pr_warn("failed to get section(%d, %s) data from %s\n",
0983 idx, name, path);
0984 goto done;
0985 }
0986 continue;
0987 }
0988 }
0989
0990 err = 0;
0991
0992 if (!btf_data) {
0993 err = -ENOENT;
0994 goto done;
0995 }
0996 btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf);
0997 err = libbpf_get_error(btf);
0998 if (err)
0999 goto done;
1000
1001 switch (gelf_getclass(elf)) {
1002 case ELFCLASS32:
1003 btf__set_pointer_size(btf, 4);
1004 break;
1005 case ELFCLASS64:
1006 btf__set_pointer_size(btf, 8);
1007 break;
1008 default:
1009 pr_warn("failed to get ELF class (bitness) for %s\n", path);
1010 break;
1011 }
1012
1013 if (btf_ext && btf_ext_data) {
1014 *btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size);
1015 err = libbpf_get_error(*btf_ext);
1016 if (err)
1017 goto done;
1018 } else if (btf_ext) {
1019 *btf_ext = NULL;
1020 }
1021 done:
1022 if (elf)
1023 elf_end(elf);
1024 close(fd);
1025
1026 if (!err)
1027 return btf;
1028
1029 if (btf_ext)
1030 btf_ext__free(*btf_ext);
1031 btf__free(btf);
1032
1033 return ERR_PTR(err);
1034 }
1035
1036 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1037 {
1038 return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1039 }
1040
1041 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf)
1042 {
1043 return libbpf_ptr(btf_parse_elf(path, base_btf, NULL));
1044 }
1045
1046 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
1047 {
1048 struct btf *btf = NULL;
1049 void *data = NULL;
1050 FILE *f = NULL;
1051 __u16 magic;
1052 int err = 0;
1053 long sz;
1054
1055 f = fopen(path, "rb");
1056 if (!f) {
1057 err = -errno;
1058 goto err_out;
1059 }
1060
1061
1062 if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) {
1063 err = -EIO;
1064 goto err_out;
1065 }
1066 if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) {
1067
1068 err = -EPROTO;
1069 goto err_out;
1070 }
1071
1072
1073 if (fseek(f, 0, SEEK_END)) {
1074 err = -errno;
1075 goto err_out;
1076 }
1077 sz = ftell(f);
1078 if (sz < 0) {
1079 err = -errno;
1080 goto err_out;
1081 }
1082
1083 if (fseek(f, 0, SEEK_SET)) {
1084 err = -errno;
1085 goto err_out;
1086 }
1087
1088
1089 data = malloc(sz);
1090 if (!data) {
1091 err = -ENOMEM;
1092 goto err_out;
1093 }
1094 if (fread(data, 1, sz, f) < sz) {
1095 err = -EIO;
1096 goto err_out;
1097 }
1098
1099
1100 btf = btf_new(data, sz, base_btf);
1101
1102 err_out:
1103 free(data);
1104 if (f)
1105 fclose(f);
1106 return err ? ERR_PTR(err) : btf;
1107 }
1108
1109 struct btf *btf__parse_raw(const char *path)
1110 {
1111 return libbpf_ptr(btf_parse_raw(path, NULL));
1112 }
1113
1114 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf)
1115 {
1116 return libbpf_ptr(btf_parse_raw(path, base_btf));
1117 }
1118
1119 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1120 {
1121 struct btf *btf;
1122 int err;
1123
1124 if (btf_ext)
1125 *btf_ext = NULL;
1126
1127 btf = btf_parse_raw(path, base_btf);
1128 err = libbpf_get_error(btf);
1129 if (!err)
1130 return btf;
1131 if (err != -EPROTO)
1132 return ERR_PTR(err);
1133 return btf_parse_elf(path, base_btf, btf_ext);
1134 }
1135
1136 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1137 {
1138 return libbpf_ptr(btf_parse(path, NULL, btf_ext));
1139 }
1140
1141 struct btf *btf__parse_split(const char *path, struct btf *base_btf)
1142 {
1143 return libbpf_ptr(btf_parse(path, base_btf, NULL));
1144 }
1145
1146 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1147
1148 int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level)
1149 {
1150 LIBBPF_OPTS(bpf_btf_load_opts, opts);
1151 __u32 buf_sz = 0, raw_size;
1152 char *buf = NULL, *tmp;
1153 void *raw_data;
1154 int err = 0;
1155
1156 if (btf->fd >= 0)
1157 return libbpf_err(-EEXIST);
1158 if (log_sz && !log_buf)
1159 return libbpf_err(-EINVAL);
1160
1161
1162 raw_data = btf_get_raw_data(btf, &raw_size, false);
1163 if (!raw_data) {
1164 err = -ENOMEM;
1165 goto done;
1166 }
1167 btf->raw_size = raw_size;
1168 btf->raw_data = raw_data;
1169
1170 retry_load:
1171
1172
1173
1174
1175
1176
1177 if (log_level) {
1178
1179
1180
1181
1182 if (!log_buf) {
1183 buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2);
1184 tmp = realloc(buf, buf_sz);
1185 if (!tmp) {
1186 err = -ENOMEM;
1187 goto done;
1188 }
1189 buf = tmp;
1190 buf[0] = '\0';
1191 }
1192
1193 opts.log_buf = log_buf ? log_buf : buf;
1194 opts.log_size = log_buf ? log_sz : buf_sz;
1195 opts.log_level = log_level;
1196 }
1197
1198 btf->fd = bpf_btf_load(raw_data, raw_size, &opts);
1199 if (btf->fd < 0) {
1200
1201 if (log_level == 0) {
1202 log_level = 1;
1203 goto retry_load;
1204 }
1205
1206
1207
1208 if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2)
1209 goto retry_load;
1210
1211 err = -errno;
1212 pr_warn("BTF loading error: %d\n", err);
1213
1214 if (!log_buf && buf[0])
1215 pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf);
1216 }
1217
1218 done:
1219 free(buf);
1220 return libbpf_err(err);
1221 }
1222
1223 int btf__load_into_kernel(struct btf *btf)
1224 {
1225 return btf_load_into_kernel(btf, NULL, 0, 0);
1226 }
1227
1228 int btf__load(struct btf *) __attribute__((alias("btf__load_into_kernel")));
1229
1230 int btf__fd(const struct btf *btf)
1231 {
1232 return btf->fd;
1233 }
1234
1235 void btf__set_fd(struct btf *btf, int fd)
1236 {
1237 btf->fd = fd;
1238 }
1239
1240 static const void *btf_strs_data(const struct btf *btf)
1241 {
1242 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set);
1243 }
1244
1245 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian)
1246 {
1247 struct btf_header *hdr = btf->hdr;
1248 struct btf_type *t;
1249 void *data, *p;
1250 __u32 data_sz;
1251 int i;
1252
1253 data = swap_endian ? btf->raw_data_swapped : btf->raw_data;
1254 if (data) {
1255 *size = btf->raw_size;
1256 return data;
1257 }
1258
1259 data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len;
1260 data = calloc(1, data_sz);
1261 if (!data)
1262 return NULL;
1263 p = data;
1264
1265 memcpy(p, hdr, hdr->hdr_len);
1266 if (swap_endian)
1267 btf_bswap_hdr(p);
1268 p += hdr->hdr_len;
1269
1270 memcpy(p, btf->types_data, hdr->type_len);
1271 if (swap_endian) {
1272 for (i = 0; i < btf->nr_types; i++) {
1273 t = p + btf->type_offs[i];
1274
1275
1276
1277
1278 if (btf_bswap_type_rest(t))
1279 goto err_out;
1280 btf_bswap_type_base(t);
1281 }
1282 }
1283 p += hdr->type_len;
1284
1285 memcpy(p, btf_strs_data(btf), hdr->str_len);
1286 p += hdr->str_len;
1287
1288 *size = data_sz;
1289 return data;
1290 err_out:
1291 free(data);
1292 return NULL;
1293 }
1294
1295 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size)
1296 {
1297 struct btf *btf = (struct btf *)btf_ro;
1298 __u32 data_sz;
1299 void *data;
1300
1301 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian);
1302 if (!data)
1303 return errno = ENOMEM, NULL;
1304
1305 btf->raw_size = data_sz;
1306 if (btf->swapped_endian)
1307 btf->raw_data_swapped = data;
1308 else
1309 btf->raw_data = data;
1310 *size = data_sz;
1311 return data;
1312 }
1313
1314 __attribute__((alias("btf__raw_data")))
1315 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1316
1317 const char *btf__str_by_offset(const struct btf *btf, __u32 offset)
1318 {
1319 if (offset < btf->start_str_off)
1320 return btf__str_by_offset(btf->base_btf, offset);
1321 else if (offset - btf->start_str_off < btf->hdr->str_len)
1322 return btf_strs_data(btf) + (offset - btf->start_str_off);
1323 else
1324 return errno = EINVAL, NULL;
1325 }
1326
1327 const char *btf__name_by_offset(const struct btf *btf, __u32 offset)
1328 {
1329 return btf__str_by_offset(btf, offset);
1330 }
1331
1332 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf)
1333 {
1334 struct bpf_btf_info btf_info;
1335 __u32 len = sizeof(btf_info);
1336 __u32 last_size;
1337 struct btf *btf;
1338 void *ptr;
1339 int err;
1340
1341
1342
1343
1344
1345 last_size = 4096;
1346 ptr = malloc(last_size);
1347 if (!ptr)
1348 return ERR_PTR(-ENOMEM);
1349
1350 memset(&btf_info, 0, sizeof(btf_info));
1351 btf_info.btf = ptr_to_u64(ptr);
1352 btf_info.btf_size = last_size;
1353 err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1354
1355 if (!err && btf_info.btf_size > last_size) {
1356 void *temp_ptr;
1357
1358 last_size = btf_info.btf_size;
1359 temp_ptr = realloc(ptr, last_size);
1360 if (!temp_ptr) {
1361 btf = ERR_PTR(-ENOMEM);
1362 goto exit_free;
1363 }
1364 ptr = temp_ptr;
1365
1366 len = sizeof(btf_info);
1367 memset(&btf_info, 0, sizeof(btf_info));
1368 btf_info.btf = ptr_to_u64(ptr);
1369 btf_info.btf_size = last_size;
1370
1371 err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1372 }
1373
1374 if (err || btf_info.btf_size > last_size) {
1375 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG);
1376 goto exit_free;
1377 }
1378
1379 btf = btf_new(ptr, btf_info.btf_size, base_btf);
1380
1381 exit_free:
1382 free(ptr);
1383 return btf;
1384 }
1385
1386 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf)
1387 {
1388 struct btf *btf;
1389 int btf_fd;
1390
1391 btf_fd = bpf_btf_get_fd_by_id(id);
1392 if (btf_fd < 0)
1393 return libbpf_err_ptr(-errno);
1394
1395 btf = btf_get_from_fd(btf_fd, base_btf);
1396 close(btf_fd);
1397
1398 return libbpf_ptr(btf);
1399 }
1400
1401 struct btf *btf__load_from_kernel_by_id(__u32 id)
1402 {
1403 return btf__load_from_kernel_by_id_split(id, NULL);
1404 }
1405
1406 static void btf_invalidate_raw_data(struct btf *btf)
1407 {
1408 if (btf->raw_data) {
1409 free(btf->raw_data);
1410 btf->raw_data = NULL;
1411 }
1412 if (btf->raw_data_swapped) {
1413 free(btf->raw_data_swapped);
1414 btf->raw_data_swapped = NULL;
1415 }
1416 }
1417
1418
1419
1420
1421
1422 static int btf_ensure_modifiable(struct btf *btf)
1423 {
1424 void *hdr, *types;
1425 struct strset *set = NULL;
1426 int err = -ENOMEM;
1427
1428 if (btf_is_modifiable(btf)) {
1429
1430 btf_invalidate_raw_data(btf);
1431 return 0;
1432 }
1433
1434
1435 hdr = malloc(btf->hdr->hdr_len);
1436 types = malloc(btf->hdr->type_len);
1437 if (!hdr || !types)
1438 goto err_out;
1439
1440 memcpy(hdr, btf->hdr, btf->hdr->hdr_len);
1441 memcpy(types, btf->types_data, btf->hdr->type_len);
1442
1443
1444 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len);
1445 if (IS_ERR(set)) {
1446 err = PTR_ERR(set);
1447 goto err_out;
1448 }
1449
1450
1451 btf->hdr = hdr;
1452 btf->types_data = types;
1453 btf->types_data_cap = btf->hdr->type_len;
1454 btf->strs_data = NULL;
1455 btf->strs_set = set;
1456
1457
1458
1459 if (btf->hdr->str_len == 0)
1460 btf->strs_deduped = true;
1461 if (!btf->base_btf && btf->hdr->str_len == 1)
1462 btf->strs_deduped = true;
1463
1464
1465 btf_invalidate_raw_data(btf);
1466
1467 return 0;
1468
1469 err_out:
1470 strset__free(set);
1471 free(hdr);
1472 free(types);
1473 return err;
1474 }
1475
1476
1477
1478
1479
1480
1481
1482 int btf__find_str(struct btf *btf, const char *s)
1483 {
1484 int off;
1485
1486 if (btf->base_btf) {
1487 off = btf__find_str(btf->base_btf, s);
1488 if (off != -ENOENT)
1489 return off;
1490 }
1491
1492
1493 if (btf_ensure_modifiable(btf))
1494 return libbpf_err(-ENOMEM);
1495
1496 off = strset__find_str(btf->strs_set, s);
1497 if (off < 0)
1498 return libbpf_err(off);
1499
1500 return btf->start_str_off + off;
1501 }
1502
1503
1504
1505
1506
1507
1508 int btf__add_str(struct btf *btf, const char *s)
1509 {
1510 int off;
1511
1512 if (btf->base_btf) {
1513 off = btf__find_str(btf->base_btf, s);
1514 if (off != -ENOENT)
1515 return off;
1516 }
1517
1518 if (btf_ensure_modifiable(btf))
1519 return libbpf_err(-ENOMEM);
1520
1521 off = strset__add_str(btf->strs_set, s);
1522 if (off < 0)
1523 return libbpf_err(off);
1524
1525 btf->hdr->str_len = strset__data_size(btf->strs_set);
1526
1527 return btf->start_str_off + off;
1528 }
1529
1530 static void *btf_add_type_mem(struct btf *btf, size_t add_sz)
1531 {
1532 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1,
1533 btf->hdr->type_len, UINT_MAX, add_sz);
1534 }
1535
1536 static void btf_type_inc_vlen(struct btf_type *t)
1537 {
1538 t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
1539 }
1540
1541 static int btf_commit_type(struct btf *btf, int data_sz)
1542 {
1543 int err;
1544
1545 err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
1546 if (err)
1547 return libbpf_err(err);
1548
1549 btf->hdr->type_len += data_sz;
1550 btf->hdr->str_off += data_sz;
1551 btf->nr_types++;
1552 return btf->start_id + btf->nr_types - 1;
1553 }
1554
1555 struct btf_pipe {
1556 const struct btf *src;
1557 struct btf *dst;
1558 struct hashmap *str_off_map;
1559 };
1560
1561 static int btf_rewrite_str(__u32 *str_off, void *ctx)
1562 {
1563 struct btf_pipe *p = ctx;
1564 void *mapped_off;
1565 int off, err;
1566
1567 if (!*str_off)
1568 return 0;
1569
1570 if (p->str_off_map &&
1571 hashmap__find(p->str_off_map, (void *)(long)*str_off, &mapped_off)) {
1572 *str_off = (__u32)(long)mapped_off;
1573 return 0;
1574 }
1575
1576 off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
1577 if (off < 0)
1578 return off;
1579
1580
1581
1582
1583 if (p->str_off_map) {
1584 err = hashmap__append(p->str_off_map, (void *)(long)*str_off, (void *)(long)off);
1585 if (err)
1586 return err;
1587 }
1588
1589 *str_off = off;
1590 return 0;
1591 }
1592
1593 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
1594 {
1595 struct btf_pipe p = { .src = src_btf, .dst = btf };
1596 struct btf_type *t;
1597 int sz, err;
1598
1599 sz = btf_type_size(src_type);
1600 if (sz < 0)
1601 return libbpf_err(sz);
1602
1603
1604 if (btf_ensure_modifiable(btf))
1605 return libbpf_err(-ENOMEM);
1606
1607 t = btf_add_type_mem(btf, sz);
1608 if (!t)
1609 return libbpf_err(-ENOMEM);
1610
1611 memcpy(t, src_type, sz);
1612
1613 err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1614 if (err)
1615 return libbpf_err(err);
1616
1617 return btf_commit_type(btf, sz);
1618 }
1619
1620 static int btf_rewrite_type_ids(__u32 *type_id, void *ctx)
1621 {
1622 struct btf *btf = ctx;
1623
1624 if (!*type_id)
1625 return 0;
1626
1627
1628
1629
1630
1631 *type_id += btf->start_id + btf->nr_types - 1;
1632 return 0;
1633 }
1634
1635 static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx);
1636 static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx);
1637
1638 int btf__add_btf(struct btf *btf, const struct btf *src_btf)
1639 {
1640 struct btf_pipe p = { .src = src_btf, .dst = btf };
1641 int data_sz, sz, cnt, i, err, old_strs_len;
1642 __u32 *off;
1643 void *t;
1644
1645
1646 if (src_btf->base_btf)
1647 return libbpf_err(-ENOTSUP);
1648
1649
1650 if (btf_ensure_modifiable(btf))
1651 return libbpf_err(-ENOMEM);
1652
1653
1654
1655
1656 old_strs_len = btf->hdr->str_len;
1657
1658 data_sz = src_btf->hdr->type_len;
1659 cnt = btf__type_cnt(src_btf) - 1;
1660
1661
1662 t = btf_add_type_mem(btf, data_sz);
1663 if (!t)
1664 return libbpf_err(-ENOMEM);
1665
1666
1667 off = btf_add_type_offs_mem(btf, cnt);
1668 if (!off)
1669 return libbpf_err(-ENOMEM);
1670
1671
1672 p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
1673 if (IS_ERR(p.str_off_map))
1674 return libbpf_err(-ENOMEM);
1675
1676
1677 memcpy(t, src_btf->types_data, data_sz);
1678
1679 for (i = 0; i < cnt; i++) {
1680 sz = btf_type_size(t);
1681 if (sz < 0) {
1682
1683 err = sz;
1684 goto err_out;
1685 }
1686
1687
1688 *off = t - btf->types_data;
1689
1690
1691 err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1692 if (err)
1693 goto err_out;
1694
1695
1696 err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf);
1697 if (err)
1698 goto err_out;
1699
1700
1701 t += sz;
1702 off++;
1703 }
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713 btf->hdr->type_len += data_sz;
1714 btf->hdr->str_off += data_sz;
1715 btf->nr_types += cnt;
1716
1717 hashmap__free(p.str_off_map);
1718
1719
1720 return btf->start_id + btf->nr_types - cnt;
1721 err_out:
1722
1723
1724
1725 memset(btf->types_data + btf->hdr->type_len, 0, data_sz);
1726 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len);
1727
1728
1729
1730 btf->hdr->str_len = old_strs_len;
1731
1732 hashmap__free(p.str_off_map);
1733
1734 return libbpf_err(err);
1735 }
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
1747 {
1748 struct btf_type *t;
1749 int sz, name_off;
1750
1751
1752 if (!name || !name[0])
1753 return libbpf_err(-EINVAL);
1754
1755 if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16)
1756 return libbpf_err(-EINVAL);
1757 if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL))
1758 return libbpf_err(-EINVAL);
1759
1760
1761 if (btf_ensure_modifiable(btf))
1762 return libbpf_err(-ENOMEM);
1763
1764 sz = sizeof(struct btf_type) + sizeof(int);
1765 t = btf_add_type_mem(btf, sz);
1766 if (!t)
1767 return libbpf_err(-ENOMEM);
1768
1769
1770
1771
1772
1773 name_off = btf__add_str(btf, name);
1774 if (name_off < 0)
1775 return name_off;
1776
1777 t->name_off = name_off;
1778 t->info = btf_type_info(BTF_KIND_INT, 0, 0);
1779 t->size = byte_sz;
1780
1781 *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
1782
1783 return btf_commit_type(btf, sz);
1784 }
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz)
1795 {
1796 struct btf_type *t;
1797 int sz, name_off;
1798
1799
1800 if (!name || !name[0])
1801 return libbpf_err(-EINVAL);
1802
1803
1804 if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 &&
1805 byte_sz != 16)
1806 return libbpf_err(-EINVAL);
1807
1808 if (btf_ensure_modifiable(btf))
1809 return libbpf_err(-ENOMEM);
1810
1811 sz = sizeof(struct btf_type);
1812 t = btf_add_type_mem(btf, sz);
1813 if (!t)
1814 return libbpf_err(-ENOMEM);
1815
1816 name_off = btf__add_str(btf, name);
1817 if (name_off < 0)
1818 return name_off;
1819
1820 t->name_off = name_off;
1821 t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
1822 t->size = byte_sz;
1823
1824 return btf_commit_type(btf, sz);
1825 }
1826
1827
1828
1829
1830
1831 static int validate_type_id(int id)
1832 {
1833 if (id < 0 || id > BTF_MAX_NR_TYPES)
1834 return -EINVAL;
1835 return 0;
1836 }
1837
1838
1839 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
1840 {
1841 struct btf_type *t;
1842 int sz, name_off = 0;
1843
1844 if (validate_type_id(ref_type_id))
1845 return libbpf_err(-EINVAL);
1846
1847 if (btf_ensure_modifiable(btf))
1848 return libbpf_err(-ENOMEM);
1849
1850 sz = sizeof(struct btf_type);
1851 t = btf_add_type_mem(btf, sz);
1852 if (!t)
1853 return libbpf_err(-ENOMEM);
1854
1855 if (name && name[0]) {
1856 name_off = btf__add_str(btf, name);
1857 if (name_off < 0)
1858 return name_off;
1859 }
1860
1861 t->name_off = name_off;
1862 t->info = btf_type_info(kind, 0, 0);
1863 t->type = ref_type_id;
1864
1865 return btf_commit_type(btf, sz);
1866 }
1867
1868
1869
1870
1871
1872
1873
1874
1875 int btf__add_ptr(struct btf *btf, int ref_type_id)
1876 {
1877 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
1878 }
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems)
1890 {
1891 struct btf_type *t;
1892 struct btf_array *a;
1893 int sz;
1894
1895 if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
1896 return libbpf_err(-EINVAL);
1897
1898 if (btf_ensure_modifiable(btf))
1899 return libbpf_err(-ENOMEM);
1900
1901 sz = sizeof(struct btf_type) + sizeof(struct btf_array);
1902 t = btf_add_type_mem(btf, sz);
1903 if (!t)
1904 return libbpf_err(-ENOMEM);
1905
1906 t->name_off = 0;
1907 t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0);
1908 t->size = 0;
1909
1910 a = btf_array(t);
1911 a->type = elem_type_id;
1912 a->index_type = index_type_id;
1913 a->nelems = nr_elems;
1914
1915 return btf_commit_type(btf, sz);
1916 }
1917
1918
1919 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
1920 {
1921 struct btf_type *t;
1922 int sz, name_off = 0;
1923
1924 if (btf_ensure_modifiable(btf))
1925 return libbpf_err(-ENOMEM);
1926
1927 sz = sizeof(struct btf_type);
1928 t = btf_add_type_mem(btf, sz);
1929 if (!t)
1930 return libbpf_err(-ENOMEM);
1931
1932 if (name && name[0]) {
1933 name_off = btf__add_str(btf, name);
1934 if (name_off < 0)
1935 return name_off;
1936 }
1937
1938
1939
1940
1941 t->name_off = name_off;
1942 t->info = btf_type_info(kind, 0, 0);
1943 t->size = bytes_sz;
1944
1945 return btf_commit_type(btf, sz);
1946 }
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz)
1961 {
1962 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz);
1963 }
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz)
1979 {
1980 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
1981 }
1982
1983 static struct btf_type *btf_last_type(struct btf *btf)
1984 {
1985 return btf_type_by_id(btf, btf__type_cnt(btf) - 1);
1986 }
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998 int btf__add_field(struct btf *btf, const char *name, int type_id,
1999 __u32 bit_offset, __u32 bit_size)
2000 {
2001 struct btf_type *t;
2002 struct btf_member *m;
2003 bool is_bitfield;
2004 int sz, name_off = 0;
2005
2006
2007 if (btf->nr_types == 0)
2008 return libbpf_err(-EINVAL);
2009 t = btf_last_type(btf);
2010 if (!btf_is_composite(t))
2011 return libbpf_err(-EINVAL);
2012
2013 if (validate_type_id(type_id))
2014 return libbpf_err(-EINVAL);
2015
2016 is_bitfield = bit_size || (bit_offset % 8 != 0);
2017 if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff))
2018 return libbpf_err(-EINVAL);
2019
2020
2021 if (btf_is_union(t) && bit_offset)
2022 return libbpf_err(-EINVAL);
2023
2024
2025 if (btf_ensure_modifiable(btf))
2026 return libbpf_err(-ENOMEM);
2027
2028 sz = sizeof(struct btf_member);
2029 m = btf_add_type_mem(btf, sz);
2030 if (!m)
2031 return libbpf_err(-ENOMEM);
2032
2033 if (name && name[0]) {
2034 name_off = btf__add_str(btf, name);
2035 if (name_off < 0)
2036 return name_off;
2037 }
2038
2039 m->name_off = name_off;
2040 m->type = type_id;
2041 m->offset = bit_offset | (bit_size << 24);
2042
2043
2044 t = btf_last_type(btf);
2045
2046 t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
2047
2048 btf->hdr->type_len += sz;
2049 btf->hdr->str_off += sz;
2050 return 0;
2051 }
2052
2053 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz,
2054 bool is_signed, __u8 kind)
2055 {
2056 struct btf_type *t;
2057 int sz, name_off = 0;
2058
2059
2060 if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
2061 return libbpf_err(-EINVAL);
2062
2063 if (btf_ensure_modifiable(btf))
2064 return libbpf_err(-ENOMEM);
2065
2066 sz = sizeof(struct btf_type);
2067 t = btf_add_type_mem(btf, sz);
2068 if (!t)
2069 return libbpf_err(-ENOMEM);
2070
2071 if (name && name[0]) {
2072 name_off = btf__add_str(btf, name);
2073 if (name_off < 0)
2074 return name_off;
2075 }
2076
2077
2078 t->name_off = name_off;
2079 t->info = btf_type_info(kind, 0, is_signed);
2080 t->size = byte_sz;
2081
2082 return btf_commit_type(btf, sz);
2083 }
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
2099 {
2100
2101
2102
2103
2104 return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM);
2105 }
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value)
2116 {
2117 struct btf_type *t;
2118 struct btf_enum *v;
2119 int sz, name_off;
2120
2121
2122 if (btf->nr_types == 0)
2123 return libbpf_err(-EINVAL);
2124 t = btf_last_type(btf);
2125 if (!btf_is_enum(t))
2126 return libbpf_err(-EINVAL);
2127
2128
2129 if (!name || !name[0])
2130 return libbpf_err(-EINVAL);
2131 if (value < INT_MIN || value > UINT_MAX)
2132 return libbpf_err(-E2BIG);
2133
2134
2135 if (btf_ensure_modifiable(btf))
2136 return libbpf_err(-ENOMEM);
2137
2138 sz = sizeof(struct btf_enum);
2139 v = btf_add_type_mem(btf, sz);
2140 if (!v)
2141 return libbpf_err(-ENOMEM);
2142
2143 name_off = btf__add_str(btf, name);
2144 if (name_off < 0)
2145 return name_off;
2146
2147 v->name_off = name_off;
2148 v->val = value;
2149
2150
2151 t = btf_last_type(btf);
2152 btf_type_inc_vlen(t);
2153
2154
2155 if (value < 0)
2156 t->info = btf_type_info(btf_kind(t), btf_vlen(t), true);
2157
2158 btf->hdr->type_len += sz;
2159 btf->hdr->str_off += sz;
2160 return 0;
2161 }
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz,
2178 bool is_signed)
2179 {
2180 return btf_add_enum_common(btf, name, byte_sz, is_signed,
2181 BTF_KIND_ENUM64);
2182 }
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value)
2193 {
2194 struct btf_enum64 *v;
2195 struct btf_type *t;
2196 int sz, name_off;
2197
2198
2199 if (btf->nr_types == 0)
2200 return libbpf_err(-EINVAL);
2201 t = btf_last_type(btf);
2202 if (!btf_is_enum64(t))
2203 return libbpf_err(-EINVAL);
2204
2205
2206 if (!name || !name[0])
2207 return libbpf_err(-EINVAL);
2208
2209
2210 if (btf_ensure_modifiable(btf))
2211 return libbpf_err(-ENOMEM);
2212
2213 sz = sizeof(struct btf_enum64);
2214 v = btf_add_type_mem(btf, sz);
2215 if (!v)
2216 return libbpf_err(-ENOMEM);
2217
2218 name_off = btf__add_str(btf, name);
2219 if (name_off < 0)
2220 return name_off;
2221
2222 v->name_off = name_off;
2223 v->val_lo32 = (__u32)value;
2224 v->val_hi32 = value >> 32;
2225
2226
2227 t = btf_last_type(btf);
2228 btf_type_inc_vlen(t);
2229
2230 btf->hdr->type_len += sz;
2231 btf->hdr->str_off += sz;
2232 return 0;
2233 }
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
2245 {
2246 if (!name || !name[0])
2247 return libbpf_err(-EINVAL);
2248
2249 switch (fwd_kind) {
2250 case BTF_FWD_STRUCT:
2251 case BTF_FWD_UNION: {
2252 struct btf_type *t;
2253 int id;
2254
2255 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
2256 if (id <= 0)
2257 return id;
2258 t = btf_type_by_id(btf, id);
2259 t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION);
2260 return id;
2261 }
2262 case BTF_FWD_ENUM:
2263
2264
2265
2266 return btf__add_enum(btf, name, sizeof(int));
2267 default:
2268 return libbpf_err(-EINVAL);
2269 }
2270 }
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
2281 {
2282 if (!name || !name[0])
2283 return libbpf_err(-EINVAL);
2284
2285 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
2286 }
2287
2288
2289
2290
2291
2292
2293
2294
2295 int btf__add_volatile(struct btf *btf, int ref_type_id)
2296 {
2297 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
2298 }
2299
2300
2301
2302
2303
2304
2305
2306
2307 int btf__add_const(struct btf *btf, int ref_type_id)
2308 {
2309 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
2310 }
2311
2312
2313
2314
2315
2316
2317
2318
2319 int btf__add_restrict(struct btf *btf, int ref_type_id)
2320 {
2321 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
2322 }
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
2333 {
2334 if (!value|| !value[0])
2335 return libbpf_err(-EINVAL);
2336
2337 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
2338 }
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348 int btf__add_func(struct btf *btf, const char *name,
2349 enum btf_func_linkage linkage, int proto_type_id)
2350 {
2351 int id;
2352
2353 if (!name || !name[0])
2354 return libbpf_err(-EINVAL);
2355 if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL &&
2356 linkage != BTF_FUNC_EXTERN)
2357 return libbpf_err(-EINVAL);
2358
2359 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
2360 if (id > 0) {
2361 struct btf_type *t = btf_type_by_id(btf, id);
2362
2363 t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0);
2364 }
2365 return libbpf_err(id);
2366 }
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380 int btf__add_func_proto(struct btf *btf, int ret_type_id)
2381 {
2382 struct btf_type *t;
2383 int sz;
2384
2385 if (validate_type_id(ret_type_id))
2386 return libbpf_err(-EINVAL);
2387
2388 if (btf_ensure_modifiable(btf))
2389 return libbpf_err(-ENOMEM);
2390
2391 sz = sizeof(struct btf_type);
2392 t = btf_add_type_mem(btf, sz);
2393 if (!t)
2394 return libbpf_err(-ENOMEM);
2395
2396
2397
2398
2399 t->name_off = 0;
2400 t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
2401 t->type = ret_type_id;
2402
2403 return btf_commit_type(btf, sz);
2404 }
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414 int btf__add_func_param(struct btf *btf, const char *name, int type_id)
2415 {
2416 struct btf_type *t;
2417 struct btf_param *p;
2418 int sz, name_off = 0;
2419
2420 if (validate_type_id(type_id))
2421 return libbpf_err(-EINVAL);
2422
2423
2424 if (btf->nr_types == 0)
2425 return libbpf_err(-EINVAL);
2426 t = btf_last_type(btf);
2427 if (!btf_is_func_proto(t))
2428 return libbpf_err(-EINVAL);
2429
2430
2431 if (btf_ensure_modifiable(btf))
2432 return libbpf_err(-ENOMEM);
2433
2434 sz = sizeof(struct btf_param);
2435 p = btf_add_type_mem(btf, sz);
2436 if (!p)
2437 return libbpf_err(-ENOMEM);
2438
2439 if (name && name[0]) {
2440 name_off = btf__add_str(btf, name);
2441 if (name_off < 0)
2442 return name_off;
2443 }
2444
2445 p->name_off = name_off;
2446 p->type = type_id;
2447
2448
2449 t = btf_last_type(btf);
2450 btf_type_inc_vlen(t);
2451
2452 btf->hdr->type_len += sz;
2453 btf->hdr->str_off += sz;
2454 return 0;
2455 }
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id)
2468 {
2469 struct btf_type *t;
2470 struct btf_var *v;
2471 int sz, name_off;
2472
2473
2474 if (!name || !name[0])
2475 return libbpf_err(-EINVAL);
2476 if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED &&
2477 linkage != BTF_VAR_GLOBAL_EXTERN)
2478 return libbpf_err(-EINVAL);
2479 if (validate_type_id(type_id))
2480 return libbpf_err(-EINVAL);
2481
2482
2483 if (btf_ensure_modifiable(btf))
2484 return libbpf_err(-ENOMEM);
2485
2486 sz = sizeof(struct btf_type) + sizeof(struct btf_var);
2487 t = btf_add_type_mem(btf, sz);
2488 if (!t)
2489 return libbpf_err(-ENOMEM);
2490
2491 name_off = btf__add_str(btf, name);
2492 if (name_off < 0)
2493 return name_off;
2494
2495 t->name_off = name_off;
2496 t->info = btf_type_info(BTF_KIND_VAR, 0, 0);
2497 t->type = type_id;
2498
2499 v = btf_var(t);
2500 v->linkage = linkage;
2501
2502 return btf_commit_type(btf, sz);
2503 }
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
2518 {
2519 struct btf_type *t;
2520 int sz, name_off;
2521
2522
2523 if (!name || !name[0])
2524 return libbpf_err(-EINVAL);
2525
2526 if (btf_ensure_modifiable(btf))
2527 return libbpf_err(-ENOMEM);
2528
2529 sz = sizeof(struct btf_type);
2530 t = btf_add_type_mem(btf, sz);
2531 if (!t)
2532 return libbpf_err(-ENOMEM);
2533
2534 name_off = btf__add_str(btf, name);
2535 if (name_off < 0)
2536 return name_off;
2537
2538
2539 t->name_off = name_off;
2540 t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
2541 t->size = byte_sz;
2542
2543 return btf_commit_type(btf, sz);
2544 }
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556 int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz)
2557 {
2558 struct btf_type *t;
2559 struct btf_var_secinfo *v;
2560 int sz;
2561
2562
2563 if (btf->nr_types == 0)
2564 return libbpf_err(-EINVAL);
2565 t = btf_last_type(btf);
2566 if (!btf_is_datasec(t))
2567 return libbpf_err(-EINVAL);
2568
2569 if (validate_type_id(var_type_id))
2570 return libbpf_err(-EINVAL);
2571
2572
2573 if (btf_ensure_modifiable(btf))
2574 return libbpf_err(-ENOMEM);
2575
2576 sz = sizeof(struct btf_var_secinfo);
2577 v = btf_add_type_mem(btf, sz);
2578 if (!v)
2579 return libbpf_err(-ENOMEM);
2580
2581 v->type = var_type_id;
2582 v->offset = offset;
2583 v->size = byte_sz;
2584
2585
2586 t = btf_last_type(btf);
2587 btf_type_inc_vlen(t);
2588
2589 btf->hdr->type_len += sz;
2590 btf->hdr->str_off += sz;
2591 return 0;
2592 }
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
2605 int component_idx)
2606 {
2607 struct btf_type *t;
2608 int sz, value_off;
2609
2610 if (!value || !value[0] || component_idx < -1)
2611 return libbpf_err(-EINVAL);
2612
2613 if (validate_type_id(ref_type_id))
2614 return libbpf_err(-EINVAL);
2615
2616 if (btf_ensure_modifiable(btf))
2617 return libbpf_err(-ENOMEM);
2618
2619 sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag);
2620 t = btf_add_type_mem(btf, sz);
2621 if (!t)
2622 return libbpf_err(-ENOMEM);
2623
2624 value_off = btf__add_str(btf, value);
2625 if (value_off < 0)
2626 return value_off;
2627
2628 t->name_off = value_off;
2629 t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
2630 t->type = ref_type_id;
2631 btf_decl_tag(t)->component_idx = component_idx;
2632
2633 return btf_commit_type(btf, sz);
2634 }
2635
2636 struct btf_ext_sec_setup_param {
2637 __u32 off;
2638 __u32 len;
2639 __u32 min_rec_size;
2640 struct btf_ext_info *ext_info;
2641 const char *desc;
2642 };
2643
2644 static int btf_ext_setup_info(struct btf_ext *btf_ext,
2645 struct btf_ext_sec_setup_param *ext_sec)
2646 {
2647 const struct btf_ext_info_sec *sinfo;
2648 struct btf_ext_info *ext_info;
2649 __u32 info_left, record_size;
2650 size_t sec_cnt = 0;
2651
2652 void *info;
2653
2654 if (ext_sec->len == 0)
2655 return 0;
2656
2657 if (ext_sec->off & 0x03) {
2658 pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n",
2659 ext_sec->desc);
2660 return -EINVAL;
2661 }
2662
2663 info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
2664 info_left = ext_sec->len;
2665
2666 if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
2667 pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n",
2668 ext_sec->desc, ext_sec->off, ext_sec->len);
2669 return -EINVAL;
2670 }
2671
2672
2673 if (info_left < sizeof(__u32)) {
2674 pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc);
2675 return -EINVAL;
2676 }
2677
2678
2679 record_size = *(__u32 *)info;
2680 if (record_size < ext_sec->min_rec_size ||
2681 record_size & 0x03) {
2682 pr_debug("%s section in .BTF.ext has invalid record size %u\n",
2683 ext_sec->desc, record_size);
2684 return -EINVAL;
2685 }
2686
2687 sinfo = info + sizeof(__u32);
2688 info_left -= sizeof(__u32);
2689
2690
2691 if (!info_left) {
2692 pr_debug("%s section in .BTF.ext has no records", ext_sec->desc);
2693 return -EINVAL;
2694 }
2695
2696 while (info_left) {
2697 unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec);
2698 __u64 total_record_size;
2699 __u32 num_records;
2700
2701 if (info_left < sec_hdrlen) {
2702 pr_debug("%s section header is not found in .BTF.ext\n",
2703 ext_sec->desc);
2704 return -EINVAL;
2705 }
2706
2707 num_records = sinfo->num_info;
2708 if (num_records == 0) {
2709 pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2710 ext_sec->desc);
2711 return -EINVAL;
2712 }
2713
2714 total_record_size = sec_hdrlen + (__u64)num_records * record_size;
2715 if (info_left < total_record_size) {
2716 pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2717 ext_sec->desc);
2718 return -EINVAL;
2719 }
2720
2721 info_left -= total_record_size;
2722 sinfo = (void *)sinfo + total_record_size;
2723 sec_cnt++;
2724 }
2725
2726 ext_info = ext_sec->ext_info;
2727 ext_info->len = ext_sec->len - sizeof(__u32);
2728 ext_info->rec_size = record_size;
2729 ext_info->info = info + sizeof(__u32);
2730 ext_info->sec_cnt = sec_cnt;
2731
2732 return 0;
2733 }
2734
2735 static int btf_ext_setup_func_info(struct btf_ext *btf_ext)
2736 {
2737 struct btf_ext_sec_setup_param param = {
2738 .off = btf_ext->hdr->func_info_off,
2739 .len = btf_ext->hdr->func_info_len,
2740 .min_rec_size = sizeof(struct bpf_func_info_min),
2741 .ext_info = &btf_ext->func_info,
2742 .desc = "func_info"
2743 };
2744
2745 return btf_ext_setup_info(btf_ext, ¶m);
2746 }
2747
2748 static int btf_ext_setup_line_info(struct btf_ext *btf_ext)
2749 {
2750 struct btf_ext_sec_setup_param param = {
2751 .off = btf_ext->hdr->line_info_off,
2752 .len = btf_ext->hdr->line_info_len,
2753 .min_rec_size = sizeof(struct bpf_line_info_min),
2754 .ext_info = &btf_ext->line_info,
2755 .desc = "line_info",
2756 };
2757
2758 return btf_ext_setup_info(btf_ext, ¶m);
2759 }
2760
2761 static int btf_ext_setup_core_relos(struct btf_ext *btf_ext)
2762 {
2763 struct btf_ext_sec_setup_param param = {
2764 .off = btf_ext->hdr->core_relo_off,
2765 .len = btf_ext->hdr->core_relo_len,
2766 .min_rec_size = sizeof(struct bpf_core_relo),
2767 .ext_info = &btf_ext->core_relo_info,
2768 .desc = "core_relo",
2769 };
2770
2771 return btf_ext_setup_info(btf_ext, ¶m);
2772 }
2773
2774 static int btf_ext_parse_hdr(__u8 *data, __u32 data_size)
2775 {
2776 const struct btf_ext_header *hdr = (struct btf_ext_header *)data;
2777
2778 if (data_size < offsetofend(struct btf_ext_header, hdr_len) ||
2779 data_size < hdr->hdr_len) {
2780 pr_debug("BTF.ext header not found");
2781 return -EINVAL;
2782 }
2783
2784 if (hdr->magic == bswap_16(BTF_MAGIC)) {
2785 pr_warn("BTF.ext in non-native endianness is not supported\n");
2786 return -ENOTSUP;
2787 } else if (hdr->magic != BTF_MAGIC) {
2788 pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic);
2789 return -EINVAL;
2790 }
2791
2792 if (hdr->version != BTF_VERSION) {
2793 pr_debug("Unsupported BTF.ext version:%u\n", hdr->version);
2794 return -ENOTSUP;
2795 }
2796
2797 if (hdr->flags) {
2798 pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags);
2799 return -ENOTSUP;
2800 }
2801
2802 if (data_size == hdr->hdr_len) {
2803 pr_debug("BTF.ext has no data\n");
2804 return -EINVAL;
2805 }
2806
2807 return 0;
2808 }
2809
2810 void btf_ext__free(struct btf_ext *btf_ext)
2811 {
2812 if (IS_ERR_OR_NULL(btf_ext))
2813 return;
2814 free(btf_ext->func_info.sec_idxs);
2815 free(btf_ext->line_info.sec_idxs);
2816 free(btf_ext->core_relo_info.sec_idxs);
2817 free(btf_ext->data);
2818 free(btf_ext);
2819 }
2820
2821 struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
2822 {
2823 struct btf_ext *btf_ext;
2824 int err;
2825
2826 btf_ext = calloc(1, sizeof(struct btf_ext));
2827 if (!btf_ext)
2828 return libbpf_err_ptr(-ENOMEM);
2829
2830 btf_ext->data_size = size;
2831 btf_ext->data = malloc(size);
2832 if (!btf_ext->data) {
2833 err = -ENOMEM;
2834 goto done;
2835 }
2836 memcpy(btf_ext->data, data, size);
2837
2838 err = btf_ext_parse_hdr(btf_ext->data, size);
2839 if (err)
2840 goto done;
2841
2842 if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) {
2843 err = -EINVAL;
2844 goto done;
2845 }
2846
2847 err = btf_ext_setup_func_info(btf_ext);
2848 if (err)
2849 goto done;
2850
2851 err = btf_ext_setup_line_info(btf_ext);
2852 if (err)
2853 goto done;
2854
2855 if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
2856 goto done;
2857
2858 err = btf_ext_setup_core_relos(btf_ext);
2859 if (err)
2860 goto done;
2861
2862 done:
2863 if (err) {
2864 btf_ext__free(btf_ext);
2865 return libbpf_err_ptr(err);
2866 }
2867
2868 return btf_ext;
2869 }
2870
2871 const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size)
2872 {
2873 *size = btf_ext->data_size;
2874 return btf_ext->data;
2875 }
2876
2877 struct btf_dedup;
2878
2879 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
2880 static void btf_dedup_free(struct btf_dedup *d);
2881 static int btf_dedup_prep(struct btf_dedup *d);
2882 static int btf_dedup_strings(struct btf_dedup *d);
2883 static int btf_dedup_prim_types(struct btf_dedup *d);
2884 static int btf_dedup_struct_types(struct btf_dedup *d);
2885 static int btf_dedup_ref_types(struct btf_dedup *d);
2886 static int btf_dedup_compact_types(struct btf_dedup *d);
2887 static int btf_dedup_remap_types(struct btf_dedup *d);
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts)
3027 {
3028 struct btf_dedup *d;
3029 int err;
3030
3031 if (!OPTS_VALID(opts, btf_dedup_opts))
3032 return libbpf_err(-EINVAL);
3033
3034 d = btf_dedup_new(btf, opts);
3035 if (IS_ERR(d)) {
3036 pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d));
3037 return libbpf_err(-EINVAL);
3038 }
3039
3040 if (btf_ensure_modifiable(btf)) {
3041 err = -ENOMEM;
3042 goto done;
3043 }
3044
3045 err = btf_dedup_prep(d);
3046 if (err) {
3047 pr_debug("btf_dedup_prep failed:%d\n", err);
3048 goto done;
3049 }
3050 err = btf_dedup_strings(d);
3051 if (err < 0) {
3052 pr_debug("btf_dedup_strings failed:%d\n", err);
3053 goto done;
3054 }
3055 err = btf_dedup_prim_types(d);
3056 if (err < 0) {
3057 pr_debug("btf_dedup_prim_types failed:%d\n", err);
3058 goto done;
3059 }
3060 err = btf_dedup_struct_types(d);
3061 if (err < 0) {
3062 pr_debug("btf_dedup_struct_types failed:%d\n", err);
3063 goto done;
3064 }
3065 err = btf_dedup_ref_types(d);
3066 if (err < 0) {
3067 pr_debug("btf_dedup_ref_types failed:%d\n", err);
3068 goto done;
3069 }
3070 err = btf_dedup_compact_types(d);
3071 if (err < 0) {
3072 pr_debug("btf_dedup_compact_types failed:%d\n", err);
3073 goto done;
3074 }
3075 err = btf_dedup_remap_types(d);
3076 if (err < 0) {
3077 pr_debug("btf_dedup_remap_types failed:%d\n", err);
3078 goto done;
3079 }
3080
3081 done:
3082 btf_dedup_free(d);
3083 return libbpf_err(err);
3084 }
3085
3086 #define BTF_UNPROCESSED_ID ((__u32)-1)
3087 #define BTF_IN_PROGRESS_ID ((__u32)-2)
3088
3089 struct btf_dedup {
3090
3091 struct btf *btf;
3092
3093
3094
3095
3096 struct btf_ext *btf_ext;
3097
3098
3099
3100
3101
3102
3103
3104 struct hashmap *dedup_table;
3105
3106 __u32 *map;
3107
3108 __u32 *hypot_map;
3109 __u32 *hypot_list;
3110 size_t hypot_cnt;
3111 size_t hypot_cap;
3112
3113
3114
3115
3116
3117
3118 bool hypot_adjust_canon;
3119
3120 struct btf_dedup_opts opts;
3121
3122 struct strset *strs_set;
3123 };
3124
3125 static long hash_combine(long h, long value)
3126 {
3127 return h * 31 + value;
3128 }
3129
3130 #define for_each_dedup_cand(d, node, hash) \
3131 hashmap__for_each_key_entry(d->dedup_table, node, (void *)hash)
3132
3133 static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id)
3134 {
3135 return hashmap__append(d->dedup_table,
3136 (void *)hash, (void *)(long)type_id);
3137 }
3138
3139 static int btf_dedup_hypot_map_add(struct btf_dedup *d,
3140 __u32 from_id, __u32 to_id)
3141 {
3142 if (d->hypot_cnt == d->hypot_cap) {
3143 __u32 *new_list;
3144
3145 d->hypot_cap += max((size_t)16, d->hypot_cap / 2);
3146 new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32));
3147 if (!new_list)
3148 return -ENOMEM;
3149 d->hypot_list = new_list;
3150 }
3151 d->hypot_list[d->hypot_cnt++] = from_id;
3152 d->hypot_map[from_id] = to_id;
3153 return 0;
3154 }
3155
3156 static void btf_dedup_clear_hypot_map(struct btf_dedup *d)
3157 {
3158 int i;
3159
3160 for (i = 0; i < d->hypot_cnt; i++)
3161 d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID;
3162 d->hypot_cnt = 0;
3163 d->hypot_adjust_canon = false;
3164 }
3165
3166 static void btf_dedup_free(struct btf_dedup *d)
3167 {
3168 hashmap__free(d->dedup_table);
3169 d->dedup_table = NULL;
3170
3171 free(d->map);
3172 d->map = NULL;
3173
3174 free(d->hypot_map);
3175 d->hypot_map = NULL;
3176
3177 free(d->hypot_list);
3178 d->hypot_list = NULL;
3179
3180 free(d);
3181 }
3182
3183 static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx)
3184 {
3185 return (size_t)key;
3186 }
3187
3188 static size_t btf_dedup_collision_hash_fn(const void *key, void *ctx)
3189 {
3190 return 0;
3191 }
3192
3193 static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx)
3194 {
3195 return k1 == k2;
3196 }
3197
3198 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts)
3199 {
3200 struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup));
3201 hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn;
3202 int i, err = 0, type_cnt;
3203
3204 if (!d)
3205 return ERR_PTR(-ENOMEM);
3206
3207 if (OPTS_GET(opts, force_collisions, false))
3208 hash_fn = btf_dedup_collision_hash_fn;
3209
3210 d->btf = btf;
3211 d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3212
3213 d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL);
3214 if (IS_ERR(d->dedup_table)) {
3215 err = PTR_ERR(d->dedup_table);
3216 d->dedup_table = NULL;
3217 goto done;
3218 }
3219
3220 type_cnt = btf__type_cnt(btf);
3221 d->map = malloc(sizeof(__u32) * type_cnt);
3222 if (!d->map) {
3223 err = -ENOMEM;
3224 goto done;
3225 }
3226
3227 d->map[0] = 0;
3228 for (i = 1; i < type_cnt; i++) {
3229 struct btf_type *t = btf_type_by_id(d->btf, i);
3230
3231
3232 if (btf_is_var(t) || btf_is_datasec(t))
3233 d->map[i] = i;
3234 else
3235 d->map[i] = BTF_UNPROCESSED_ID;
3236 }
3237
3238 d->hypot_map = malloc(sizeof(__u32) * type_cnt);
3239 if (!d->hypot_map) {
3240 err = -ENOMEM;
3241 goto done;
3242 }
3243 for (i = 0; i < type_cnt; i++)
3244 d->hypot_map[i] = BTF_UNPROCESSED_ID;
3245
3246 done:
3247 if (err) {
3248 btf_dedup_free(d);
3249 return ERR_PTR(err);
3250 }
3251
3252 return d;
3253 }
3254
3255
3256
3257
3258
3259 static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx)
3260 {
3261 int i, r;
3262
3263 for (i = 0; i < d->btf->nr_types; i++) {
3264 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
3265
3266 r = btf_type_visit_str_offs(t, fn, ctx);
3267 if (r)
3268 return r;
3269 }
3270
3271 if (!d->btf_ext)
3272 return 0;
3273
3274 r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
3275 if (r)
3276 return r;
3277
3278 return 0;
3279 }
3280
3281 static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx)
3282 {
3283 struct btf_dedup *d = ctx;
3284 __u32 str_off = *str_off_ptr;
3285 const char *s;
3286 int off, err;
3287
3288
3289 if (str_off == 0 || str_off < d->btf->start_str_off)
3290 return 0;
3291
3292 s = btf__str_by_offset(d->btf, str_off);
3293 if (d->btf->base_btf) {
3294 err = btf__find_str(d->btf->base_btf, s);
3295 if (err >= 0) {
3296 *str_off_ptr = err;
3297 return 0;
3298 }
3299 if (err != -ENOENT)
3300 return err;
3301 }
3302
3303 off = strset__add_str(d->strs_set, s);
3304 if (off < 0)
3305 return off;
3306
3307 *str_off_ptr = d->btf->start_str_off + off;
3308 return 0;
3309 }
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322 static int btf_dedup_strings(struct btf_dedup *d)
3323 {
3324 int err;
3325
3326 if (d->btf->strs_deduped)
3327 return 0;
3328
3329 d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0);
3330 if (IS_ERR(d->strs_set)) {
3331 err = PTR_ERR(d->strs_set);
3332 goto err_out;
3333 }
3334
3335 if (!d->btf->base_btf) {
3336
3337
3338
3339 err = strset__add_str(d->strs_set, "");
3340 if (err < 0)
3341 goto err_out;
3342 }
3343
3344
3345 err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d);
3346 if (err)
3347 goto err_out;
3348
3349
3350 strset__free(d->btf->strs_set);
3351 d->btf->hdr->str_len = strset__data_size(d->strs_set);
3352 d->btf->strs_set = d->strs_set;
3353 d->strs_set = NULL;
3354 d->btf->strs_deduped = true;
3355 return 0;
3356
3357 err_out:
3358 strset__free(d->strs_set);
3359 d->strs_set = NULL;
3360
3361 return err;
3362 }
3363
3364 static long btf_hash_common(struct btf_type *t)
3365 {
3366 long h;
3367
3368 h = hash_combine(0, t->name_off);
3369 h = hash_combine(h, t->info);
3370 h = hash_combine(h, t->size);
3371 return h;
3372 }
3373
3374 static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2)
3375 {
3376 return t1->name_off == t2->name_off &&
3377 t1->info == t2->info &&
3378 t1->size == t2->size;
3379 }
3380
3381
3382 static long btf_hash_int_decl_tag(struct btf_type *t)
3383 {
3384 __u32 info = *(__u32 *)(t + 1);
3385 long h;
3386
3387 h = btf_hash_common(t);
3388 h = hash_combine(h, info);
3389 return h;
3390 }
3391
3392
3393 static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2)
3394 {
3395 __u32 info1, info2;
3396
3397 if (!btf_equal_common(t1, t2))
3398 return false;
3399 info1 = *(__u32 *)(t1 + 1);
3400 info2 = *(__u32 *)(t2 + 1);
3401 return info1 == info2;
3402 }
3403
3404
3405 static long btf_hash_enum(struct btf_type *t)
3406 {
3407 long h;
3408
3409
3410 h = hash_combine(0, t->name_off);
3411 h = hash_combine(h, t->info & ~0xffff);
3412 h = hash_combine(h, t->size);
3413 return h;
3414 }
3415
3416
3417 static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2)
3418 {
3419 const struct btf_enum *m1, *m2;
3420 __u16 vlen;
3421 int i;
3422
3423 if (!btf_equal_common(t1, t2))
3424 return false;
3425
3426 vlen = btf_vlen(t1);
3427 m1 = btf_enum(t1);
3428 m2 = btf_enum(t2);
3429 for (i = 0; i < vlen; i++) {
3430 if (m1->name_off != m2->name_off || m1->val != m2->val)
3431 return false;
3432 m1++;
3433 m2++;
3434 }
3435 return true;
3436 }
3437
3438 static bool btf_equal_enum64(struct btf_type *t1, struct btf_type *t2)
3439 {
3440 const struct btf_enum64 *m1, *m2;
3441 __u16 vlen;
3442 int i;
3443
3444 if (!btf_equal_common(t1, t2))
3445 return false;
3446
3447 vlen = btf_vlen(t1);
3448 m1 = btf_enum64(t1);
3449 m2 = btf_enum64(t2);
3450 for (i = 0; i < vlen; i++) {
3451 if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 ||
3452 m1->val_hi32 != m2->val_hi32)
3453 return false;
3454 m1++;
3455 m2++;
3456 }
3457 return true;
3458 }
3459
3460 static inline bool btf_is_enum_fwd(struct btf_type *t)
3461 {
3462 return btf_is_any_enum(t) && btf_vlen(t) == 0;
3463 }
3464
3465 static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2)
3466 {
3467 if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3468 return btf_equal_enum(t1, t2);
3469
3470 return t1->name_off == t2->name_off &&
3471 (t1->info & ~0xffff) == (t2->info & ~0xffff) &&
3472 t1->size == t2->size;
3473 }
3474
3475 static bool btf_compat_enum64(struct btf_type *t1, struct btf_type *t2)
3476 {
3477 if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3478 return btf_equal_enum64(t1, t2);
3479
3480
3481 return t1->name_off == t2->name_off &&
3482 (t1->info & ~0xffff) == (t2->info & ~0xffff) &&
3483 t1->size == t2->size;
3484 }
3485
3486
3487
3488
3489
3490
3491 static long btf_hash_struct(struct btf_type *t)
3492 {
3493 const struct btf_member *member = btf_members(t);
3494 __u32 vlen = btf_vlen(t);
3495 long h = btf_hash_common(t);
3496 int i;
3497
3498 for (i = 0; i < vlen; i++) {
3499 h = hash_combine(h, member->name_off);
3500 h = hash_combine(h, member->offset);
3501
3502 member++;
3503 }
3504 return h;
3505 }
3506
3507
3508
3509
3510
3511
3512 static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2)
3513 {
3514 const struct btf_member *m1, *m2;
3515 __u16 vlen;
3516 int i;
3517
3518 if (!btf_equal_common(t1, t2))
3519 return false;
3520
3521 vlen = btf_vlen(t1);
3522 m1 = btf_members(t1);
3523 m2 = btf_members(t2);
3524 for (i = 0; i < vlen; i++) {
3525 if (m1->name_off != m2->name_off || m1->offset != m2->offset)
3526 return false;
3527 m1++;
3528 m2++;
3529 }
3530 return true;
3531 }
3532
3533
3534
3535
3536
3537
3538 static long btf_hash_array(struct btf_type *t)
3539 {
3540 const struct btf_array *info = btf_array(t);
3541 long h = btf_hash_common(t);
3542
3543 h = hash_combine(h, info->type);
3544 h = hash_combine(h, info->index_type);
3545 h = hash_combine(h, info->nelems);
3546 return h;
3547 }
3548
3549
3550
3551
3552
3553
3554
3555
3556 static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2)
3557 {
3558 const struct btf_array *info1, *info2;
3559
3560 if (!btf_equal_common(t1, t2))
3561 return false;
3562
3563 info1 = btf_array(t1);
3564 info2 = btf_array(t2);
3565 return info1->type == info2->type &&
3566 info1->index_type == info2->index_type &&
3567 info1->nelems == info2->nelems;
3568 }
3569
3570
3571
3572
3573
3574
3575 static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2)
3576 {
3577 if (!btf_equal_common(t1, t2))
3578 return false;
3579
3580 return btf_array(t1)->nelems == btf_array(t2)->nelems;
3581 }
3582
3583
3584
3585
3586
3587
3588 static long btf_hash_fnproto(struct btf_type *t)
3589 {
3590 const struct btf_param *member = btf_params(t);
3591 __u16 vlen = btf_vlen(t);
3592 long h = btf_hash_common(t);
3593 int i;
3594
3595 for (i = 0; i < vlen; i++) {
3596 h = hash_combine(h, member->name_off);
3597 h = hash_combine(h, member->type);
3598 member++;
3599 }
3600 return h;
3601 }
3602
3603
3604
3605
3606
3607
3608
3609
3610 static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2)
3611 {
3612 const struct btf_param *m1, *m2;
3613 __u16 vlen;
3614 int i;
3615
3616 if (!btf_equal_common(t1, t2))
3617 return false;
3618
3619 vlen = btf_vlen(t1);
3620 m1 = btf_params(t1);
3621 m2 = btf_params(t2);
3622 for (i = 0; i < vlen; i++) {
3623 if (m1->name_off != m2->name_off || m1->type != m2->type)
3624 return false;
3625 m1++;
3626 m2++;
3627 }
3628 return true;
3629 }
3630
3631
3632
3633
3634
3635
3636 static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2)
3637 {
3638 const struct btf_param *m1, *m2;
3639 __u16 vlen;
3640 int i;
3641
3642
3643 if (t1->name_off != t2->name_off || t1->info != t2->info)
3644 return false;
3645
3646 vlen = btf_vlen(t1);
3647 m1 = btf_params(t1);
3648 m2 = btf_params(t2);
3649 for (i = 0; i < vlen; i++) {
3650 if (m1->name_off != m2->name_off)
3651 return false;
3652 m1++;
3653 m2++;
3654 }
3655 return true;
3656 }
3657
3658
3659
3660
3661
3662 static int btf_dedup_prep(struct btf_dedup *d)
3663 {
3664 struct btf_type *t;
3665 int type_id;
3666 long h;
3667
3668 if (!d->btf->base_btf)
3669 return 0;
3670
3671 for (type_id = 1; type_id < d->btf->start_id; type_id++) {
3672 t = btf_type_by_id(d->btf, type_id);
3673
3674
3675 d->map[type_id] = type_id;
3676
3677 switch (btf_kind(t)) {
3678 case BTF_KIND_VAR:
3679 case BTF_KIND_DATASEC:
3680
3681 continue;
3682 case BTF_KIND_CONST:
3683 case BTF_KIND_VOLATILE:
3684 case BTF_KIND_RESTRICT:
3685 case BTF_KIND_PTR:
3686 case BTF_KIND_FWD:
3687 case BTF_KIND_TYPEDEF:
3688 case BTF_KIND_FUNC:
3689 case BTF_KIND_FLOAT:
3690 case BTF_KIND_TYPE_TAG:
3691 h = btf_hash_common(t);
3692 break;
3693 case BTF_KIND_INT:
3694 case BTF_KIND_DECL_TAG:
3695 h = btf_hash_int_decl_tag(t);
3696 break;
3697 case BTF_KIND_ENUM:
3698 case BTF_KIND_ENUM64:
3699 h = btf_hash_enum(t);
3700 break;
3701 case BTF_KIND_STRUCT:
3702 case BTF_KIND_UNION:
3703 h = btf_hash_struct(t);
3704 break;
3705 case BTF_KIND_ARRAY:
3706 h = btf_hash_array(t);
3707 break;
3708 case BTF_KIND_FUNC_PROTO:
3709 h = btf_hash_fnproto(t);
3710 break;
3711 default:
3712 pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id);
3713 return -EINVAL;
3714 }
3715 if (btf_dedup_table_add(d, h, type_id))
3716 return -ENOMEM;
3717 }
3718
3719 return 0;
3720 }
3721
3722
3723
3724
3725
3726
3727
3728 static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id)
3729 {
3730 struct btf_type *t = btf_type_by_id(d->btf, type_id);
3731 struct hashmap_entry *hash_entry;
3732 struct btf_type *cand;
3733
3734 __u32 new_id = type_id;
3735 __u32 cand_id;
3736 long h;
3737
3738 switch (btf_kind(t)) {
3739 case BTF_KIND_CONST:
3740 case BTF_KIND_VOLATILE:
3741 case BTF_KIND_RESTRICT:
3742 case BTF_KIND_PTR:
3743 case BTF_KIND_TYPEDEF:
3744 case BTF_KIND_ARRAY:
3745 case BTF_KIND_STRUCT:
3746 case BTF_KIND_UNION:
3747 case BTF_KIND_FUNC:
3748 case BTF_KIND_FUNC_PROTO:
3749 case BTF_KIND_VAR:
3750 case BTF_KIND_DATASEC:
3751 case BTF_KIND_DECL_TAG:
3752 case BTF_KIND_TYPE_TAG:
3753 return 0;
3754
3755 case BTF_KIND_INT:
3756 h = btf_hash_int_decl_tag(t);
3757 for_each_dedup_cand(d, hash_entry, h) {
3758 cand_id = (__u32)(long)hash_entry->value;
3759 cand = btf_type_by_id(d->btf, cand_id);
3760 if (btf_equal_int_tag(t, cand)) {
3761 new_id = cand_id;
3762 break;
3763 }
3764 }
3765 break;
3766
3767 case BTF_KIND_ENUM:
3768 h = btf_hash_enum(t);
3769 for_each_dedup_cand(d, hash_entry, h) {
3770 cand_id = (__u32)(long)hash_entry->value;
3771 cand = btf_type_by_id(d->btf, cand_id);
3772 if (btf_equal_enum(t, cand)) {
3773 new_id = cand_id;
3774 break;
3775 }
3776 if (btf_compat_enum(t, cand)) {
3777 if (btf_is_enum_fwd(t)) {
3778
3779 new_id = cand_id;
3780 break;
3781 }
3782
3783 d->map[cand_id] = type_id;
3784 }
3785 }
3786 break;
3787
3788 case BTF_KIND_ENUM64:
3789 h = btf_hash_enum(t);
3790 for_each_dedup_cand(d, hash_entry, h) {
3791 cand_id = (__u32)(long)hash_entry->value;
3792 cand = btf_type_by_id(d->btf, cand_id);
3793 if (btf_equal_enum64(t, cand)) {
3794 new_id = cand_id;
3795 break;
3796 }
3797 if (btf_compat_enum64(t, cand)) {
3798 if (btf_is_enum_fwd(t)) {
3799
3800 new_id = cand_id;
3801 break;
3802 }
3803
3804 d->map[cand_id] = type_id;
3805 }
3806 }
3807 break;
3808
3809 case BTF_KIND_FWD:
3810 case BTF_KIND_FLOAT:
3811 h = btf_hash_common(t);
3812 for_each_dedup_cand(d, hash_entry, h) {
3813 cand_id = (__u32)(long)hash_entry->value;
3814 cand = btf_type_by_id(d->btf, cand_id);
3815 if (btf_equal_common(t, cand)) {
3816 new_id = cand_id;
3817 break;
3818 }
3819 }
3820 break;
3821
3822 default:
3823 return -EINVAL;
3824 }
3825
3826 d->map[type_id] = new_id;
3827 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
3828 return -ENOMEM;
3829
3830 return 0;
3831 }
3832
3833 static int btf_dedup_prim_types(struct btf_dedup *d)
3834 {
3835 int i, err;
3836
3837 for (i = 0; i < d->btf->nr_types; i++) {
3838 err = btf_dedup_prim_type(d, d->btf->start_id + i);
3839 if (err)
3840 return err;
3841 }
3842 return 0;
3843 }
3844
3845
3846
3847
3848 static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id)
3849 {
3850 return d->map[type_id] <= BTF_MAX_NR_TYPES;
3851 }
3852
3853
3854
3855
3856
3857
3858 static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id)
3859 {
3860 while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3861 type_id = d->map[type_id];
3862 return type_id;
3863 }
3864
3865
3866
3867
3868
3869 static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id)
3870 {
3871 __u32 orig_type_id = type_id;
3872
3873 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3874 return type_id;
3875
3876 while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3877 type_id = d->map[type_id];
3878
3879 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3880 return type_id;
3881
3882 return orig_type_id;
3883 }
3884
3885
3886 static inline __u16 btf_fwd_kind(struct btf_type *t)
3887 {
3888 return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT;
3889 }
3890
3891
3892 static int btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2)
3893 {
3894 struct btf_type *t1, *t2;
3895
3896 t1 = btf_type_by_id(d->btf, id1);
3897 t2 = btf_type_by_id(d->btf, id2);
3898 if (!btf_is_array(t1) || !btf_is_array(t2))
3899 return 0;
3900
3901 return btf_equal_array(t1, t2);
3902 }
3903
3904
3905 static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2)
3906 {
3907 const struct btf_member *m1, *m2;
3908 struct btf_type *t1, *t2;
3909 int n, i;
3910
3911 t1 = btf_type_by_id(d->btf, id1);
3912 t2 = btf_type_by_id(d->btf, id2);
3913
3914 if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2))
3915 return false;
3916
3917 if (!btf_shallow_equal_struct(t1, t2))
3918 return false;
3919
3920 m1 = btf_members(t1);
3921 m2 = btf_members(t2);
3922 for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) {
3923 if (m1->type != m2->type)
3924 return false;
3925 }
3926 return true;
3927 }
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022 static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id,
4023 __u32 canon_id)
4024 {
4025 struct btf_type *cand_type;
4026 struct btf_type *canon_type;
4027 __u32 hypot_type_id;
4028 __u16 cand_kind;
4029 __u16 canon_kind;
4030 int i, eq;
4031
4032
4033 if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id))
4034 return 1;
4035
4036 canon_id = resolve_fwd_id(d, canon_id);
4037
4038 hypot_type_id = d->hypot_map[canon_id];
4039 if (hypot_type_id <= BTF_MAX_NR_TYPES) {
4040 if (hypot_type_id == cand_id)
4041 return 1;
4042
4043
4044
4045
4046
4047
4048
4049
4050 if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id))
4051 return 1;
4052
4053
4054
4055
4056
4057
4058
4059 if (btf_dedup_identical_structs(d, hypot_type_id, cand_id))
4060 return 1;
4061 return 0;
4062 }
4063
4064 if (btf_dedup_hypot_map_add(d, canon_id, cand_id))
4065 return -ENOMEM;
4066
4067 cand_type = btf_type_by_id(d->btf, cand_id);
4068 canon_type = btf_type_by_id(d->btf, canon_id);
4069 cand_kind = btf_kind(cand_type);
4070 canon_kind = btf_kind(canon_type);
4071
4072 if (cand_type->name_off != canon_type->name_off)
4073 return 0;
4074
4075
4076 if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD)
4077 && cand_kind != canon_kind) {
4078 __u16 real_kind;
4079 __u16 fwd_kind;
4080
4081 if (cand_kind == BTF_KIND_FWD) {
4082 real_kind = canon_kind;
4083 fwd_kind = btf_fwd_kind(cand_type);
4084 } else {
4085 real_kind = cand_kind;
4086 fwd_kind = btf_fwd_kind(canon_type);
4087
4088 if (fwd_kind == real_kind && canon_id < d->btf->start_id)
4089 d->hypot_adjust_canon = true;
4090 }
4091 return fwd_kind == real_kind;
4092 }
4093
4094 if (cand_kind != canon_kind)
4095 return 0;
4096
4097 switch (cand_kind) {
4098 case BTF_KIND_INT:
4099 return btf_equal_int_tag(cand_type, canon_type);
4100
4101 case BTF_KIND_ENUM:
4102 return btf_compat_enum(cand_type, canon_type);
4103
4104 case BTF_KIND_ENUM64:
4105 return btf_compat_enum64(cand_type, canon_type);
4106
4107 case BTF_KIND_FWD:
4108 case BTF_KIND_FLOAT:
4109 return btf_equal_common(cand_type, canon_type);
4110
4111 case BTF_KIND_CONST:
4112 case BTF_KIND_VOLATILE:
4113 case BTF_KIND_RESTRICT:
4114 case BTF_KIND_PTR:
4115 case BTF_KIND_TYPEDEF:
4116 case BTF_KIND_FUNC:
4117 case BTF_KIND_TYPE_TAG:
4118 if (cand_type->info != canon_type->info)
4119 return 0;
4120 return btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4121
4122 case BTF_KIND_ARRAY: {
4123 const struct btf_array *cand_arr, *canon_arr;
4124
4125 if (!btf_compat_array(cand_type, canon_type))
4126 return 0;
4127 cand_arr = btf_array(cand_type);
4128 canon_arr = btf_array(canon_type);
4129 eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type);
4130 if (eq <= 0)
4131 return eq;
4132 return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type);
4133 }
4134
4135 case BTF_KIND_STRUCT:
4136 case BTF_KIND_UNION: {
4137 const struct btf_member *cand_m, *canon_m;
4138 __u16 vlen;
4139
4140 if (!btf_shallow_equal_struct(cand_type, canon_type))
4141 return 0;
4142 vlen = btf_vlen(cand_type);
4143 cand_m = btf_members(cand_type);
4144 canon_m = btf_members(canon_type);
4145 for (i = 0; i < vlen; i++) {
4146 eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type);
4147 if (eq <= 0)
4148 return eq;
4149 cand_m++;
4150 canon_m++;
4151 }
4152
4153 return 1;
4154 }
4155
4156 case BTF_KIND_FUNC_PROTO: {
4157 const struct btf_param *cand_p, *canon_p;
4158 __u16 vlen;
4159
4160 if (!btf_compat_fnproto(cand_type, canon_type))
4161 return 0;
4162 eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4163 if (eq <= 0)
4164 return eq;
4165 vlen = btf_vlen(cand_type);
4166 cand_p = btf_params(cand_type);
4167 canon_p = btf_params(canon_type);
4168 for (i = 0; i < vlen; i++) {
4169 eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type);
4170 if (eq <= 0)
4171 return eq;
4172 cand_p++;
4173 canon_p++;
4174 }
4175 return 1;
4176 }
4177
4178 default:
4179 return -EINVAL;
4180 }
4181 return 0;
4182 }
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210 static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
4211 {
4212 __u32 canon_type_id, targ_type_id;
4213 __u16 t_kind, c_kind;
4214 __u32 t_id, c_id;
4215 int i;
4216
4217 for (i = 0; i < d->hypot_cnt; i++) {
4218 canon_type_id = d->hypot_list[i];
4219 targ_type_id = d->hypot_map[canon_type_id];
4220 t_id = resolve_type_id(d, targ_type_id);
4221 c_id = resolve_type_id(d, canon_type_id);
4222 t_kind = btf_kind(btf__type_by_id(d->btf, t_id));
4223 c_kind = btf_kind(btf__type_by_id(d->btf, c_id));
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244 if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD)
4245 d->map[c_id] = t_id;
4246
4247
4248
4249
4250
4251
4252 if (d->hypot_adjust_canon)
4253 continue;
4254
4255 if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
4256 d->map[t_id] = c_id;
4257
4258 if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) &&
4259 c_kind != BTF_KIND_FWD &&
4260 is_type_mapped(d, c_id) &&
4261 !is_type_mapped(d, t_id)) {
4262
4263
4264
4265
4266
4267
4268 d->map[t_id] = c_id;
4269 }
4270 }
4271 }
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295 static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id)
4296 {
4297 struct btf_type *cand_type, *t;
4298 struct hashmap_entry *hash_entry;
4299
4300 __u32 new_id = type_id;
4301 __u16 kind;
4302 long h;
4303
4304
4305 if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4306 return 0;
4307
4308 t = btf_type_by_id(d->btf, type_id);
4309 kind = btf_kind(t);
4310
4311 if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4312 return 0;
4313
4314 h = btf_hash_struct(t);
4315 for_each_dedup_cand(d, hash_entry, h) {
4316 __u32 cand_id = (__u32)(long)hash_entry->value;
4317 int eq;
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329 cand_type = btf_type_by_id(d->btf, cand_id);
4330 if (!btf_shallow_equal_struct(t, cand_type))
4331 continue;
4332
4333 btf_dedup_clear_hypot_map(d);
4334 eq = btf_dedup_is_equiv(d, type_id, cand_id);
4335 if (eq < 0)
4336 return eq;
4337 if (!eq)
4338 continue;
4339 btf_dedup_merge_hypot_map(d);
4340 if (d->hypot_adjust_canon)
4341 continue;
4342 new_id = cand_id;
4343 break;
4344 }
4345
4346 d->map[type_id] = new_id;
4347 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4348 return -ENOMEM;
4349
4350 return 0;
4351 }
4352
4353 static int btf_dedup_struct_types(struct btf_dedup *d)
4354 {
4355 int i, err;
4356
4357 for (i = 0; i < d->btf->nr_types; i++) {
4358 err = btf_dedup_struct_type(d, d->btf->start_id + i);
4359 if (err)
4360 return err;
4361 }
4362 return 0;
4363 }
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389 static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id)
4390 {
4391 struct hashmap_entry *hash_entry;
4392 __u32 new_id = type_id, cand_id;
4393 struct btf_type *t, *cand;
4394
4395 int ref_type_id;
4396 long h;
4397
4398 if (d->map[type_id] == BTF_IN_PROGRESS_ID)
4399 return -ELOOP;
4400 if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4401 return resolve_type_id(d, type_id);
4402
4403 t = btf_type_by_id(d->btf, type_id);
4404 d->map[type_id] = BTF_IN_PROGRESS_ID;
4405
4406 switch (btf_kind(t)) {
4407 case BTF_KIND_CONST:
4408 case BTF_KIND_VOLATILE:
4409 case BTF_KIND_RESTRICT:
4410 case BTF_KIND_PTR:
4411 case BTF_KIND_TYPEDEF:
4412 case BTF_KIND_FUNC:
4413 case BTF_KIND_TYPE_TAG:
4414 ref_type_id = btf_dedup_ref_type(d, t->type);
4415 if (ref_type_id < 0)
4416 return ref_type_id;
4417 t->type = ref_type_id;
4418
4419 h = btf_hash_common(t);
4420 for_each_dedup_cand(d, hash_entry, h) {
4421 cand_id = (__u32)(long)hash_entry->value;
4422 cand = btf_type_by_id(d->btf, cand_id);
4423 if (btf_equal_common(t, cand)) {
4424 new_id = cand_id;
4425 break;
4426 }
4427 }
4428 break;
4429
4430 case BTF_KIND_DECL_TAG:
4431 ref_type_id = btf_dedup_ref_type(d, t->type);
4432 if (ref_type_id < 0)
4433 return ref_type_id;
4434 t->type = ref_type_id;
4435
4436 h = btf_hash_int_decl_tag(t);
4437 for_each_dedup_cand(d, hash_entry, h) {
4438 cand_id = (__u32)(long)hash_entry->value;
4439 cand = btf_type_by_id(d->btf, cand_id);
4440 if (btf_equal_int_tag(t, cand)) {
4441 new_id = cand_id;
4442 break;
4443 }
4444 }
4445 break;
4446
4447 case BTF_KIND_ARRAY: {
4448 struct btf_array *info = btf_array(t);
4449
4450 ref_type_id = btf_dedup_ref_type(d, info->type);
4451 if (ref_type_id < 0)
4452 return ref_type_id;
4453 info->type = ref_type_id;
4454
4455 ref_type_id = btf_dedup_ref_type(d, info->index_type);
4456 if (ref_type_id < 0)
4457 return ref_type_id;
4458 info->index_type = ref_type_id;
4459
4460 h = btf_hash_array(t);
4461 for_each_dedup_cand(d, hash_entry, h) {
4462 cand_id = (__u32)(long)hash_entry->value;
4463 cand = btf_type_by_id(d->btf, cand_id);
4464 if (btf_equal_array(t, cand)) {
4465 new_id = cand_id;
4466 break;
4467 }
4468 }
4469 break;
4470 }
4471
4472 case BTF_KIND_FUNC_PROTO: {
4473 struct btf_param *param;
4474 __u16 vlen;
4475 int i;
4476
4477 ref_type_id = btf_dedup_ref_type(d, t->type);
4478 if (ref_type_id < 0)
4479 return ref_type_id;
4480 t->type = ref_type_id;
4481
4482 vlen = btf_vlen(t);
4483 param = btf_params(t);
4484 for (i = 0; i < vlen; i++) {
4485 ref_type_id = btf_dedup_ref_type(d, param->type);
4486 if (ref_type_id < 0)
4487 return ref_type_id;
4488 param->type = ref_type_id;
4489 param++;
4490 }
4491
4492 h = btf_hash_fnproto(t);
4493 for_each_dedup_cand(d, hash_entry, h) {
4494 cand_id = (__u32)(long)hash_entry->value;
4495 cand = btf_type_by_id(d->btf, cand_id);
4496 if (btf_equal_fnproto(t, cand)) {
4497 new_id = cand_id;
4498 break;
4499 }
4500 }
4501 break;
4502 }
4503
4504 default:
4505 return -EINVAL;
4506 }
4507
4508 d->map[type_id] = new_id;
4509 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4510 return -ENOMEM;
4511
4512 return new_id;
4513 }
4514
4515 static int btf_dedup_ref_types(struct btf_dedup *d)
4516 {
4517 int i, err;
4518
4519 for (i = 0; i < d->btf->nr_types; i++) {
4520 err = btf_dedup_ref_type(d, d->btf->start_id + i);
4521 if (err < 0)
4522 return err;
4523 }
4524
4525 hashmap__free(d->dedup_table);
4526 d->dedup_table = NULL;
4527 return 0;
4528 }
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541 static int btf_dedup_compact_types(struct btf_dedup *d)
4542 {
4543 __u32 *new_offs;
4544 __u32 next_type_id = d->btf->start_id;
4545 const struct btf_type *t;
4546 void *p;
4547 int i, id, len;
4548
4549
4550 d->hypot_map[0] = 0;
4551
4552 for (id = 1; id < d->btf->start_id; id++)
4553 d->hypot_map[id] = id;
4554 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++)
4555 d->hypot_map[id] = BTF_UNPROCESSED_ID;
4556
4557 p = d->btf->types_data;
4558
4559 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) {
4560 if (d->map[id] != id)
4561 continue;
4562
4563 t = btf__type_by_id(d->btf, id);
4564 len = btf_type_size(t);
4565 if (len < 0)
4566 return len;
4567
4568 memmove(p, t, len);
4569 d->hypot_map[id] = next_type_id;
4570 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data;
4571 p += len;
4572 next_type_id++;
4573 }
4574
4575
4576 d->btf->nr_types = next_type_id - d->btf->start_id;
4577 d->btf->type_offs_cap = d->btf->nr_types;
4578 d->btf->hdr->type_len = p - d->btf->types_data;
4579 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap,
4580 sizeof(*new_offs));
4581 if (d->btf->type_offs_cap && !new_offs)
4582 return -ENOMEM;
4583 d->btf->type_offs = new_offs;
4584 d->btf->hdr->str_off = d->btf->hdr->type_len;
4585 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len;
4586 return 0;
4587 }
4588
4589
4590
4591
4592
4593
4594
4595 static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx)
4596 {
4597 struct btf_dedup *d = ctx;
4598 __u32 resolved_type_id, new_type_id;
4599
4600 resolved_type_id = resolve_type_id(d, *type_id);
4601 new_type_id = d->hypot_map[resolved_type_id];
4602 if (new_type_id > BTF_MAX_NR_TYPES)
4603 return -EINVAL;
4604
4605 *type_id = new_type_id;
4606 return 0;
4607 }
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619 static int btf_dedup_remap_types(struct btf_dedup *d)
4620 {
4621 int i, r;
4622
4623 for (i = 0; i < d->btf->nr_types; i++) {
4624 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
4625
4626 r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d);
4627 if (r)
4628 return r;
4629 }
4630
4631 if (!d->btf_ext)
4632 return 0;
4633
4634 r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
4635 if (r)
4636 return r;
4637
4638 return 0;
4639 }
4640
4641
4642
4643
4644
4645 struct btf *btf__load_vmlinux_btf(void)
4646 {
4647 struct {
4648 const char *path_fmt;
4649 bool raw_btf;
4650 } locations[] = {
4651
4652 { "/sys/kernel/btf/vmlinux", true },
4653
4654 { "/boot/vmlinux-%1$s" },
4655 { "/lib/modules/%1$s/vmlinux-%1$s" },
4656 { "/lib/modules/%1$s/build/vmlinux" },
4657 { "/usr/lib/modules/%1$s/kernel/vmlinux" },
4658 { "/usr/lib/debug/boot/vmlinux-%1$s" },
4659 { "/usr/lib/debug/boot/vmlinux-%1$s.debug" },
4660 { "/usr/lib/debug/lib/modules/%1$s/vmlinux" },
4661 };
4662 char path[PATH_MAX + 1];
4663 struct utsname buf;
4664 struct btf *btf;
4665 int i, err;
4666
4667 uname(&buf);
4668
4669 for (i = 0; i < ARRAY_SIZE(locations); i++) {
4670 snprintf(path, PATH_MAX, locations[i].path_fmt, buf.release);
4671
4672 if (access(path, R_OK))
4673 continue;
4674
4675 if (locations[i].raw_btf)
4676 btf = btf__parse_raw(path);
4677 else
4678 btf = btf__parse_elf(path, NULL);
4679 err = libbpf_get_error(btf);
4680 pr_debug("loading kernel BTF '%s': %d\n", path, err);
4681 if (err)
4682 continue;
4683
4684 return btf;
4685 }
4686
4687 pr_warn("failed to find valid kernel BTF\n");
4688 return libbpf_err_ptr(-ESRCH);
4689 }
4690
4691 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
4692
4693 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf)
4694 {
4695 char path[80];
4696
4697 snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name);
4698 return btf__parse_split(path, vmlinux_btf);
4699 }
4700
4701 int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
4702 {
4703 int i, n, err;
4704
4705 switch (btf_kind(t)) {
4706 case BTF_KIND_INT:
4707 case BTF_KIND_FLOAT:
4708 case BTF_KIND_ENUM:
4709 case BTF_KIND_ENUM64:
4710 return 0;
4711
4712 case BTF_KIND_FWD:
4713 case BTF_KIND_CONST:
4714 case BTF_KIND_VOLATILE:
4715 case BTF_KIND_RESTRICT:
4716 case BTF_KIND_PTR:
4717 case BTF_KIND_TYPEDEF:
4718 case BTF_KIND_FUNC:
4719 case BTF_KIND_VAR:
4720 case BTF_KIND_DECL_TAG:
4721 case BTF_KIND_TYPE_TAG:
4722 return visit(&t->type, ctx);
4723
4724 case BTF_KIND_ARRAY: {
4725 struct btf_array *a = btf_array(t);
4726
4727 err = visit(&a->type, ctx);
4728 err = err ?: visit(&a->index_type, ctx);
4729 return err;
4730 }
4731
4732 case BTF_KIND_STRUCT:
4733 case BTF_KIND_UNION: {
4734 struct btf_member *m = btf_members(t);
4735
4736 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4737 err = visit(&m->type, ctx);
4738 if (err)
4739 return err;
4740 }
4741 return 0;
4742 }
4743
4744 case BTF_KIND_FUNC_PROTO: {
4745 struct btf_param *m = btf_params(t);
4746
4747 err = visit(&t->type, ctx);
4748 if (err)
4749 return err;
4750 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4751 err = visit(&m->type, ctx);
4752 if (err)
4753 return err;
4754 }
4755 return 0;
4756 }
4757
4758 case BTF_KIND_DATASEC: {
4759 struct btf_var_secinfo *m = btf_var_secinfos(t);
4760
4761 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4762 err = visit(&m->type, ctx);
4763 if (err)
4764 return err;
4765 }
4766 return 0;
4767 }
4768
4769 default:
4770 return -EINVAL;
4771 }
4772 }
4773
4774 int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx)
4775 {
4776 int i, n, err;
4777
4778 err = visit(&t->name_off, ctx);
4779 if (err)
4780 return err;
4781
4782 switch (btf_kind(t)) {
4783 case BTF_KIND_STRUCT:
4784 case BTF_KIND_UNION: {
4785 struct btf_member *m = btf_members(t);
4786
4787 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4788 err = visit(&m->name_off, ctx);
4789 if (err)
4790 return err;
4791 }
4792 break;
4793 }
4794 case BTF_KIND_ENUM: {
4795 struct btf_enum *m = btf_enum(t);
4796
4797 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4798 err = visit(&m->name_off, ctx);
4799 if (err)
4800 return err;
4801 }
4802 break;
4803 }
4804 case BTF_KIND_ENUM64: {
4805 struct btf_enum64 *m = btf_enum64(t);
4806
4807 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4808 err = visit(&m->name_off, ctx);
4809 if (err)
4810 return err;
4811 }
4812 break;
4813 }
4814 case BTF_KIND_FUNC_PROTO: {
4815 struct btf_param *m = btf_params(t);
4816
4817 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4818 err = visit(&m->name_off, ctx);
4819 if (err)
4820 return err;
4821 }
4822 break;
4823 }
4824 default:
4825 break;
4826 }
4827
4828 return 0;
4829 }
4830
4831 int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
4832 {
4833 const struct btf_ext_info *seg;
4834 struct btf_ext_info_sec *sec;
4835 int i, err;
4836
4837 seg = &btf_ext->func_info;
4838 for_each_btf_ext_sec(seg, sec) {
4839 struct bpf_func_info_min *rec;
4840
4841 for_each_btf_ext_rec(seg, sec, i, rec) {
4842 err = visit(&rec->type_id, ctx);
4843 if (err < 0)
4844 return err;
4845 }
4846 }
4847
4848 seg = &btf_ext->core_relo_info;
4849 for_each_btf_ext_sec(seg, sec) {
4850 struct bpf_core_relo *rec;
4851
4852 for_each_btf_ext_rec(seg, sec, i, rec) {
4853 err = visit(&rec->type_id, ctx);
4854 if (err < 0)
4855 return err;
4856 }
4857 }
4858
4859 return 0;
4860 }
4861
4862 int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
4863 {
4864 const struct btf_ext_info *seg;
4865 struct btf_ext_info_sec *sec;
4866 int i, err;
4867
4868 seg = &btf_ext->func_info;
4869 for_each_btf_ext_sec(seg, sec) {
4870 err = visit(&sec->sec_name_off, ctx);
4871 if (err)
4872 return err;
4873 }
4874
4875 seg = &btf_ext->line_info;
4876 for_each_btf_ext_sec(seg, sec) {
4877 struct bpf_line_info_min *rec;
4878
4879 err = visit(&sec->sec_name_off, ctx);
4880 if (err)
4881 return err;
4882
4883 for_each_btf_ext_rec(seg, sec, i, rec) {
4884 err = visit(&rec->file_name_off, ctx);
4885 if (err)
4886 return err;
4887 err = visit(&rec->line_off, ctx);
4888 if (err)
4889 return err;
4890 }
4891 }
4892
4893 seg = &btf_ext->core_relo_info;
4894 for_each_btf_ext_sec(seg, sec) {
4895 struct bpf_core_relo *rec;
4896
4897 err = visit(&sec->sec_name_off, ctx);
4898 if (err)
4899 return err;
4900
4901 for_each_btf_ext_rec(seg, sec, i, rec) {
4902 err = visit(&rec->access_str_off, ctx);
4903 if (err)
4904 return err;
4905 }
4906 }
4907
4908 return 0;
4909 }