Lines Matching refs:btf
190 struct btf { struct
239 struct btf *btf; member
276 void (*seq_show)(const struct btf *btf, const struct btf_type *t,
423 static bool btf_name_offset_valid(const struct btf *btf, u32 offset) in btf_name_offset_valid() argument
426 offset < btf->hdr.str_len; in btf_name_offset_valid()
429 static const char *btf_name_by_offset(const struct btf *btf, u32 offset) in btf_name_by_offset() argument
433 else if (offset < btf->hdr.str_len) in btf_name_by_offset()
434 return &btf->strings[offset]; in btf_name_by_offset()
439 static const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id) in btf_type_by_id() argument
441 if (type_id > btf->nr_types) in btf_type_by_id()
444 return btf->types[type_id]; in btf_type_by_id()
500 struct btf *btf = env->btf; in __btf_verifier_log_type() local
509 btf_name_by_offset(btf, t->name_off), in __btf_verifier_log_type()
537 struct btf *btf = env->btf; in btf_verifier_log_member() local
553 btf_name_by_offset(btf, member->name_off), in btf_verifier_log_member()
570 const struct btf *btf = env->btf; in btf_verifier_log_hdr() local
576 hdr = &btf->hdr; in btf_verifier_log_hdr()
590 struct btf *btf = env->btf; in btf_add_type() local
596 if (btf->types_size - btf->nr_types < 2) { in btf_add_type()
602 if (btf->types_size == BTF_MAX_TYPE) { in btf_add_type()
607 expand_by = max_t(u32, btf->types_size >> 2, 16); in btf_add_type()
609 btf->types_size + expand_by); in btf_add_type()
616 if (btf->nr_types == 0) in btf_add_type()
619 memcpy(new_types, btf->types, in btf_add_type()
620 sizeof(*btf->types) * (btf->nr_types + 1)); in btf_add_type()
622 kvfree(btf->types); in btf_add_type()
623 btf->types = new_types; in btf_add_type()
624 btf->types_size = new_size; in btf_add_type()
627 btf->types[++(btf->nr_types)] = t; in btf_add_type()
632 static int btf_alloc_id(struct btf *btf) in btf_alloc_id() argument
638 id = idr_alloc_cyclic(&btf_idr, btf, 1, INT_MAX, GFP_ATOMIC); in btf_alloc_id()
640 btf->id = id; in btf_alloc_id()
650 static void btf_free_id(struct btf *btf) in btf_free_id() argument
664 idr_remove(&btf_idr, btf->id); in btf_free_id()
668 static void btf_free(struct btf *btf) in btf_free() argument
670 kvfree(btf->types); in btf_free()
671 kvfree(btf->resolved_sizes); in btf_free()
672 kvfree(btf->resolved_ids); in btf_free()
673 kvfree(btf->data); in btf_free()
674 kfree(btf); in btf_free()
679 struct btf *btf = container_of(rcu, struct btf, rcu); in btf_free_rcu() local
681 btf_free(btf); in btf_free_rcu()
684 void btf_put(struct btf *btf) in btf_put() argument
686 if (btf && refcount_dec_and_test(&btf->refcnt)) { in btf_put()
687 btf_free_id(btf); in btf_put()
688 call_rcu(&btf->rcu, btf_free_rcu); in btf_put()
694 struct btf *btf = env->btf; in env_resolve_init() local
695 u32 nr_types = btf->nr_types; in env_resolve_init()
716 btf->resolved_sizes = resolved_sizes; in env_resolve_init()
717 btf->resolved_ids = resolved_ids; in env_resolve_init()
801 struct btf *btf = env->btf; in env_stack_pop_resolved() local
803 btf->resolved_sizes[type_id] = resolved_size; in env_stack_pop_resolved()
804 btf->resolved_ids[type_id] = resolved_type_id; in env_stack_pop_resolved()
814 static const struct btf_type *btf_type_id_resolve(const struct btf *btf, in btf_type_id_resolve() argument
817 *type_id = btf->resolved_ids[*type_id]; in btf_type_id_resolve()
818 return btf_type_by_id(btf, *type_id); in btf_type_id_resolve()
821 const struct btf_type *btf_type_id_size(const struct btf *btf, in btf_type_id_size() argument
828 size_type = btf_type_by_id(btf, size_type_id); in btf_type_id_size()
835 size = btf->resolved_sizes[size_type_id]; in btf_type_id_size()
842 size = btf->resolved_sizes[size_type_id]; in btf_type_id_size()
843 size_type_id = btf->resolved_ids[size_type_id]; in btf_type_id_size()
844 size_type = btf_type_by_id(btf, size_type_id); in btf_type_id_size()
873 static void btf_df_seq_show(const struct btf *btf, const struct btf_type *t, in btf_df_seq_show() argument
989 static void btf_int_bits_seq_show(const struct btf *btf, in btf_int_bits_seq_show() argument
1028 static void btf_int_seq_show(const struct btf *btf, const struct btf_type *t, in btf_int_seq_show() argument
1039 btf_int_bits_seq_show(btf, t, data, bits_offset, m); in btf_int_seq_show()
1069 btf_int_bits_seq_show(btf, t, data, bits_offset, m); in btf_int_seq_show()
1089 struct btf *btf = env->btf; in btf_modifier_check_member() local
1091 resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL); in btf_modifier_check_member()
1157 struct btf *btf = env->btf; in btf_modifier_resolve() local
1160 next_type = btf_type_by_id(btf, next_type_id); in btf_modifier_resolve()
1180 if (!btf_type_id_size(btf, &next_type_id, &next_type_size) && in btf_modifier_resolve()
1181 !btf_type_is_void(btf_type_id_resolve(btf, &next_type_id))) { in btf_modifier_resolve()
1198 struct btf *btf = env->btf; in btf_ptr_resolve() local
1201 next_type = btf_type_by_id(btf, next_type_id); in btf_ptr_resolve()
1228 resolved_type = btf_type_id_resolve(btf, &resolved_type_id); in btf_ptr_resolve()
1237 if (!btf_type_id_size(btf, &next_type_id, &next_type_size) && in btf_ptr_resolve()
1238 !btf_type_is_void(btf_type_id_resolve(btf, &next_type_id))) { in btf_ptr_resolve()
1249 static void btf_modifier_seq_show(const struct btf *btf, in btf_modifier_seq_show() argument
1254 t = btf_type_id_resolve(btf, &type_id); in btf_modifier_seq_show()
1256 btf_type_ops(t)->seq_show(btf, t, type_id, data, bits_offset, m); in btf_modifier_seq_show()
1259 static void btf_ptr_seq_show(const struct btf *btf, const struct btf_type *t, in btf_ptr_seq_show() argument
1324 struct btf *btf = env->btf; in btf_array_check_member() local
1333 btf_type_id_size(btf, &array_type_id, &array_size); in btf_array_check_member()
1393 struct btf *btf = env->btf; in btf_array_resolve() local
1398 index_type = btf_type_by_id(btf, index_type_id); in btf_array_resolve()
1408 index_type = btf_type_id_size(btf, &index_type_id, NULL); in btf_array_resolve()
1417 elem_type = btf_type_by_id(btf, elem_type_id); in btf_array_resolve()
1428 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_array_resolve()
1459 static void btf_array_seq_show(const struct btf *btf, const struct btf_type *t, in btf_array_seq_show() argument
1469 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_array_seq_show()
1476 elem_ops->seq_show(btf, elem_type, elem_type_id, data, in btf_array_seq_show()
1523 struct btf *btf = env->btf; in btf_struct_check_meta() local
1539 if (!btf_name_offset_valid(btf, member->name_off)) { in btf_struct_check_meta()
1604 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
1615 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
1648 static void btf_struct_seq_show(const struct btf *btf, const struct btf_type *t, in btf_struct_seq_show() argument
1658 const struct btf_type *member_type = btf_type_by_id(btf, in btf_struct_seq_show()
1669 ops->seq_show(btf, member_type, member->type, in btf_struct_seq_show()
1713 struct btf *btf = env->btf; in btf_enum_check_meta() local
1736 if (!btf_name_offset_valid(btf, enums[i].name_off)) { in btf_enum_check_meta()
1743 btf_name_by_offset(btf, enums[i].name_off), in btf_enum_check_meta()
1756 static void btf_enum_seq_show(const struct btf *btf, const struct btf_type *t, in btf_enum_seq_show() argument
1767 btf_name_by_offset(btf, enums[i].name_off)); in btf_enum_seq_show()
1824 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
1841 struct btf *btf = env->btf; in btf_check_all_metas() local
1845 hdr = &btf->hdr; in btf_check_all_metas()
1846 cur = btf->nohdr_data + hdr->type_off; in btf_check_all_metas()
1894 struct btf *btf = env->btf; in btf_resolve_valid() local
1900 return !btf->resolved_ids[type_id] && in btf_resolve_valid()
1901 !btf->resolved_sizes[type_id]; in btf_resolve_valid()
1904 t = btf_type_id_resolve(btf, &type_id); in btf_resolve_valid()
1914 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_resolve_valid()
1917 btf->resolved_sizes[type_id]); in btf_resolve_valid()
1925 struct btf *btf = env->btf; in btf_check_all_types() local
1934 for (type_id = 1; type_id <= btf->nr_types; type_id++) { in btf_check_all_types()
1935 const struct btf_type *t = btf_type_by_id(btf, type_id); in btf_check_all_types()
1957 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
1981 struct btf *btf = env->btf; in btf_parse_str_sec() local
1984 hdr = &btf->hdr; in btf_parse_str_sec()
1985 start = btf->nohdr_data + hdr->str_off; in btf_parse_str_sec()
1988 if (end != btf->data + btf->data_size) { in btf_parse_str_sec()
1999 btf->strings = start; in btf_parse_str_sec()
2023 const struct btf *btf; in btf_check_sec_info() local
2025 btf = env->btf; in btf_check_sec_info()
2026 hdr = &btf->hdr; in btf_check_sec_info()
2085 struct btf *btf; in btf_parse_hdr() local
2088 btf = env->btf; in btf_parse_hdr()
2104 err = bpf_check_uarg_tail_zero(btf_data, sizeof(btf->hdr), hdr_len); in btf_parse_hdr()
2111 hdr_copy = min_t(u32, hdr_len, sizeof(btf->hdr)); in btf_parse_hdr()
2112 if (copy_from_user(&btf->hdr, btf_data, hdr_copy)) in btf_parse_hdr()
2115 hdr = &btf->hdr; in btf_parse_hdr()
2146 static struct btf *btf_parse(void __user *btf_data, u32 btf_data_size, in btf_parse()
2151 struct btf *btf = NULL; in btf_parse() local
2179 btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
2180 if (!btf) { in btf_parse()
2184 env->btf = btf; in btf_parse()
2196 btf->data = data; in btf_parse()
2197 btf->data_size = btf_data_size; in btf_parse()
2198 btf->nohdr_data = btf->data + btf->hdr.hdr_len; in btf_parse()
2219 refcount_set(&btf->refcnt, 1); in btf_parse()
2220 return btf; in btf_parse()
2224 if (btf) in btf_parse()
2225 btf_free(btf); in btf_parse()
2229 void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj, in btf_type_seq_show() argument
2232 const struct btf_type *t = btf_type_by_id(btf, type_id); in btf_type_seq_show()
2234 btf_type_ops(t)->seq_show(btf, t, type_id, obj, 0, m); in btf_type_seq_show()
2247 static int __btf_new_fd(struct btf *btf) in __btf_new_fd() argument
2249 return anon_inode_getfd("btf", &btf_fops, btf, O_RDONLY | O_CLOEXEC); in __btf_new_fd()
2254 struct btf *btf; in btf_new_fd() local
2257 btf = btf_parse(u64_to_user_ptr(attr->btf), in btf_new_fd()
2261 if (IS_ERR(btf)) in btf_new_fd()
2262 return PTR_ERR(btf); in btf_new_fd()
2264 ret = btf_alloc_id(btf); in btf_new_fd()
2266 btf_free(btf); in btf_new_fd()
2276 ret = __btf_new_fd(btf); in btf_new_fd()
2278 btf_put(btf); in btf_new_fd()
2283 struct btf *btf_get_by_fd(int fd) in btf_get_by_fd()
2285 struct btf *btf; in btf_get_by_fd() local
2298 btf = f.file->private_data; in btf_get_by_fd()
2299 refcount_inc(&btf->refcnt); in btf_get_by_fd()
2302 return btf; in btf_get_by_fd()
2305 int btf_get_info_by_fd(const struct btf *btf, in btf_get_info_by_fd() argument
2322 info.id = btf->id; in btf_get_info_by_fd()
2323 ubtf = u64_to_user_ptr(info.btf); in btf_get_info_by_fd()
2324 btf_copy = min_t(u32, btf->data_size, info.btf_size); in btf_get_info_by_fd()
2325 if (copy_to_user(ubtf, btf->data, btf_copy)) in btf_get_info_by_fd()
2327 info.btf_size = btf->data_size; in btf_get_info_by_fd()
2338 struct btf *btf; in btf_get_fd_by_id() local
2342 btf = idr_find(&btf_idr, id); in btf_get_fd_by_id()
2343 if (!btf || !refcount_inc_not_zero(&btf->refcnt)) in btf_get_fd_by_id()
2344 btf = ERR_PTR(-ENOENT); in btf_get_fd_by_id()
2347 if (IS_ERR(btf)) in btf_get_fd_by_id()
2348 return PTR_ERR(btf); in btf_get_fd_by_id()
2350 fd = __btf_new_fd(btf); in btf_get_fd_by_id()
2352 btf_put(btf); in btf_get_fd_by_id()
2357 u32 btf_id(const struct btf *btf) in btf_id() argument
2359 return btf->id; in btf_id()