Lines Matching refs:btf

201 struct btf {  struct
250 struct btf *btf; member
295 void (*seq_show)(const struct btf *btf, const struct btf_type *t,
523 static bool btf_name_offset_valid(const struct btf *btf, u32 offset) in btf_name_offset_valid() argument
526 offset < btf->hdr.str_len; in btf_name_offset_valid()
540 static bool __btf_name_valid(const struct btf *btf, u32 offset, bool dot_ok) in __btf_name_valid() argument
543 const char *src = &btf->strings[offset]; in __btf_name_valid()
564 static bool btf_name_valid_identifier(const struct btf *btf, u32 offset) in btf_name_valid_identifier() argument
566 return __btf_name_valid(btf, offset, false); in btf_name_valid_identifier()
569 static bool btf_name_valid_section(const struct btf *btf, u32 offset) in btf_name_valid_section() argument
571 return __btf_name_valid(btf, offset, true); in btf_name_valid_section()
574 static const char *__btf_name_by_offset(const struct btf *btf, u32 offset) in __btf_name_by_offset() argument
578 else if (offset < btf->hdr.str_len) in __btf_name_by_offset()
579 return &btf->strings[offset]; in __btf_name_by_offset()
584 const char *btf_name_by_offset(const struct btf *btf, u32 offset) in btf_name_by_offset() argument
586 if (offset < btf->hdr.str_len) in btf_name_by_offset()
587 return &btf->strings[offset]; in btf_name_by_offset()
592 const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id) in btf_type_by_id() argument
594 if (type_id > btf->nr_types) in btf_type_by_id()
597 return btf->types[type_id]; in btf_type_by_id()
627 bool btf_member_is_reg_int(const struct btf *btf, const struct btf_type *s, in btf_member_is_reg_int() argument
636 t = btf_type_id_size(btf, &id, NULL); in btf_member_is_reg_int()
695 struct btf *btf = env->btf; in __btf_verifier_log_type() local
704 __btf_name_by_offset(btf, t->name_off), in __btf_verifier_log_type()
732 struct btf *btf = env->btf; in btf_verifier_log_member() local
750 __btf_name_by_offset(btf, member->name_off), in btf_verifier_log_member()
756 __btf_name_by_offset(btf, member->name_off), in btf_verifier_log_member()
799 const struct btf *btf = env->btf; in btf_verifier_log_hdr() local
805 hdr = &btf->hdr; in btf_verifier_log_hdr()
819 struct btf *btf = env->btf; in btf_add_type() local
825 if (btf->types_size - btf->nr_types < 2) { in btf_add_type()
831 if (btf->types_size == BTF_MAX_TYPE) { in btf_add_type()
836 expand_by = max_t(u32, btf->types_size >> 2, 16); in btf_add_type()
838 btf->types_size + expand_by); in btf_add_type()
845 if (btf->nr_types == 0) in btf_add_type()
848 memcpy(new_types, btf->types, in btf_add_type()
849 sizeof(*btf->types) * (btf->nr_types + 1)); in btf_add_type()
851 kvfree(btf->types); in btf_add_type()
852 btf->types = new_types; in btf_add_type()
853 btf->types_size = new_size; in btf_add_type()
856 btf->types[++(btf->nr_types)] = t; in btf_add_type()
861 static int btf_alloc_id(struct btf *btf) in btf_alloc_id() argument
867 id = idr_alloc_cyclic(&btf_idr, btf, 1, INT_MAX, GFP_ATOMIC); in btf_alloc_id()
869 btf->id = id; in btf_alloc_id()
879 static void btf_free_id(struct btf *btf) in btf_free_id() argument
893 idr_remove(&btf_idr, btf->id); in btf_free_id()
897 static void btf_free(struct btf *btf) in btf_free() argument
899 kvfree(btf->types); in btf_free()
900 kvfree(btf->resolved_sizes); in btf_free()
901 kvfree(btf->resolved_ids); in btf_free()
902 kvfree(btf->data); in btf_free()
903 kfree(btf); in btf_free()
908 struct btf *btf = container_of(rcu, struct btf, rcu); in btf_free_rcu() local
910 btf_free(btf); in btf_free_rcu()
913 void btf_put(struct btf *btf) in btf_put() argument
915 if (btf && refcount_dec_and_test(&btf->refcnt)) { in btf_put()
916 btf_free_id(btf); in btf_put()
917 call_rcu(&btf->rcu, btf_free_rcu); in btf_put()
923 struct btf *btf = env->btf; in env_resolve_init() local
924 u32 nr_types = btf->nr_types; in env_resolve_init()
945 btf->resolved_sizes = resolved_sizes; in env_resolve_init()
946 btf->resolved_ids = resolved_ids; in env_resolve_init()
1034 struct btf *btf = env->btf; in env_stack_pop_resolved() local
1036 btf->resolved_sizes[type_id] = resolved_size; in env_stack_pop_resolved()
1037 btf->resolved_ids[type_id] = resolved_type_id; in env_stack_pop_resolved()
1047 static const struct btf_type *btf_type_id_resolve(const struct btf *btf, in btf_type_id_resolve() argument
1050 *type_id = btf->resolved_ids[*type_id]; in btf_type_id_resolve()
1051 return btf_type_by_id(btf, *type_id); in btf_type_id_resolve()
1054 const struct btf_type *btf_type_id_size(const struct btf *btf, in btf_type_id_size() argument
1061 size_type = btf_type_by_id(btf, size_type_id); in btf_type_id_size()
1068 size = btf->resolved_sizes[size_type_id]; in btf_type_id_size()
1076 size_type_id = btf->resolved_ids[size_type_id]; in btf_type_id_size()
1077 size_type = btf_type_by_id(btf, size_type_id); in btf_type_id_size()
1083 size = btf->resolved_sizes[size_type_id]; in btf_type_id_size()
1146 static void btf_df_seq_show(const struct btf *btf, const struct btf_type *t, in btf_df_seq_show() argument
1413 static void btf_int_bits_seq_show(const struct btf *btf, in btf_int_bits_seq_show() argument
1432 static void btf_int_seq_show(const struct btf *btf, const struct btf_type *t, in btf_int_seq_show() argument
1443 btf_int_bits_seq_show(btf, t, data, bits_offset, m); in btf_int_seq_show()
1476 btf_int_bits_seq_show(btf, t, data, bits_offset, m); in btf_int_seq_show()
1497 struct btf *btf = env->btf; in btf_modifier_check_member() local
1499 resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL); in btf_modifier_check_member()
1522 struct btf *btf = env->btf; in btf_modifier_check_kflag_member() local
1524 resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL); in btf_modifier_check_kflag_member()
1589 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
1611 struct btf *btf = env->btf; in btf_modifier_resolve() local
1613 next_type = btf_type_by_id(btf, next_type_id); in btf_modifier_resolve()
1629 if (!btf_type_id_size(btf, &next_type_id, NULL)) { in btf_modifier_resolve()
1631 next_type = btf_type_id_resolve(btf, &next_type_id); in btf_modifier_resolve()
1653 struct btf *btf = env->btf; in btf_var_resolve() local
1655 next_type = btf_type_by_id(btf, next_type_id); in btf_var_resolve()
1670 resolved_type = btf_type_id_resolve(btf, &resolved_type_id); in btf_var_resolve()
1683 if (!btf_type_id_size(btf, &next_type_id, NULL)) { in btf_var_resolve()
1699 struct btf *btf = env->btf; in btf_ptr_resolve() local
1701 next_type = btf_type_by_id(btf, next_type_id); in btf_ptr_resolve()
1724 resolved_type = btf_type_id_resolve(btf, &resolved_type_id); in btf_ptr_resolve()
1733 if (!btf_type_id_size(btf, &next_type_id, NULL)) { in btf_ptr_resolve()
1735 next_type = btf_type_id_resolve(btf, &next_type_id); in btf_ptr_resolve()
1750 static void btf_modifier_seq_show(const struct btf *btf, in btf_modifier_seq_show() argument
1755 t = btf_type_id_resolve(btf, &type_id); in btf_modifier_seq_show()
1757 btf_type_ops(t)->seq_show(btf, t, type_id, data, bits_offset, m); in btf_modifier_seq_show()
1760 static void btf_var_seq_show(const struct btf *btf, const struct btf_type *t, in btf_var_seq_show() argument
1764 t = btf_type_id_resolve(btf, &type_id); in btf_var_seq_show()
1766 btf_type_ops(t)->seq_show(btf, t, type_id, data, bits_offset, m); in btf_var_seq_show()
1769 static void btf_ptr_seq_show(const struct btf *btf, const struct btf_type *t, in btf_ptr_seq_show() argument
1817 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
1850 struct btf *btf = env->btf; in btf_array_check_member() local
1859 btf_type_id_size(btf, &array_type_id, &array_size); in btf_array_check_member()
1930 struct btf *btf = env->btf; in btf_array_resolve() local
1935 index_type = btf_type_by_id(btf, index_type_id); in btf_array_resolve()
1946 index_type = btf_type_id_size(btf, &index_type_id, NULL); in btf_array_resolve()
1955 elem_type = btf_type_by_id(btf, elem_type_id); in btf_array_resolve()
1967 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_array_resolve()
1998 static void btf_array_seq_show(const struct btf *btf, const struct btf_type *t, in btf_array_seq_show() argument
2008 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_array_seq_show()
2015 elem_ops->seq_show(btf, elem_type, elem_type_id, data, in btf_array_seq_show()
2063 struct btf *btf = env->btf; in btf_struct_check_meta() local
2078 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
2087 if (!btf_name_offset_valid(btf, member->name_off)) { in btf_struct_check_meta()
2096 !btf_name_valid_identifier(btf, member->name_off)) { in btf_struct_check_meta()
2159 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
2175 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
2218 int btf_find_spin_lock(const struct btf *btf, const struct btf_type *t) in btf_find_spin_lock() argument
2227 const struct btf_type *member_type = btf_type_by_id(btf, in btf_find_spin_lock()
2233 if (strcmp(__btf_name_by_offset(btf, member_type->name_off), in btf_find_spin_lock()
2251 static void btf_struct_seq_show(const struct btf *btf, const struct btf_type *t, in btf_struct_seq_show() argument
2261 const struct btf_type *member_type = btf_type_by_id(btf, in btf_struct_seq_show()
2280 ops->seq_show(btf, member_type, member->type, in btf_struct_seq_show()
2361 struct btf *btf = env->btf; in btf_enum_check_meta() local
2387 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
2395 if (!btf_name_offset_valid(btf, enums[i].name_off)) { in btf_enum_check_meta()
2403 !btf_name_valid_identifier(btf, enums[i].name_off)) { in btf_enum_check_meta()
2410 __btf_name_by_offset(btf, enums[i].name_off), in btf_enum_check_meta()
2423 static void btf_enum_seq_show(const struct btf *btf, const struct btf_type *t, in btf_enum_seq_show() argument
2434 __btf_name_by_offset(btf, in btf_enum_seq_show()
2499 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2503 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2511 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2544 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
2598 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
2669 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
2719 struct btf *btf = env->btf; in btf_datasec_resolve() local
2724 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
2739 if (!btf_type_id_size(btf, &type_id, &type_size)) { in btf_datasec_resolve()
2760 static void btf_datasec_seq_show(const struct btf *btf, in btf_datasec_seq_show() argument
2769 seq_printf(m, "section (\"%s\") = {", __btf_name_by_offset(btf, t->name_off)); in btf_datasec_seq_show()
2771 var = btf_type_by_id(btf, vsi->type); in btf_datasec_seq_show()
2774 btf_type_ops(var)->seq_show(btf, var, vsi->type, in btf_datasec_seq_show()
2794 const struct btf *btf; in btf_func_proto_check() local
2798 btf = env->btf; in btf_func_proto_check()
2806 ret_type = btf_type_by_id(btf, ret_type_id); in btf_func_proto_check()
2820 if (!btf_type_id_size(btf, &ret_type_id, NULL)) { in btf_func_proto_check()
2845 arg_type = btf_type_by_id(btf, arg_type_id); in btf_func_proto_check()
2853 (!btf_name_offset_valid(btf, args[i].name_off) || in btf_func_proto_check()
2854 !btf_name_valid_identifier(btf, args[i].name_off))) { in btf_func_proto_check()
2868 if (!btf_type_id_size(btf, &arg_type_id, NULL)) { in btf_func_proto_check()
2883 const struct btf *btf; in btf_func_check() local
2886 btf = env->btf; in btf_func_check()
2887 proto_type = btf_type_by_id(btf, t->type); in btf_func_check()
2951 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
2968 struct btf *btf = env->btf; in btf_check_all_metas() local
2972 hdr = &btf->hdr; in btf_check_all_metas()
2973 cur = btf->nohdr_data + hdr->type_off; in btf_check_all_metas()
2997 struct btf *btf = env->btf; in btf_resolve_valid() local
3003 return !btf->resolved_ids[type_id] && in btf_resolve_valid()
3004 !btf->resolved_sizes[type_id]; in btf_resolve_valid()
3008 t = btf_type_id_resolve(btf, &type_id); in btf_resolve_valid()
3021 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size); in btf_resolve_valid()
3024 btf->resolved_sizes[type_id]); in btf_resolve_valid()
3065 struct btf *btf = env->btf; in btf_check_all_types() local
3074 for (type_id = 1; type_id <= btf->nr_types; type_id++) { in btf_check_all_types()
3075 const struct btf_type *t = btf_type_by_id(btf, type_id); in btf_check_all_types()
3103 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
3127 struct btf *btf = env->btf; in btf_parse_str_sec() local
3130 hdr = &btf->hdr; in btf_parse_str_sec()
3131 start = btf->nohdr_data + hdr->str_off; in btf_parse_str_sec()
3134 if (end != btf->data + btf->data_size) { in btf_parse_str_sec()
3145 btf->strings = start; in btf_parse_str_sec()
3169 const struct btf *btf; in btf_check_sec_info() local
3171 btf = env->btf; in btf_check_sec_info()
3172 hdr = &btf->hdr; in btf_check_sec_info()
3220 struct btf *btf; in btf_parse_hdr() local
3223 btf = env->btf; in btf_parse_hdr()
3224 btf_data_size = btf->data_size; in btf_parse_hdr()
3232 hdr = btf->data; in btf_parse_hdr()
3240 if (hdr_len > sizeof(btf->hdr)) { in btf_parse_hdr()
3241 u8 *expected_zero = btf->data + sizeof(btf->hdr); in btf_parse_hdr()
3242 u8 *end = btf->data + hdr_len; in btf_parse_hdr()
3252 hdr_copy = min_t(u32, hdr_len, sizeof(btf->hdr)); in btf_parse_hdr()
3253 memcpy(&btf->hdr, btf->data, hdr_copy); in btf_parse_hdr()
3255 hdr = &btf->hdr; in btf_parse_hdr()
3286 static struct btf *btf_parse(void __user *btf_data, u32 btf_data_size, in btf_parse()
3291 struct btf *btf = NULL; in btf_parse() local
3319 btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
3320 if (!btf) { in btf_parse()
3324 env->btf = btf; in btf_parse()
3332 btf->data = data; in btf_parse()
3333 btf->data_size = btf_data_size; in btf_parse()
3344 btf->nohdr_data = btf->data + btf->hdr.hdr_len; in btf_parse()
3360 refcount_set(&btf->refcnt, 1); in btf_parse()
3361 return btf; in btf_parse()
3365 if (btf) in btf_parse()
3366 btf_free(btf); in btf_parse()
3370 void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj, in btf_type_seq_show() argument
3373 const struct btf_type *t = btf_type_by_id(btf, type_id); in btf_type_seq_show()
3375 btf_type_ops(t)->seq_show(btf, t, type_id, obj, 0, m); in btf_type_seq_show()
3381 const struct btf *btf = filp->private_data; in bpf_btf_show_fdinfo() local
3383 seq_printf(m, "btf_id:\t%u\n", btf->id); in bpf_btf_show_fdinfo()
3400 static int __btf_new_fd(struct btf *btf) in __btf_new_fd() argument
3402 return anon_inode_getfd("btf", &btf_fops, btf, O_RDONLY | O_CLOEXEC); in __btf_new_fd()
3407 struct btf *btf; in btf_new_fd() local
3410 btf = btf_parse(u64_to_user_ptr(attr->btf), in btf_new_fd()
3414 if (IS_ERR(btf)) in btf_new_fd()
3415 return PTR_ERR(btf); in btf_new_fd()
3417 ret = btf_alloc_id(btf); in btf_new_fd()
3419 btf_free(btf); in btf_new_fd()
3429 ret = __btf_new_fd(btf); in btf_new_fd()
3431 btf_put(btf); in btf_new_fd()
3436 struct btf *btf_get_by_fd(int fd) in btf_get_by_fd()
3438 struct btf *btf; in btf_get_by_fd() local
3451 btf = f.file->private_data; in btf_get_by_fd()
3452 refcount_inc(&btf->refcnt); in btf_get_by_fd()
3455 return btf; in btf_get_by_fd()
3458 int btf_get_info_by_fd(const struct btf *btf, in btf_get_info_by_fd() argument
3475 info.id = btf->id; in btf_get_info_by_fd()
3476 ubtf = u64_to_user_ptr(info.btf); in btf_get_info_by_fd()
3477 btf_copy = min_t(u32, btf->data_size, info.btf_size); in btf_get_info_by_fd()
3478 if (copy_to_user(ubtf, btf->data, btf_copy)) in btf_get_info_by_fd()
3480 info.btf_size = btf->data_size; in btf_get_info_by_fd()
3491 struct btf *btf; in btf_get_fd_by_id() local
3495 btf = idr_find(&btf_idr, id); in btf_get_fd_by_id()
3496 if (!btf || !refcount_inc_not_zero(&btf->refcnt)) in btf_get_fd_by_id()
3497 btf = ERR_PTR(-ENOENT); in btf_get_fd_by_id()
3500 if (IS_ERR(btf)) in btf_get_fd_by_id()
3501 return PTR_ERR(btf); in btf_get_fd_by_id()
3503 fd = __btf_new_fd(btf); in btf_get_fd_by_id()
3505 btf_put(btf); in btf_get_fd_by_id()
3510 u32 btf_id(const struct btf *btf) in btf_id() argument
3512 return btf->id; in btf_id()