Lines Matching refs:btf

32 struct btf {  struct
98 struct btf *base_btf; argument
196 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt) in btf_add_type_offs_mem() argument
198 return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), in btf_add_type_offs_mem()
199 btf->nr_types, BTF_MAX_NR_TYPES, add_cnt); in btf_add_type_offs_mem()
202 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) in btf_add_type_idx_entry() argument
206 p = btf_add_type_offs_mem(btf, 1); in btf_add_type_idx_entry()
224 static int btf_parse_hdr(struct btf *btf) in btf_parse_hdr() argument
226 struct btf_header *hdr = btf->hdr; in btf_parse_hdr()
229 if (btf->raw_size < sizeof(struct btf_header)) { in btf_parse_hdr()
235 btf->swapped_endian = true; in btf_parse_hdr()
247 if (btf->raw_size < hdr->hdr_len) { in btf_parse_hdr()
249 hdr->hdr_len, btf->raw_size); in btf_parse_hdr()
253 meta_left = btf->raw_size - hdr->hdr_len; in btf_parse_hdr()
255 pr_debug("Invalid BTF total size: %u\n", btf->raw_size); in btf_parse_hdr()
273 static int btf_parse_str_sec(struct btf *btf) in btf_parse_str_sec() argument
275 const struct btf_header *hdr = btf->hdr; in btf_parse_str_sec()
276 const char *start = btf->strs_data; in btf_parse_str_sec()
277 const char *end = start + btf->hdr->str_len; in btf_parse_str_sec()
279 if (btf->base_btf && hdr->str_len == 0) in btf_parse_str_sec()
285 if (!btf->base_btf && start[0]) { in btf_parse_str_sec()
417 static int btf_parse_type_sec(struct btf *btf) in btf_parse_type_sec() argument
419 struct btf_header *hdr = btf->hdr; in btf_parse_type_sec()
420 void *next_type = btf->types_data; in btf_parse_type_sec()
425 if (btf->swapped_endian) in btf_parse_type_sec()
432 pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types); in btf_parse_type_sec()
436 if (btf->swapped_endian && btf_bswap_type_rest(next_type)) in btf_parse_type_sec()
439 err = btf_add_type_idx_entry(btf, next_type - btf->types_data); in btf_parse_type_sec()
444 btf->nr_types++; in btf_parse_type_sec()
455 static int btf_validate_str(const struct btf *btf, __u32 str_off, const char *what, __u32 type_id) in btf_validate_str() argument
459 s = btf__str_by_offset(btf, str_off); in btf_validate_str()
468 static int btf_validate_id(const struct btf *btf, __u32 id, __u32 ctx_id) in btf_validate_id() argument
472 t = btf__type_by_id(btf, id); in btf_validate_id()
481 static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id) in btf_validate_type() argument
486 err = btf_validate_str(btf, t->name_off, "type name", id); in btf_validate_type()
504 err = btf_validate_id(btf, t->type, id); in btf_validate_type()
511 err = btf_validate_id(btf, a->type, id); in btf_validate_type()
512 err = err ?: btf_validate_id(btf, a->index_type, id); in btf_validate_type()
523 err = btf_validate_str(btf, m->name_off, "field name", id); in btf_validate_type()
524 err = err ?: btf_validate_id(btf, m->type, id); in btf_validate_type()
535 err = btf_validate_str(btf, m->name_off, "enum name", id); in btf_validate_type()
546 err = btf_validate_str(btf, m->name_off, "enum name", id); in btf_validate_type()
555 err = btf_validate_id(btf, t->type, id); in btf_validate_type()
558 ft = btf__type_by_id(btf, t->type); in btf_validate_type()
570 err = btf_validate_str(btf, m->name_off, "param name", id); in btf_validate_type()
571 err = err ?: btf_validate_id(btf, m->type, id); in btf_validate_type()
582 err = btf_validate_id(btf, m->type, id); in btf_validate_type()
599 static int btf_sanity_check(const struct btf *btf) in btf_sanity_check() argument
602 __u32 i, n = btf__type_cnt(btf); in btf_sanity_check()
605 for (i = btf->start_id; i < n; i++) { in btf_sanity_check()
606 t = btf_type_by_id(btf, i); in btf_sanity_check()
607 err = btf_validate_type(btf, t, i); in btf_sanity_check()
614 __u32 btf__type_cnt(const struct btf *btf) in btf__type_cnt() argument
616 return btf->start_id + btf->nr_types; in btf__type_cnt()
619 const struct btf *btf__base_btf(const struct btf *btf) in btf__base_btf() argument
621 return btf->base_btf; in btf__base_btf()
625 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id) in btf_type_by_id() argument
629 if (type_id < btf->start_id) in btf_type_by_id()
630 return btf_type_by_id(btf->base_btf, type_id); in btf_type_by_id()
631 return btf->types_data + btf->type_offs[type_id - btf->start_id]; in btf_type_by_id()
634 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) in btf__type_by_id() argument
636 if (type_id >= btf->start_id + btf->nr_types) in btf__type_by_id()
638 return btf_type_by_id((struct btf *)btf, type_id); in btf__type_by_id()
641 static int determine_ptr_size(const struct btf *btf) in determine_ptr_size() argument
660 if (btf->base_btf && btf->base_btf->ptr_sz > 0) in determine_ptr_size()
661 return btf->base_btf->ptr_sz; in determine_ptr_size()
663 n = btf__type_cnt(btf); in determine_ptr_size()
665 t = btf__type_by_id(btf, i); in determine_ptr_size()
672 name = btf__name_by_offset(btf, t->name_off); in determine_ptr_size()
685 static size_t btf_ptr_sz(const struct btf *btf) in btf_ptr_sz() argument
687 if (!btf->ptr_sz) in btf_ptr_sz()
688 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf_ptr_sz()
689 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; in btf_ptr_sz()
700 size_t btf__pointer_size(const struct btf *btf) in btf__pointer_size() argument
702 if (!btf->ptr_sz) in btf__pointer_size()
703 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf__pointer_size()
705 if (btf->ptr_sz < 0) in btf__pointer_size()
709 return btf->ptr_sz; in btf__pointer_size()
715 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) in btf__set_pointer_size() argument
719 btf->ptr_sz = ptr_sz; in btf__set_pointer_size()
734 enum btf_endianness btf__endianness(const struct btf *btf) in btf__endianness() argument
737 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; in btf__endianness()
739 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; in btf__endianness()
742 int btf__set_endianness(struct btf *btf, enum btf_endianness endian) in btf__set_endianness() argument
747 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); in btf__set_endianness()
748 if (!btf->swapped_endian) { in btf__set_endianness()
749 free(btf->raw_data_swapped); in btf__set_endianness()
750 btf->raw_data_swapped = NULL; in btf__set_endianness()
767 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) in btf__resolve_size() argument
775 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
788 size = btf_ptr_sz(btf); in btf__resolve_size()
810 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
822 int btf__align_of(const struct btf *btf, __u32 id) in btf__align_of() argument
824 const struct btf_type *t = btf__type_by_id(btf, id); in btf__align_of()
832 return min(btf_ptr_sz(btf), (size_t)t->size); in btf__align_of()
834 return btf_ptr_sz(btf); in btf__align_of()
840 return btf__align_of(btf, t->type); in btf__align_of()
842 return btf__align_of(btf, btf_array(t)->type); in btf__align_of()
850 align = btf__align_of(btf, m->type); in btf__align_of()
877 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
882 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
887 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
897 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
899 __u32 i, nr_types = btf__type_cnt(btf); in btf__find_by_name()
905 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
906 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
915 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, in btf_find_by_name_kind() argument
918 __u32 i, nr_types = btf__type_cnt(btf); in btf_find_by_name_kind()
924 const struct btf_type *t = btf__type_by_id(btf, i); in btf_find_by_name_kind()
929 name = btf__name_by_offset(btf, t->name_off); in btf_find_by_name_kind()
937 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, in btf__find_by_name_kind_own() argument
940 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); in btf__find_by_name_kind_own()
943 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
946 return btf_find_by_name_kind(btf, 1, type_name, kind); in btf__find_by_name_kind()
949 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
951 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
954 void btf__free(struct btf *btf) in btf__free() argument
956 if (IS_ERR_OR_NULL(btf)) in btf__free()
959 if (btf->fd >= 0) in btf__free()
960 close(btf->fd); in btf__free()
962 if (btf_is_modifiable(btf)) { in btf__free()
969 free(btf->hdr); in btf__free()
970 free(btf->types_data); in btf__free()
971 strset__free(btf->strs_set); in btf__free()
973 free(btf->raw_data); in btf__free()
974 free(btf->raw_data_swapped); in btf__free()
975 free(btf->type_offs); in btf__free()
976 if (btf->owns_base) in btf__free()
977 btf__free(btf->base_btf); in btf__free()
978 free(btf); in btf__free()
981 static struct btf *btf_new_empty(struct btf *base_btf) in btf_new_empty()
983 struct btf *btf; in btf_new_empty() local
985 btf = calloc(1, sizeof(*btf)); in btf_new_empty()
986 if (!btf) in btf_new_empty()
989 btf->nr_types = 0; in btf_new_empty()
990 btf->start_id = 1; in btf_new_empty()
991 btf->start_str_off = 0; in btf_new_empty()
992 btf->fd = -1; in btf_new_empty()
993 btf->ptr_sz = sizeof(void *); in btf_new_empty()
994 btf->swapped_endian = false; in btf_new_empty()
997 btf->base_btf = base_btf; in btf_new_empty()
998 btf->start_id = btf__type_cnt(base_btf); in btf_new_empty()
999 btf->start_str_off = base_btf->hdr->str_len; in btf_new_empty()
1000 btf->swapped_endian = base_btf->swapped_endian; in btf_new_empty()
1004 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); in btf_new_empty()
1005 btf->raw_data = calloc(1, btf->raw_size); in btf_new_empty()
1006 if (!btf->raw_data) { in btf_new_empty()
1007 free(btf); in btf_new_empty()
1011 btf->hdr = btf->raw_data; in btf_new_empty()
1012 btf->hdr->hdr_len = sizeof(struct btf_header); in btf_new_empty()
1013 btf->hdr->magic = BTF_MAGIC; in btf_new_empty()
1014 btf->hdr->version = BTF_VERSION; in btf_new_empty()
1016 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
1017 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
1018 btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ in btf_new_empty()
1020 return btf; in btf_new_empty()
1023 struct btf *btf__new_empty(void) in btf__new_empty()
1028 struct btf *btf__new_empty_split(struct btf *base_btf) in btf__new_empty_split()
1033 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf) in btf_new()
1035 struct btf *btf; in btf_new() local
1038 btf = calloc(1, sizeof(struct btf)); in btf_new()
1039 if (!btf) in btf_new()
1042 btf->nr_types = 0; in btf_new()
1043 btf->start_id = 1; in btf_new()
1044 btf->start_str_off = 0; in btf_new()
1045 btf->fd = -1; in btf_new()
1048 btf->base_btf = base_btf; in btf_new()
1049 btf->start_id = btf__type_cnt(base_btf); in btf_new()
1050 btf->start_str_off = base_btf->hdr->str_len; in btf_new()
1053 btf->raw_data = malloc(size); in btf_new()
1054 if (!btf->raw_data) { in btf_new()
1058 memcpy(btf->raw_data, data, size); in btf_new()
1059 btf->raw_size = size; in btf_new()
1061 btf->hdr = btf->raw_data; in btf_new()
1062 err = btf_parse_hdr(btf); in btf_new()
1066 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf_new()
1067 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf_new()
1069 err = btf_parse_str_sec(btf); in btf_new()
1070 err = err ?: btf_parse_type_sec(btf); in btf_new()
1071 err = err ?: btf_sanity_check(btf); in btf_new()
1077 btf__free(btf); in btf_new()
1081 return btf; in btf_new()
1084 struct btf *btf__new(const void *data, __u32 size) in btf__new()
1089 struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf) in btf__new_split()
1166 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, in btf_parse_elf()
1170 struct btf *dist_base_btf = NULL; in btf_parse_elf()
1171 struct btf *btf = NULL; in btf_parse_elf() local
1214 btf = btf_new(secs.btf_data->d_buf, secs.btf_data->d_size, in btf_parse_elf()
1216 if (IS_ERR(btf)) { in btf_parse_elf()
1217 err = PTR_ERR(btf); in btf_parse_elf()
1221 err = btf__relocate(btf, base_btf); in btf_parse_elf()
1229 btf->owns_base = true; in btf_parse_elf()
1233 btf__set_pointer_size(btf, 4); in btf_parse_elf()
1236 btf__set_pointer_size(btf, 8); in btf_parse_elf()
1258 return btf; in btf_parse_elf()
1263 btf__free(btf); in btf_parse_elf()
1268 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
1273 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) in btf__parse_elf_split()
1278 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) in btf_parse_raw()
1280 struct btf *btf = NULL; in btf_parse_raw() local
1332 btf = btf_new(data, sz, base_btf); in btf_parse_raw()
1338 return err ? ERR_PTR(err) : btf; in btf_parse_raw()
1341 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
1346 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) in btf__parse_raw_split()
1351 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) in btf_parse()
1353 struct btf *btf; in btf_parse() local
1359 btf = btf_parse_raw(path, base_btf); in btf_parse()
1360 err = libbpf_get_error(btf); in btf_parse()
1362 return btf; in btf_parse()
1368 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
1373 struct btf *btf__parse_split(const char *path, struct btf *base_btf) in btf__parse_split()
1378 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1380 int btf_load_into_kernel(struct btf *btf, in btf_load_into_kernel() argument
1390 if (btf->fd >= 0) in btf_load_into_kernel()
1396 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf_load_into_kernel()
1401 btf->raw_size = raw_size; in btf_load_into_kernel()
1402 btf->raw_data = raw_data; in btf_load_into_kernel()
1436 btf->fd = bpf_btf_load(raw_data, raw_size, &opts); in btf_load_into_kernel()
1437 if (btf->fd < 0) { in btf_load_into_kernel()
1461 int btf__load_into_kernel(struct btf *btf) in btf__load_into_kernel() argument
1463 return btf_load_into_kernel(btf, NULL, 0, 0, 0); in btf__load_into_kernel()
1466 int btf__fd(const struct btf *btf) in btf__fd() argument
1468 return btf->fd; in btf__fd()
1471 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1473 btf->fd = fd; in btf__set_fd()
1476 static const void *btf_strs_data(const struct btf *btf) in btf_strs_data() argument
1478 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); in btf_strs_data()
1481 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1483 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1489 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1491 *size = btf->raw_size; in btf_get_raw_data()
1506 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1508 for (i = 0; i < btf->nr_types; i++) { in btf_get_raw_data()
1509 t = p + btf->type_offs[i]; in btf_get_raw_data()
1521 memcpy(p, btf_strs_data(btf), hdr->str_len); in btf_get_raw_data()
1531 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) in btf__raw_data()
1533 struct btf *btf = (struct btf *)btf_ro; in btf__raw_data() local
1537 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__raw_data()
1541 btf->raw_size = data_sz; in btf__raw_data()
1542 if (btf->swapped_endian) in btf__raw_data()
1543 btf->raw_data_swapped = data; in btf__raw_data()
1545 btf->raw_data = data; in btf__raw_data()
1551 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1553 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1555 if (offset < btf->start_str_off) in btf__str_by_offset()
1556 return btf__str_by_offset(btf->base_btf, offset); in btf__str_by_offset()
1557 else if (offset - btf->start_str_off < btf->hdr->str_len) in btf__str_by_offset()
1558 return btf_strs_data(btf) + (offset - btf->start_str_off); in btf__str_by_offset()
1563 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1565 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1568 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) in btf_get_from_fd()
1573 struct btf *btf; in btf_get_from_fd() local
1587 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1597 btf = ERR_PTR(-ENOMEM); in btf_get_from_fd()
1604 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1611 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); in btf_get_from_fd()
1615 btf = btf_new(ptr, btf_info.btf_size, base_btf); in btf_get_from_fd()
1619 return btf; in btf_get_from_fd()
1622 struct btf *btf_load_from_kernel(__u32 id, struct btf *base_btf, int token_fd) in btf_load_from_kernel()
1624 struct btf *btf; in btf_load_from_kernel() local
1637 btf = btf_get_from_fd(btf_fd, base_btf); in btf_load_from_kernel()
1640 return libbpf_ptr(btf); in btf_load_from_kernel()
1643 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) in btf__load_from_kernel_by_id_split()
1648 struct btf *btf__load_from_kernel_by_id(__u32 id) in btf__load_from_kernel_by_id()
1653 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1655 if (btf->raw_data) { in btf_invalidate_raw_data()
1656 free(btf->raw_data); in btf_invalidate_raw_data()
1657 btf->raw_data = NULL; in btf_invalidate_raw_data()
1659 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1660 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1661 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1669 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1675 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1677 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1682 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1683 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1687 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1688 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1691 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1698 btf->hdr = hdr; in btf_ensure_modifiable()
1699 btf->types_data = types; in btf_ensure_modifiable()
1700 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1701 btf->strs_data = NULL; in btf_ensure_modifiable()
1702 btf->strs_set = set; in btf_ensure_modifiable()
1706 if (btf->hdr->str_len == 0) in btf_ensure_modifiable()
1707 btf->strs_deduped = true; in btf_ensure_modifiable()
1708 if (!btf->base_btf && btf->hdr->str_len == 1) in btf_ensure_modifiable()
1709 btf->strs_deduped = true; in btf_ensure_modifiable()
1712 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1729 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1733 if (btf->base_btf) { in btf__find_str()
1734 off = btf__find_str(btf->base_btf, s); in btf__find_str()
1740 if (btf_ensure_modifiable(btf)) in btf__find_str()
1743 off = strset__find_str(btf->strs_set, s); in btf__find_str()
1747 return btf->start_str_off + off; in btf__find_str()
1755 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1759 if (btf->base_btf) { in btf__add_str()
1760 off = btf__find_str(btf->base_btf, s); in btf__add_str()
1765 if (btf_ensure_modifiable(btf)) in btf__add_str()
1768 off = strset__add_str(btf->strs_set, s); in btf__add_str()
1772 btf->hdr->str_len = strset__data_size(btf->strs_set); in btf__add_str()
1774 return btf->start_str_off + off; in btf__add_str()
1777 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1779 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1780 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1788 static int btf_commit_type(struct btf *btf, int data_sz) in btf_commit_type() argument
1792 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_commit_type()
1796 btf->hdr->type_len += data_sz; in btf_commit_type()
1797 btf->hdr->str_off += data_sz; in btf_commit_type()
1798 btf->nr_types++; in btf_commit_type()
1799 return btf->start_id + btf->nr_types - 1; in btf_commit_type()
1803 const struct btf *src;
1804 struct btf *dst;
1873 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) in btf__add_type() argument
1875 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_type()
1883 int btf__add_btf(struct btf *btf, const struct btf *src_btf) in btf__add_btf() argument
1885 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_btf()
1895 if (btf_ensure_modifiable(btf)) in btf__add_btf()
1901 old_strs_len = btf->hdr->str_len; in btf__add_btf()
1907 t = btf_add_type_mem(btf, data_sz); in btf__add_btf()
1912 off = btf_add_type_offs_mem(btf, cnt); in btf__add_btf()
1936 *off = t - btf->types_data; in btf__add_btf()
1961 *type_id += btf->start_id + btf->nr_types - 1; in btf__add_btf()
1977 btf->hdr->type_len += data_sz; in btf__add_btf()
1978 btf->hdr->str_off += data_sz; in btf__add_btf()
1979 btf->nr_types += cnt; in btf__add_btf()
1984 return btf->start_id + btf->nr_types - cnt; in btf__add_btf()
1989 memset(btf->types_data + btf->hdr->type_len, 0, data_sz); in btf__add_btf()
1990 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); in btf__add_btf()
1995 btf->hdr->str_len = old_strs_len; in btf__add_btf()
2011 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
2026 if (btf_ensure_modifiable(btf)) in btf__add_int()
2030 t = btf_add_type_mem(btf, sz); in btf__add_int()
2038 name_off = btf__add_str(btf, name); in btf__add_int()
2048 return btf_commit_type(btf, sz); in btf__add_int()
2059 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) in btf__add_float() argument
2073 if (btf_ensure_modifiable(btf)) in btf__add_float()
2077 t = btf_add_type_mem(btf, sz); in btf__add_float()
2081 name_off = btf__add_str(btf, name); in btf__add_float()
2089 return btf_commit_type(btf, sz); in btf__add_float()
2104 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id, int kflag) in btf_add_ref_kind() argument
2112 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
2116 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
2121 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
2130 return btf_commit_type(btf, sz); in btf_add_ref_kind()
2140 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
2142 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id, 0); in btf__add_ptr()
2154 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
2163 if (btf_ensure_modifiable(btf)) in btf__add_array()
2167 t = btf_add_type_mem(btf, sz); in btf__add_array()
2180 return btf_commit_type(btf, sz); in btf__add_array()
2184 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
2189 if (btf_ensure_modifiable(btf)) in btf_add_composite()
2193 t = btf_add_type_mem(btf, sz); in btf_add_composite()
2198 name_off = btf__add_str(btf, name); in btf_add_composite()
2210 return btf_commit_type(btf, sz); in btf_add_composite()
2225 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
2227 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
2243 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
2245 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
2248 static struct btf_type *btf_last_type(struct btf *btf) in btf_last_type() argument
2250 return btf_type_by_id(btf, btf__type_cnt(btf) - 1); in btf_last_type()
2263 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
2272 if (btf->nr_types == 0) in btf__add_field()
2274 t = btf_last_type(btf); in btf__add_field()
2290 if (btf_ensure_modifiable(btf)) in btf__add_field()
2294 m = btf_add_type_mem(btf, sz); in btf__add_field()
2299 name_off = btf__add_str(btf, name); in btf__add_field()
2309 t = btf_last_type(btf); in btf__add_field()
2313 btf->hdr->type_len += sz; in btf__add_field()
2314 btf->hdr->str_off += sz; in btf__add_field()
2318 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, in btf_add_enum_common() argument
2328 if (btf_ensure_modifiable(btf)) in btf_add_enum_common()
2332 t = btf_add_type_mem(btf, sz); in btf_add_enum_common()
2337 name_off = btf__add_str(btf, name); in btf_add_enum_common()
2347 return btf_commit_type(btf, sz); in btf_add_enum_common()
2363 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
2369 return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); in btf__add_enum()
2380 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
2387 if (btf->nr_types == 0) in btf__add_enum_value()
2389 t = btf_last_type(btf); in btf__add_enum_value()
2400 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
2404 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
2408 name_off = btf__add_str(btf, name); in btf__add_enum_value()
2416 t = btf_last_type(btf); in btf__add_enum_value()
2423 btf->hdr->type_len += sz; in btf__add_enum_value()
2424 btf->hdr->str_off += sz; in btf__add_enum_value()
2442 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, in btf__add_enum64() argument
2445 return btf_add_enum_common(btf, name, byte_sz, is_signed, in btf__add_enum64()
2457 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) in btf__add_enum64_value() argument
2464 if (btf->nr_types == 0) in btf__add_enum64_value()
2466 t = btf_last_type(btf); in btf__add_enum64_value()
2475 if (btf_ensure_modifiable(btf)) in btf__add_enum64_value()
2479 v = btf_add_type_mem(btf, sz); in btf__add_enum64_value()
2483 name_off = btf__add_str(btf, name); in btf__add_enum64_value()
2492 t = btf_last_type(btf); in btf__add_enum64_value()
2495 btf->hdr->type_len += sz; in btf__add_enum64_value()
2496 btf->hdr->str_off += sz; in btf__add_enum64_value()
2509 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
2520 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0, 0); in btf__add_fwd()
2523 t = btf_type_by_id(btf, id); in btf__add_fwd()
2531 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2545 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2550 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id, 0); in btf__add_typedef()
2560 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2562 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id, 0); in btf__add_volatile()
2572 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2574 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id, 0); in btf__add_const()
2584 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2586 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id, 0); in btf__add_restrict()
2597 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_tag() argument
2602 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 0); in btf__add_type_tag()
2614 int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_attr() argument
2619 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 1); in btf__add_type_attr()
2630 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2641 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id, 0); in btf__add_func()
2643 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2662 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2670 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2674 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2685 return btf_commit_type(btf, sz); in btf__add_func_proto()
2696 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2706 if (btf->nr_types == 0) in btf__add_func_param()
2708 t = btf_last_type(btf); in btf__add_func_param()
2713 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2717 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2722 name_off = btf__add_str(btf, name); in btf__add_func_param()
2731 t = btf_last_type(btf); in btf__add_func_param()
2734 btf->hdr->type_len += sz; in btf__add_func_param()
2735 btf->hdr->str_off += sz; in btf__add_func_param()
2749 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2765 if (btf_ensure_modifiable(btf)) in btf__add_var()
2769 t = btf_add_type_mem(btf, sz); in btf__add_var()
2773 name_off = btf__add_str(btf, name); in btf__add_var()
2784 return btf_commit_type(btf, sz); in btf__add_var()
2799 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2808 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2812 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2816 name_off = btf__add_str(btf, name); in btf__add_datasec()
2825 return btf_commit_type(btf, sz); in btf__add_datasec()
2838 int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz) in btf__add_datasec_var_info() argument
2845 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2847 t = btf_last_type(btf); in btf__add_datasec_var_info()
2855 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2859 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2868 t = btf_last_type(btf); in btf__add_datasec_var_info()
2871 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2872 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2876 static int btf_add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf_add_decl_tag() argument
2888 if (btf_ensure_modifiable(btf)) in btf_add_decl_tag()
2892 t = btf_add_type_mem(btf, sz); in btf_add_decl_tag()
2896 value_off = btf__add_str(btf, value); in btf_add_decl_tag()
2905 return btf_commit_type(btf, sz); in btf_add_decl_tag()
2918 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_tag() argument
2921 return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 0); in btf__add_decl_tag()
2935 int btf__add_decl_attr(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_attr() argument
2938 return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 1); in btf__add_decl_attr()
3350 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3499 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) in btf__dedup() argument
3507 d = btf_dedup_new(btf, opts); in btf__dedup()
3513 if (btf_ensure_modifiable(btf)) { in btf__dedup()
3569 struct btf *btf; member
3675 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) in btf_dedup_new() argument
3687 d->btf = btf; in btf_dedup_new()
3697 type_cnt = btf__type_cnt(btf); in btf_dedup_new()
3706 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
3740 for (i = 0; i < d->btf->nr_types; i++) { in btf_for_each_str_off()
3742 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_for_each_str_off()
3774 if (str_off == 0 || str_off < d->btf->start_str_off) in strs_dedup_remap_str_off()
3777 s = btf__str_by_offset(d->btf, str_off); in strs_dedup_remap_str_off()
3778 if (d->btf->base_btf) { in strs_dedup_remap_str_off()
3779 err = btf__find_str(d->btf->base_btf, s); in strs_dedup_remap_str_off()
3792 *str_off_ptr = d->btf->start_str_off + off; in strs_dedup_remap_str_off()
3811 if (d->btf->strs_deduped) in btf_dedup_strings()
3820 if (!d->btf->base_btf) { in btf_dedup_strings()
3835 strset__free(d->btf->strs_set); in btf_dedup_strings()
3836 d->btf->hdr->str_len = strset__data_size(d->strs_set); in btf_dedup_strings()
3837 d->btf->strs_set = d->strs_set; in btf_dedup_strings()
3839 d->btf->strs_deduped = true; in btf_dedup_strings()
4150 if (!d->btf->base_btf) in btf_dedup_prep()
4153 for (type_id = 1; type_id < d->btf->start_id; type_id++) { in btf_dedup_prep()
4154 t = btf_type_by_id(d->btf, type_id); in btf_dedup_prep()
4212 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
4241 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4254 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4276 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4299 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_prim_types()
4300 err = btf_dedup_prim_type(d, d->btf->start_id + i); in btf_dedup_prim_types()
4335 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
4341 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
4358 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_arrays()
4359 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_arrays()
4373 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_structs()
4374 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_structs()
4531 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
4532 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
4552 if (fwd_kind == real_kind && canon_id < d->btf->start_id) in btf_dedup_is_equiv()
4684 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
4685 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4770 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4791 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4819 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_struct_types()
4820 err = btf_dedup_struct_type(d, d->btf->start_id + i); in btf_dedup_struct_types()
4865 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4884 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4901 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4925 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4957 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4981 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_ref_types()
4982 err = btf_dedup_ref_type(d, d->btf->start_id + i); in btf_dedup_ref_types()
4999 __u32 nr_types = btf__type_cnt(d->btf); in btf_dedup_fill_unique_names_map()
5010 t = btf_type_by_id(d->btf, type_id); in btf_dedup_fill_unique_names_map()
5033 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_resolve_fwd()
5053 cand_t = btf_type_by_id(d->btf, cand_id); in btf_dedup_resolve_fwd()
5109 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_resolve_fwds()
5110 err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i); in btf_dedup_resolve_fwds()
5134 __u32 next_type_id = d->btf->start_id; in btf_dedup_compact_types()
5142 for (id = 1; id < d->btf->start_id; id++) in btf_dedup_compact_types()
5144 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) in btf_dedup_compact_types()
5147 p = d->btf->types_data; in btf_dedup_compact_types()
5149 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { in btf_dedup_compact_types()
5153 t = btf__type_by_id(d->btf, id); in btf_dedup_compact_types()
5160 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; in btf_dedup_compact_types()
5166 d->btf->nr_types = next_type_id - d->btf->start_id; in btf_dedup_compact_types()
5167 d->btf->type_offs_cap = d->btf->nr_types; in btf_dedup_compact_types()
5168 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
5169 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
5171 if (d->btf->type_offs_cap && !new_offs) in btf_dedup_compact_types()
5173 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
5174 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
5175 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
5213 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_remap_types()
5214 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_dedup_remap_types()
5248 struct btf *btf__load_vmlinux_btf(void) in btf__load_vmlinux_btf()
5263 struct btf *btf; in btf__load_vmlinux_btf() local
5271 btf = btf__parse(sysfs_btf_path, NULL); in btf__load_vmlinux_btf()
5272 if (!btf) { in btf__load_vmlinux_btf()
5279 return btf; in btf__load_vmlinux_btf()
5290 btf = btf__parse(path, NULL); in btf__load_vmlinux_btf()
5291 err = libbpf_get_error(btf); in btf__load_vmlinux_btf()
5296 return btf; in btf__load_vmlinux_btf()
5303 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
5305 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) in btf__load_module_btf()
5596 int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf, in btf__distill_base()
5597 struct btf **new_split_btf) in btf__distill_base()
5599 struct btf *new_base = NULL, *new_split = NULL; in btf__distill_base()
5600 const struct btf *old_base; in btf__distill_base()
5697 const struct btf_header *btf_header(const struct btf *btf) in btf_header() argument
5699 return btf->hdr; in btf_header()
5702 void btf_set_base_btf(struct btf *btf, const struct btf *base_btf) in btf_set_base_btf() argument
5704 btf->base_btf = (struct btf *)base_btf; in btf_set_base_btf()
5705 btf->start_id = btf__type_cnt(base_btf); in btf_set_base_btf()
5706 btf->start_str_off = base_btf->hdr->str_len; in btf_set_base_btf()
5709 int btf__relocate(struct btf *btf, const struct btf *base_btf) in btf__relocate() argument
5711 int err = btf_relocate(btf, base_btf, NULL); in btf__relocate()
5714 btf->owns_base = false; in btf__relocate()