Lines Matching refs:btf

33 struct btf {  struct
99 struct btf *base_btf; argument
200 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt) in btf_add_type_offs_mem() argument
202 return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), in btf_add_type_offs_mem()
203 btf->nr_types, BTF_MAX_NR_TYPES, add_cnt); in btf_add_type_offs_mem()
206 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) in btf_add_type_idx_entry() argument
210 p = btf_add_type_offs_mem(btf, 1); in btf_add_type_idx_entry()
228 static int btf_parse_hdr(struct btf *btf) in btf_parse_hdr() argument
230 struct btf_header *hdr = btf->hdr; in btf_parse_hdr()
233 if (btf->raw_size < sizeof(struct btf_header)) { in btf_parse_hdr()
239 btf->swapped_endian = true; in btf_parse_hdr()
251 if (btf->raw_size < hdr->hdr_len) { in btf_parse_hdr()
253 hdr->hdr_len, btf->raw_size); in btf_parse_hdr()
257 meta_left = btf->raw_size - hdr->hdr_len; in btf_parse_hdr()
259 pr_debug("Invalid BTF total size: %u\n", btf->raw_size); in btf_parse_hdr()
277 static int btf_parse_str_sec(struct btf *btf) in btf_parse_str_sec() argument
279 const struct btf_header *hdr = btf->hdr; in btf_parse_str_sec()
280 const char *start = btf->strs_data; in btf_parse_str_sec()
281 const char *end = start + btf->hdr->str_len; in btf_parse_str_sec()
283 if (btf->base_btf && hdr->str_len == 0) in btf_parse_str_sec()
289 if (!btf->base_btf && start[0]) { in btf_parse_str_sec()
421 static int btf_parse_type_sec(struct btf *btf) in btf_parse_type_sec() argument
423 struct btf_header *hdr = btf->hdr; in btf_parse_type_sec()
424 void *next_type = btf->types_data; in btf_parse_type_sec()
429 if (btf->swapped_endian) in btf_parse_type_sec()
436 pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types); in btf_parse_type_sec()
440 if (btf->swapped_endian && btf_bswap_type_rest(next_type)) in btf_parse_type_sec()
443 err = btf_add_type_idx_entry(btf, next_type - btf->types_data); in btf_parse_type_sec()
448 btf->nr_types++; in btf_parse_type_sec()
459 static int btf_validate_str(const struct btf *btf, __u32 str_off, const char *what, __u32 type_id) in btf_validate_str() argument
463 s = btf__str_by_offset(btf, str_off); in btf_validate_str()
472 static int btf_validate_id(const struct btf *btf, __u32 id, __u32 ctx_id) in btf_validate_id() argument
476 t = btf__type_by_id(btf, id); in btf_validate_id()
485 static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id) in btf_validate_type() argument
490 err = btf_validate_str(btf, t->name_off, "type name", id); in btf_validate_type()
508 err = btf_validate_id(btf, t->type, id); in btf_validate_type()
515 err = btf_validate_id(btf, a->type, id); in btf_validate_type()
516 err = err ?: btf_validate_id(btf, a->index_type, id); in btf_validate_type()
527 err = btf_validate_str(btf, m->name_off, "field name", id); in btf_validate_type()
528 err = err ?: btf_validate_id(btf, m->type, id); in btf_validate_type()
539 err = btf_validate_str(btf, m->name_off, "enum name", id); in btf_validate_type()
550 err = btf_validate_str(btf, m->name_off, "enum name", id); in btf_validate_type()
559 err = btf_validate_id(btf, t->type, id); in btf_validate_type()
562 ft = btf__type_by_id(btf, t->type); in btf_validate_type()
574 err = btf_validate_str(btf, m->name_off, "param name", id); in btf_validate_type()
575 err = err ?: btf_validate_id(btf, m->type, id); in btf_validate_type()
586 err = btf_validate_id(btf, m->type, id); in btf_validate_type()
603 static int btf_sanity_check(const struct btf *btf) in btf_sanity_check() argument
606 __u32 i, n = btf__type_cnt(btf); in btf_sanity_check()
609 for (i = btf->start_id; i < n; i++) { in btf_sanity_check()
610 t = btf_type_by_id(btf, i); in btf_sanity_check()
611 err = btf_validate_type(btf, t, i); in btf_sanity_check()
618 __u32 btf__type_cnt(const struct btf *btf) in btf__type_cnt() argument
620 return btf->start_id + btf->nr_types; in btf__type_cnt()
623 const struct btf *btf__base_btf(const struct btf *btf) in btf__base_btf() argument
625 return btf->base_btf; in btf__base_btf()
629 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id) in btf_type_by_id() argument
633 if (type_id < btf->start_id) in btf_type_by_id()
634 return btf_type_by_id(btf->base_btf, type_id); in btf_type_by_id()
635 return btf->types_data + btf->type_offs[type_id - btf->start_id]; in btf_type_by_id()
638 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) in btf__type_by_id() argument
640 if (type_id >= btf->start_id + btf->nr_types) in btf__type_by_id()
642 return btf_type_by_id((struct btf *)btf, type_id); in btf__type_by_id()
645 static int determine_ptr_size(const struct btf *btf) in determine_ptr_size() argument
664 if (btf->base_btf && btf->base_btf->ptr_sz > 0) in determine_ptr_size()
665 return btf->base_btf->ptr_sz; in determine_ptr_size()
667 n = btf__type_cnt(btf); in determine_ptr_size()
669 t = btf__type_by_id(btf, i); in determine_ptr_size()
676 name = btf__name_by_offset(btf, t->name_off); in determine_ptr_size()
689 static size_t btf_ptr_sz(const struct btf *btf) in btf_ptr_sz() argument
691 if (!btf->ptr_sz) in btf_ptr_sz()
692 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf_ptr_sz()
693 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; in btf_ptr_sz()
704 size_t btf__pointer_size(const struct btf *btf) in btf__pointer_size() argument
706 if (!btf->ptr_sz) in btf__pointer_size()
707 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf__pointer_size()
709 if (btf->ptr_sz < 0) in btf__pointer_size()
713 return btf->ptr_sz; in btf__pointer_size()
719 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) in btf__set_pointer_size() argument
723 btf->ptr_sz = ptr_sz; in btf__set_pointer_size()
738 enum btf_endianness btf__endianness(const struct btf *btf) in btf__endianness() argument
741 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; in btf__endianness()
743 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; in btf__endianness()
746 int btf__set_endianness(struct btf *btf, enum btf_endianness endian) in btf__set_endianness() argument
751 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); in btf__set_endianness()
752 if (!btf->swapped_endian) { in btf__set_endianness()
753 free(btf->raw_data_swapped); in btf__set_endianness()
754 btf->raw_data_swapped = NULL; in btf__set_endianness()
771 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) in btf__resolve_size() argument
779 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
792 size = btf_ptr_sz(btf); in btf__resolve_size()
814 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
826 int btf__align_of(const struct btf *btf, __u32 id) in btf__align_of() argument
828 const struct btf_type *t = btf__type_by_id(btf, id); in btf__align_of()
836 return min(btf_ptr_sz(btf), (size_t)t->size); in btf__align_of()
838 return btf_ptr_sz(btf); in btf__align_of()
844 return btf__align_of(btf, t->type); in btf__align_of()
846 return btf__align_of(btf, btf_array(t)->type); in btf__align_of()
854 align = btf__align_of(btf, m->type); in btf__align_of()
881 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
886 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
891 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
901 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
903 __u32 i, nr_types = btf__type_cnt(btf); in btf__find_by_name()
909 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
910 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
919 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, in btf_find_by_name_kind() argument
922 __u32 i, nr_types = btf__type_cnt(btf); in btf_find_by_name_kind()
928 const struct btf_type *t = btf__type_by_id(btf, i); in btf_find_by_name_kind()
933 name = btf__name_by_offset(btf, t->name_off); in btf_find_by_name_kind()
941 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, in btf__find_by_name_kind_own() argument
944 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); in btf__find_by_name_kind_own()
947 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
950 return btf_find_by_name_kind(btf, 1, type_name, kind); in btf__find_by_name_kind()
953 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
955 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
958 static void btf_free_raw_data(struct btf *btf) in btf_free_raw_data() argument
960 if (btf->raw_data_is_mmap) { in btf_free_raw_data()
961 munmap(btf->raw_data, btf->raw_size); in btf_free_raw_data()
962 btf->raw_data_is_mmap = false; in btf_free_raw_data()
964 free(btf->raw_data); in btf_free_raw_data()
966 btf->raw_data = NULL; in btf_free_raw_data()
969 void btf__free(struct btf *btf) in btf__free() argument
971 if (IS_ERR_OR_NULL(btf)) in btf__free()
974 if (btf->fd >= 0) in btf__free()
975 close(btf->fd); in btf__free()
977 if (btf_is_modifiable(btf)) { in btf__free()
984 free(btf->hdr); in btf__free()
985 free(btf->types_data); in btf__free()
986 strset__free(btf->strs_set); in btf__free()
988 btf_free_raw_data(btf); in btf__free()
989 free(btf->raw_data_swapped); in btf__free()
990 free(btf->type_offs); in btf__free()
991 if (btf->owns_base) in btf__free()
992 btf__free(btf->base_btf); in btf__free()
993 free(btf); in btf__free()
996 static struct btf *btf_new_empty(struct btf *base_btf) in btf_new_empty()
998 struct btf *btf; in btf_new_empty() local
1000 btf = calloc(1, sizeof(*btf)); in btf_new_empty()
1001 if (!btf) in btf_new_empty()
1004 btf->nr_types = 0; in btf_new_empty()
1005 btf->start_id = 1; in btf_new_empty()
1006 btf->start_str_off = 0; in btf_new_empty()
1007 btf->fd = -1; in btf_new_empty()
1008 btf->ptr_sz = sizeof(void *); in btf_new_empty()
1009 btf->swapped_endian = false; in btf_new_empty()
1012 btf->base_btf = base_btf; in btf_new_empty()
1013 btf->start_id = btf__type_cnt(base_btf); in btf_new_empty()
1014 btf->start_str_off = base_btf->hdr->str_len + base_btf->start_str_off; in btf_new_empty()
1015 btf->swapped_endian = base_btf->swapped_endian; in btf_new_empty()
1019 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); in btf_new_empty()
1020 btf->raw_data = calloc(1, btf->raw_size); in btf_new_empty()
1021 if (!btf->raw_data) { in btf_new_empty()
1022 free(btf); in btf_new_empty()
1026 btf->hdr = btf->raw_data; in btf_new_empty()
1027 btf->hdr->hdr_len = sizeof(struct btf_header); in btf_new_empty()
1028 btf->hdr->magic = BTF_MAGIC; in btf_new_empty()
1029 btf->hdr->version = BTF_VERSION; in btf_new_empty()
1031 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
1032 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
1033 btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ in btf_new_empty()
1035 return btf; in btf_new_empty()
1038 struct btf *btf__new_empty(void) in btf__new_empty()
1043 struct btf *btf__new_empty_split(struct btf *base_btf) in btf__new_empty_split()
1048 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf, bool is_mmap) in btf_new()
1050 struct btf *btf; in btf_new() local
1053 btf = calloc(1, sizeof(struct btf)); in btf_new()
1054 if (!btf) in btf_new()
1057 btf->nr_types = 0; in btf_new()
1058 btf->start_id = 1; in btf_new()
1059 btf->start_str_off = 0; in btf_new()
1060 btf->fd = -1; in btf_new()
1063 btf->base_btf = base_btf; in btf_new()
1064 btf->start_id = btf__type_cnt(base_btf); in btf_new()
1065 btf->start_str_off = base_btf->hdr->str_len; in btf_new()
1069 btf->raw_data = (void *)data; in btf_new()
1070 btf->raw_data_is_mmap = true; in btf_new()
1072 btf->raw_data = malloc(size); in btf_new()
1073 if (!btf->raw_data) { in btf_new()
1077 memcpy(btf->raw_data, data, size); in btf_new()
1080 btf->raw_size = size; in btf_new()
1082 btf->hdr = btf->raw_data; in btf_new()
1083 err = btf_parse_hdr(btf); in btf_new()
1087 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf_new()
1088 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf_new()
1090 err = btf_parse_str_sec(btf); in btf_new()
1091 err = err ?: btf_parse_type_sec(btf); in btf_new()
1092 err = err ?: btf_sanity_check(btf); in btf_new()
1098 btf__free(btf); in btf_new()
1102 return btf; in btf_new()
1105 struct btf *btf__new(const void *data, __u32 size) in btf__new()
1110 struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf) in btf__new_split()
1193 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, in btf_parse_elf()
1197 struct btf *dist_base_btf = NULL; in btf_parse_elf()
1198 struct btf *btf = NULL; in btf_parse_elf() local
1241 btf = btf_new(secs.btf_data->d_buf, secs.btf_data->d_size, in btf_parse_elf()
1243 if (IS_ERR(btf)) { in btf_parse_elf()
1244 err = PTR_ERR(btf); in btf_parse_elf()
1248 err = btf__relocate(btf, base_btf); in btf_parse_elf()
1256 btf->owns_base = true; in btf_parse_elf()
1260 btf__set_pointer_size(btf, 4); in btf_parse_elf()
1263 btf__set_pointer_size(btf, 8); in btf_parse_elf()
1285 return btf; in btf_parse_elf()
1290 btf__free(btf); in btf_parse_elf()
1295 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
1300 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) in btf__parse_elf_split()
1305 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) in btf_parse_raw()
1307 struct btf *btf = NULL; in btf_parse_raw() local
1359 btf = btf_new(data, sz, base_btf, false); in btf_parse_raw()
1365 return err ? ERR_PTR(err) : btf; in btf_parse_raw()
1368 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
1373 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) in btf__parse_raw_split()
1378 static struct btf *btf_parse_raw_mmap(const char *path, struct btf *base_btf) in btf_parse_raw_mmap()
1382 struct btf *btf; in btf_parse_raw_mmap() local
1402 btf = btf_new(data, st.st_size, base_btf, true); in btf_parse_raw_mmap()
1403 if (IS_ERR(btf)) in btf_parse_raw_mmap()
1406 return btf; in btf_parse_raw_mmap()
1409 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) in btf_parse()
1411 struct btf *btf; in btf_parse() local
1417 btf = btf_parse_raw(path, base_btf); in btf_parse()
1418 err = libbpf_get_error(btf); in btf_parse()
1420 return btf; in btf_parse()
1426 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
1431 struct btf *btf__parse_split(const char *path, struct btf *base_btf) in btf__parse_split()
1436 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1438 int btf_load_into_kernel(struct btf *btf, in btf_load_into_kernel() argument
1448 if (btf->fd >= 0) in btf_load_into_kernel()
1454 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf_load_into_kernel()
1459 btf->raw_size = raw_size; in btf_load_into_kernel()
1460 btf->raw_data = raw_data; in btf_load_into_kernel()
1494 btf->fd = bpf_btf_load(raw_data, raw_size, &opts); in btf_load_into_kernel()
1495 if (btf->fd < 0) { in btf_load_into_kernel()
1519 int btf__load_into_kernel(struct btf *btf) in btf__load_into_kernel() argument
1521 return btf_load_into_kernel(btf, NULL, 0, 0, 0); in btf__load_into_kernel()
1524 int btf__fd(const struct btf *btf) in btf__fd() argument
1526 return btf->fd; in btf__fd()
1529 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1531 btf->fd = fd; in btf__set_fd()
1534 static const void *btf_strs_data(const struct btf *btf) in btf_strs_data() argument
1536 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); in btf_strs_data()
1539 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1541 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1547 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1549 *size = btf->raw_size; in btf_get_raw_data()
1564 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1566 for (i = 0; i < btf->nr_types; i++) { in btf_get_raw_data()
1567 t = p + btf->type_offs[i]; in btf_get_raw_data()
1579 memcpy(p, btf_strs_data(btf), hdr->str_len); in btf_get_raw_data()
1589 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) in btf__raw_data()
1591 struct btf *btf = (struct btf *)btf_ro; in btf__raw_data() local
1595 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__raw_data()
1599 btf->raw_size = data_sz; in btf__raw_data()
1600 if (btf->swapped_endian) in btf__raw_data()
1601 btf->raw_data_swapped = data; in btf__raw_data()
1603 btf->raw_data = data; in btf__raw_data()
1609 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1611 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1613 if (offset < btf->start_str_off) in btf__str_by_offset()
1614 return btf__str_by_offset(btf->base_btf, offset); in btf__str_by_offset()
1615 else if (offset - btf->start_str_off < btf->hdr->str_len) in btf__str_by_offset()
1616 return btf_strs_data(btf) + (offset - btf->start_str_off); in btf__str_by_offset()
1621 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1623 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1626 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) in btf_get_from_fd()
1631 struct btf *btf; in btf_get_from_fd() local
1645 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1655 btf = ERR_PTR(-ENOMEM); in btf_get_from_fd()
1662 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1669 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); in btf_get_from_fd()
1673 btf = btf_new(ptr, btf_info.btf_size, base_btf, false); in btf_get_from_fd()
1677 return btf; in btf_get_from_fd()
1680 struct btf *btf_load_from_kernel(__u32 id, struct btf *base_btf, int token_fd) in btf_load_from_kernel()
1682 struct btf *btf; in btf_load_from_kernel() local
1695 btf = btf_get_from_fd(btf_fd, base_btf); in btf_load_from_kernel()
1698 return libbpf_ptr(btf); in btf_load_from_kernel()
1701 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) in btf__load_from_kernel_by_id_split()
1706 struct btf *btf__load_from_kernel_by_id(__u32 id) in btf__load_from_kernel_by_id()
1711 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1713 if (btf->raw_data) in btf_invalidate_raw_data()
1714 btf_free_raw_data(btf); in btf_invalidate_raw_data()
1715 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1716 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1717 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1725 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1731 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1733 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1738 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1739 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1743 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1744 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1747 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1754 btf->hdr = hdr; in btf_ensure_modifiable()
1755 btf->types_data = types; in btf_ensure_modifiable()
1756 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1757 btf->strs_data = NULL; in btf_ensure_modifiable()
1758 btf->strs_set = set; in btf_ensure_modifiable()
1762 if (btf->hdr->str_len == 0) in btf_ensure_modifiable()
1763 btf->strs_deduped = true; in btf_ensure_modifiable()
1764 if (!btf->base_btf && btf->hdr->str_len == 1) in btf_ensure_modifiable()
1765 btf->strs_deduped = true; in btf_ensure_modifiable()
1768 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1785 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1789 if (btf->base_btf) { in btf__find_str()
1790 off = btf__find_str(btf->base_btf, s); in btf__find_str()
1796 if (btf_ensure_modifiable(btf)) in btf__find_str()
1799 off = strset__find_str(btf->strs_set, s); in btf__find_str()
1803 return btf->start_str_off + off; in btf__find_str()
1811 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1815 if (btf->base_btf) { in btf__add_str()
1816 off = btf__find_str(btf->base_btf, s); in btf__add_str()
1821 if (btf_ensure_modifiable(btf)) in btf__add_str()
1824 off = strset__add_str(btf->strs_set, s); in btf__add_str()
1828 btf->hdr->str_len = strset__data_size(btf->strs_set); in btf__add_str()
1830 return btf->start_str_off + off; in btf__add_str()
1833 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1835 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1836 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1844 static int btf_commit_type(struct btf *btf, int data_sz) in btf_commit_type() argument
1848 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_commit_type()
1852 btf->hdr->type_len += data_sz; in btf_commit_type()
1853 btf->hdr->str_off += data_sz; in btf_commit_type()
1854 btf->nr_types++; in btf_commit_type()
1855 return btf->start_id + btf->nr_types - 1; in btf_commit_type()
1859 const struct btf *src;
1860 struct btf *dst;
1929 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) in btf__add_type() argument
1931 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_type()
1939 int btf__add_btf(struct btf *btf, const struct btf *src_btf) in btf__add_btf() argument
1941 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_btf()
1951 if (btf_ensure_modifiable(btf)) in btf__add_btf()
1957 old_strs_len = btf->hdr->str_len; in btf__add_btf()
1963 t = btf_add_type_mem(btf, data_sz); in btf__add_btf()
1968 off = btf_add_type_offs_mem(btf, cnt); in btf__add_btf()
1992 *off = t - btf->types_data; in btf__add_btf()
2017 *type_id += btf->start_id + btf->nr_types - 1; in btf__add_btf()
2033 btf->hdr->type_len += data_sz; in btf__add_btf()
2034 btf->hdr->str_off += data_sz; in btf__add_btf()
2035 btf->nr_types += cnt; in btf__add_btf()
2040 return btf->start_id + btf->nr_types - cnt; in btf__add_btf()
2045 memset(btf->types_data + btf->hdr->type_len, 0, data_sz); in btf__add_btf()
2046 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); in btf__add_btf()
2051 btf->hdr->str_len = old_strs_len; in btf__add_btf()
2067 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
2082 if (btf_ensure_modifiable(btf)) in btf__add_int()
2086 t = btf_add_type_mem(btf, sz); in btf__add_int()
2094 name_off = btf__add_str(btf, name); in btf__add_int()
2104 return btf_commit_type(btf, sz); in btf__add_int()
2115 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) in btf__add_float() argument
2129 if (btf_ensure_modifiable(btf)) in btf__add_float()
2133 t = btf_add_type_mem(btf, sz); in btf__add_float()
2137 name_off = btf__add_str(btf, name); in btf__add_float()
2145 return btf_commit_type(btf, sz); in btf__add_float()
2160 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
2168 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
2172 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
2177 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
2186 return btf_commit_type(btf, sz); in btf_add_ref_kind()
2196 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
2198 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id, 0); in btf__add_ptr()
2210 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
2219 if (btf_ensure_modifiable(btf)) in btf__add_array()
2223 t = btf_add_type_mem(btf, sz); in btf__add_array()
2236 return btf_commit_type(btf, sz); in btf__add_array()
2240 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
2245 if (btf_ensure_modifiable(btf)) in btf_add_composite()
2249 t = btf_add_type_mem(btf, sz); in btf_add_composite()
2254 name_off = btf__add_str(btf, name); in btf_add_composite()
2266 return btf_commit_type(btf, sz); in btf_add_composite()
2281 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
2283 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
2299 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
2301 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
2304 static struct btf_type *btf_last_type(struct btf *btf) in btf_last_type() argument
2306 return btf_type_by_id(btf, btf__type_cnt(btf) - 1); in btf_last_type()
2319 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
2328 if (btf->nr_types == 0) in btf__add_field()
2330 t = btf_last_type(btf); in btf__add_field()
2346 if (btf_ensure_modifiable(btf)) in btf__add_field()
2350 m = btf_add_type_mem(btf, sz); in btf__add_field()
2355 name_off = btf__add_str(btf, name); in btf__add_field()
2365 t = btf_last_type(btf); in btf__add_field()
2369 btf->hdr->type_len += sz; in btf__add_field()
2370 btf->hdr->str_off += sz; in btf__add_field()
2374 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, in btf_add_enum_common() argument
2384 if (btf_ensure_modifiable(btf)) in btf_add_enum_common()
2388 t = btf_add_type_mem(btf, sz); in btf_add_enum_common()
2393 name_off = btf__add_str(btf, name); in btf_add_enum_common()
2403 return btf_commit_type(btf, sz); in btf_add_enum_common()
2419 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
2425 return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); in btf__add_enum()
2436 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
2443 if (btf->nr_types == 0) in btf__add_enum_value()
2445 t = btf_last_type(btf); in btf__add_enum_value()
2456 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
2460 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
2464 name_off = btf__add_str(btf, name); in btf__add_enum_value()
2472 t = btf_last_type(btf); in btf__add_enum_value()
2479 btf->hdr->type_len += sz; in btf__add_enum_value()
2480 btf->hdr->str_off += sz; in btf__add_enum_value()
2498 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, in btf__add_enum64() argument
2501 return btf_add_enum_common(btf, name, byte_sz, is_signed, in btf__add_enum64()
2513 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) in btf__add_enum64_value() argument
2520 if (btf->nr_types == 0) in btf__add_enum64_value()
2522 t = btf_last_type(btf); in btf__add_enum64_value()
2531 if (btf_ensure_modifiable(btf)) in btf__add_enum64_value()
2535 v = btf_add_type_mem(btf, sz); in btf__add_enum64_value()
2539 name_off = btf__add_str(btf, name); in btf__add_enum64_value()
2548 t = btf_last_type(btf); in btf__add_enum64_value()
2551 btf->hdr->type_len += sz; in btf__add_enum64_value()
2552 btf->hdr->str_off += sz; in btf__add_enum64_value()
2565 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
2576 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0, 0); in btf__add_fwd()
2579 t = btf_type_by_id(btf, id); in btf__add_fwd()
2587 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2601 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2606 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id, 0); in btf__add_typedef()
2616 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2618 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id, 0); in btf__add_volatile()
2628 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2630 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id, 0); in btf__add_const()
2640 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2642 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id, 0); in btf__add_restrict()
2653 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_tag() argument
2658 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 0); in btf__add_type_tag()
2670 int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_attr() argument
2675 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 1); in btf__add_type_attr()
2686 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2697 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id, 0); in btf__add_func()
2699 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2718 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2726 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2730 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2741 return btf_commit_type(btf, sz); in btf__add_func_proto()
2752 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2762 if (btf->nr_types == 0) in btf__add_func_param()
2764 t = btf_last_type(btf); in btf__add_func_param()
2769 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2773 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2778 name_off = btf__add_str(btf, name); in btf__add_func_param()
2787 t = btf_last_type(btf); in btf__add_func_param()
2790 btf->hdr->type_len += sz; in btf__add_func_param()
2791 btf->hdr->str_off += sz; in btf__add_func_param()
2805 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2821 if (btf_ensure_modifiable(btf)) in btf__add_var()
2825 t = btf_add_type_mem(btf, sz); in btf__add_var()
2829 name_off = btf__add_str(btf, name); in btf__add_var()
2840 return btf_commit_type(btf, sz); in btf__add_var()
2855 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2864 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2868 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2872 name_off = btf__add_str(btf, name); in btf__add_datasec()
2881 return btf_commit_type(btf, sz); in btf__add_datasec()
2894 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
2901 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2903 t = btf_last_type(btf); in btf__add_datasec_var_info()
2911 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2915 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2924 t = btf_last_type(btf); in btf__add_datasec_var_info()
2927 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2928 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2932 static int btf_add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf_add_decl_tag() argument
2944 if (btf_ensure_modifiable(btf)) in btf_add_decl_tag()
2948 t = btf_add_type_mem(btf, sz); in btf_add_decl_tag()
2952 value_off = btf__add_str(btf, value); in btf_add_decl_tag()
2961 return btf_commit_type(btf, sz); in btf_add_decl_tag()
2974 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_tag() argument
2977 return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 0); in btf__add_decl_tag()
2991 int btf__add_decl_attr(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_attr() argument
2994 return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 1); in btf__add_decl_attr()
3406 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3555 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) in btf__dedup() argument
3563 d = btf_dedup_new(btf, opts); in btf__dedup()
3569 if (btf_ensure_modifiable(btf)) { in btf__dedup()
3625 struct btf *btf; member
3731 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) in btf_dedup_new() argument
3743 d->btf = btf; in btf_dedup_new()
3753 type_cnt = btf__type_cnt(btf); in btf_dedup_new()
3762 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
3796 for (i = 0; i < d->btf->nr_types; i++) { in btf_for_each_str_off()
3798 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_for_each_str_off()
3830 if (str_off == 0 || str_off < d->btf->start_str_off) in strs_dedup_remap_str_off()
3833 s = btf__str_by_offset(d->btf, str_off); in strs_dedup_remap_str_off()
3834 if (d->btf->base_btf) { in strs_dedup_remap_str_off()
3835 err = btf__find_str(d->btf->base_btf, s); in strs_dedup_remap_str_off()
3848 *str_off_ptr = d->btf->start_str_off + off; in strs_dedup_remap_str_off()
3867 if (d->btf->strs_deduped) in btf_dedup_strings()
3876 if (!d->btf->base_btf) { in btf_dedup_strings()
3891 strset__free(d->btf->strs_set); in btf_dedup_strings()
3892 d->btf->hdr->str_len = strset__data_size(d->strs_set); in btf_dedup_strings()
3893 d->btf->strs_set = d->strs_set; in btf_dedup_strings()
3895 d->btf->strs_deduped = true; in btf_dedup_strings()
4206 if (!d->btf->base_btf) in btf_dedup_prep()
4209 for (type_id = 1; type_id < d->btf->start_id; type_id++) { in btf_dedup_prep()
4210 t = btf_type_by_id(d->btf, type_id); in btf_dedup_prep()
4268 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
4297 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4310 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4332 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
4355 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_prim_types()
4356 err = btf_dedup_prim_type(d, d->btf->start_id + i); in btf_dedup_prim_types()
4391 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
4397 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
4417 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_types()
4418 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_types()
4644 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
4645 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
4665 if (fwd_kind == real_kind && canon_id < d->btf->start_id) in btf_dedup_is_equiv()
4797 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
4798 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4883 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4904 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4932 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_struct_types()
4933 err = btf_dedup_struct_type(d, d->btf->start_id + i); in btf_dedup_struct_types()
4978 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4997 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
5014 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
5038 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
5070 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
5094 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_ref_types()
5095 err = btf_dedup_ref_type(d, d->btf->start_id + i); in btf_dedup_ref_types()
5112 __u32 nr_types = btf__type_cnt(d->btf); in btf_dedup_fill_unique_names_map()
5123 t = btf_type_by_id(d->btf, type_id); in btf_dedup_fill_unique_names_map()
5146 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_resolve_fwd()
5166 cand_t = btf_type_by_id(d->btf, cand_id); in btf_dedup_resolve_fwd()
5222 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_resolve_fwds()
5223 err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i); in btf_dedup_resolve_fwds()
5247 __u32 next_type_id = d->btf->start_id; in btf_dedup_compact_types()
5255 for (id = 1; id < d->btf->start_id; id++) in btf_dedup_compact_types()
5257 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) in btf_dedup_compact_types()
5260 p = d->btf->types_data; in btf_dedup_compact_types()
5262 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { in btf_dedup_compact_types()
5266 t = btf__type_by_id(d->btf, id); in btf_dedup_compact_types()
5273 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; in btf_dedup_compact_types()
5279 d->btf->nr_types = next_type_id - d->btf->start_id; in btf_dedup_compact_types()
5280 d->btf->type_offs_cap = d->btf->nr_types; in btf_dedup_compact_types()
5281 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
5282 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
5284 if (d->btf->type_offs_cap && !new_offs) in btf_dedup_compact_types()
5286 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
5287 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
5288 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
5326 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_remap_types()
5327 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_dedup_remap_types()
5361 struct btf *btf__load_vmlinux_btf(void) in btf__load_vmlinux_btf()
5376 struct btf *btf; in btf__load_vmlinux_btf() local
5384 btf = btf_parse_raw_mmap(sysfs_btf_path, NULL); in btf__load_vmlinux_btf()
5385 if (IS_ERR(btf)) in btf__load_vmlinux_btf()
5386 btf = btf__parse(sysfs_btf_path, NULL); in btf__load_vmlinux_btf()
5388 if (!btf) { in btf__load_vmlinux_btf()
5395 return btf; in btf__load_vmlinux_btf()
5406 btf = btf__parse(path, NULL); in btf__load_vmlinux_btf()
5407 err = libbpf_get_error(btf); in btf__load_vmlinux_btf()
5412 return btf; in btf__load_vmlinux_btf()
5419 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
5421 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) in btf__load_module_btf()
5712 int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf, in btf__distill_base()
5713 struct btf **new_split_btf) in btf__distill_base()
5715 struct btf *new_base = NULL, *new_split = NULL; in btf__distill_base()
5716 const struct btf *old_base; in btf__distill_base()
5813 const struct btf_header *btf_header(const struct btf *btf) in btf_header() argument
5815 return btf->hdr; in btf_header()
5818 void btf_set_base_btf(struct btf *btf, const struct btf *base_btf) in btf_set_base_btf() argument
5820 btf->base_btf = (struct btf *)base_btf; in btf_set_base_btf()
5821 btf->start_id = btf__type_cnt(base_btf); in btf_set_base_btf()
5822 btf->start_str_off = base_btf->hdr->str_len; in btf_set_base_btf()
5825 int btf__relocate(struct btf *btf, const struct btf *base_btf) in btf__relocate() argument
5827 int err = btf_relocate(btf, base_btf, NULL); in btf__relocate()
5830 btf->owns_base = false; in btf__relocate()