Lines Matching defs:btf
32 #include <linux/btf.h>
55 #include "btf.h"
477 /* e.g. struct tcp_congestion_ops in bpf_prog's btf format */
601 struct btf *btf;
684 struct btf *btf;
690 struct btf *btf_vmlinux;
696 struct btf *btf_vmlinux_override;
952 find_member_by_name(const struct btf *btf, const struct btf_type *t,
959 if (!strcmp(btf__name_by_offset(btf, m->name_off), name))
967 static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix,
971 find_struct_ops_kern_types(const struct btf *btf, const char *tname,
981 kern_type_id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT);
987 kern_type = btf__type_by_id(btf, kern_type_id);
994 kern_vtype_id = find_btf_by_prefix_kind(btf, STRUCT_OPS_VALUE_PREFIX,
1001 kern_vtype = btf__type_by_id(btf, kern_vtype_id);
1036 const struct btf *btf,
1037 const struct btf *kern_btf)
1081 mname = btf__name_by_offset(btf, member->name_off);
1103 mtype = skip_mods_and_typedefs(btf, member->type, &mtype_id);
1147 msize = btf__resolve_size(btf, mtype_id);
1177 err = bpf_map__init_kern_struct_ops(map, obj->btf,
1194 const struct btf *btf;
1201 btf = obj->btf;
1202 datasec_id = btf__find_by_name_kind(btf, sec_name,
1210 datasec = btf__type_by_id(btf, datasec_id);
1213 type = btf__type_by_id(obj->btf, vsi->type);
1214 var_name = btf__name_by_offset(obj->btf, type->name_off);
1216 type_id = btf__resolve_type(obj->btf, vsi->type);
1223 type = btf__type_by_id(obj->btf, type_id);
1224 tname = btf__name_by_offset(obj->btf, type->name_off);
1703 t = btf__type_by_id(obj->btf, map->btf_value_type_id);
1709 vt = btf__type_by_id(obj->btf, vsi->type);
2162 skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id)
2164 const struct btf_type *t = btf__type_by_id(btf, id);
2172 t = btf__type_by_id(btf, t->type);
2179 resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id)
2183 t = skip_mods_and_typedefs(btf, id, NULL);
2187 t = skip_mods_and_typedefs(btf, t->type, res_id);
2231 static bool get_map_field_int(const char *map_name, const struct btf *btf,
2234 const struct btf_type *t = skip_mods_and_typedefs(btf, m->type, NULL);
2235 const char *name = btf__name_by_offset(btf, m->name_off);
2245 arr_t = btf__type_by_id(btf, t->type);
2296 int parse_btf_map_def(const char *map_name, struct btf *btf,
2308 const char *name = btf__name_by_offset(btf, m->name_off);
2315 if (!get_map_field_int(map_name, btf, m, &map_def->map_type))
2319 if (!get_map_field_int(map_name, btf, m, &map_def->max_entries))
2323 if (!get_map_field_int(map_name, btf, m, &map_def->map_flags))
2327 if (!get_map_field_int(map_name, btf, m, &map_def->numa_node))
2333 if (!get_map_field_int(map_name, btf, m, &sz))
2345 t = btf__type_by_id(btf, m->type);
2356 sz = btf__resolve_size(btf, t->type);
2373 if (!get_map_field_int(map_name, btf, m, &sz))
2385 t = btf__type_by_id(btf, m->type);
2396 sz = btf__resolve_size(btf, t->type);
2439 t = btf__type_by_id(btf, m->type);
2450 t = skip_mods_and_typedefs(btf, btf_array(t)->type, NULL);
2456 t = skip_mods_and_typedefs(btf, t->type, NULL);
2472 err = parse_btf_map_def(inner_map_name, btf, t, strict, inner_def, NULL);
2484 if (!get_map_field_int(map_name, btf, m, &val))
2496 if (!get_map_field_int(map_name, btf, m, &map_extra))
2627 var = btf__type_by_id(obj->btf, vi->type);
2629 map_name = btf__name_by_offset(obj->btf, var->name_off);
2650 def = skip_mods_and_typedefs(obj->btf, var->type, NULL);
2677 err = parse_btf_map_def(map->name, obj->btf, def, strict, &map_def, &inner_def);
2740 nr_types = btf__type_cnt(obj->btf);
2742 t = btf__type_by_id(obj->btf, i);
2745 name = btf__name_by_offset(obj->btf, t->name_off);
2818 static int bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *btf)
2831 for (i = 1; i < btf__type_cnt(btf); i++) {
2832 t = (struct btf_type *)btf__type_by_id(btf, i);
2851 name = (char *)btf__name_by_offset(btf, t->name_off);
2865 vt = (void *)btf__type_by_id(btf, v->type);
2898 enum64_placeholder_id = btf__add_int(btf, "enum64_placeholder", 1, 0);
2902 t = (struct btf_type *)btf__type_by_id(btf, i);
2938 obj->btf = btf__new(btf_data->d_buf, btf_data->d_size);
2939 err = libbpf_get_error(obj->btf);
2941 obj->btf = NULL;
2946 btf__set_pointer_size(obj->btf, 8);
2952 if (!obj->btf) {
2996 sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off);
3033 static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf,
3037 const char *sec_name = btf__name_by_offset(btf, t->name_off);
3082 t_var = btf__type_by_id(btf, vsi->type);
3092 var_name = btf__name_by_offset(btf, t_var->name_off);
3130 if (!obj->btf)
3133 n = btf__type_cnt(obj->btf);
3135 struct btf_type *t = btf_type_by_id(obj->btf, i);
3143 err = btf_fixup_datasec(obj, obj->btf, t);
3220 struct btf *kern_btf = obj->btf;
3224 if (!obj->btf)
3253 n = btf__type_cnt(obj->btf);
3255 t = btf_type_by_id(obj->btf, j);
3259 name = btf__str_by_offset(obj->btf, t->name_off);
3276 n = btf__type_cnt(obj->btf);
3282 t = btf_type_by_id(obj->btf, j);
3286 name = btf__str_by_offset(obj->btf, t->name_off);
3290 t = btf_type_by_id(obj->btf, t->type);
3296 if (strcmp(prog->name, btf__str_by_offset(obj->btf, t->name_off)))
3354 raw_data = btf__raw_data(obj->btf, &sz);
3361 btf__set_pointer_size(obj->btf, 8);
3386 btf__set_fd(obj->btf, btf__fd(kern_btf));
3967 static int find_extern_btf_id(const struct btf *btf, const char *ext_name)
3973 if (!btf)
3976 n = btf__type_cnt(btf);
3978 t = btf__type_by_id(btf, i);
3983 tname = btf__name_by_offset(btf, t->name_off);
4000 static int find_extern_sec_btf_id(struct btf *btf, int ext_btf_id) {
4005 if (!btf)
4008 n = btf__type_cnt(btf);
4010 t = btf__type_by_id(btf, i);
4025 static enum kcfg_type find_kcfg_type(const struct btf *btf, int id,
4031 t = skip_mods_and_typedefs(btf, id, NULL);
4032 name = btf__name_by_offset(btf, t->name_off);
4063 if (find_kcfg_type(btf, btf_array(t)->type, NULL) != KCFG_CHAR)
4092 static int find_int_btf_id(const struct btf *btf)
4097 n = btf__type_cnt(btf);
4099 t = btf__type_by_id(btf, i);
4108 static int add_dummy_ksym_var(struct btf *btf)
4114 if (!btf)
4117 sec_btf_id = btf__find_by_name_kind(btf, KSYMS_SEC,
4122 sec = btf__type_by_id(btf, sec_btf_id);
4127 vt = btf__type_by_id(btf, vs->type);
4136 int_btf_id = find_int_btf_id(btf);
4137 dummy_var_btf_id = btf__add_var(btf,
4175 dummy_var_btf_id = add_dummy_ksym_var(obj->btf);
4202 ext->btf_id = find_extern_btf_id(obj->btf, ext_name);
4208 t = btf__type_by_id(obj->btf, ext->btf_id);
4209 ext->name = btf__name_by_offset(obj->btf, t->name_off);
4221 ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id);
4227 sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id);
4228 sec_name = btf__name_by_offset(obj->btf, sec->name_off);
4238 ext->kcfg.sz = btf__resolve_size(obj->btf, t->type);
4244 ext->kcfg.align = btf__align_of(obj->btf, t->type);
4250 ext->kcfg.type = find_kcfg_type(obj->btf, t->type,
4259 skip_mods_and_typedefs(obj->btf, t->type,
4282 int int_btf_id = find_int_btf_id(obj->btf);
4290 dummy_var = btf__type_by_id(obj->btf, dummy_var_btf_id);
4305 vt = (void *)btf__type_by_id(obj->btf, vs->type);
4306 ext_name = btf__name_by_offset(obj->btf, vt->name_off);
4318 func_proto = btf__type_by_id(obj->btf,
4360 t = btf__type_by_id(obj->btf, vs->type);
4361 ext_name = btf__name_by_offset(obj->btf, t->name_off);
4744 if (!obj->btf)
4761 id = btf__find_by_name(obj->btf, map->real_name);
5522 if (obj->btf && btf__fd(obj->btf) >= 0) {
5523 create_attr.btf_fd = btf__fd(obj->btf);
5860 const struct btf *targ_btf,
5871 local_t = btf__type_by_id(local_cand->btf, local_cand->id);
5872 local_name = btf__str_by_offset(local_cand->btf, local_t->name_off);
5901 cand->btf = targ_btf;
5914 struct btf *btf;
5973 btf = btf_get_from_fd(fd, obj->btf_vmlinux);
5974 err = libbpf_get_error(btf);
5988 mod_btf->btf = btf;
6007 bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id)
6011 const struct btf *main_btf;
6017 local_cand.btf = local_btf;
6053 obj->btf_modules[i].btf,
6086 int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id,
6087 const struct btf *targ_btf, __u32 targ_id)
6092 int bpf_core_types_match(const struct btf *local_btf, __u32 local_id,
6093 const struct btf *targ_btf, __u32 targ_id)
6145 const struct btf *local_btf,
6225 sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off);
6276 err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res);
7054 if (!obj->efile.btf_maps_sec_btf_id || !obj->btf)
7056 sec = btf__type_by_id(obj->btf, obj->efile.btf_maps_sec_btf_id);
7135 var = btf__type_by_id(obj->btf, vi->type);
7136 def = skip_mods_and_typedefs(obj->btf, var->type, NULL);
7140 mname = btf__name_by_offset(obj->btf, member->name_off);
7573 err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec);
7716 kind = btf_is_var(btf__type_by_id(obj->btf, ext->btf_id)) ?
8014 t = btf__type_by_id(obj->btf, ext->btf_id);
8037 __u16 kind, struct btf **res_btf,
8041 struct btf *btf;
8044 btf = obj->btf_vmlinux;
8046 id = btf__find_by_name_kind(btf, ksym_name, kind);
8056 btf = mod_btf->btf;
8057 id = btf__find_by_name_kind_own(btf, ksym_name, kind);
8065 *res_btf = btf;
8077 struct btf *btf = NULL;
8080 id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf);
8093 targ_var = btf__type_by_id(btf, id);
8094 targ_var_name = btf__name_by_offset(btf, targ_var->name_off);
8095 targ_type = skip_mods_and_typedefs(btf, targ_var->type, &targ_type_id);
8097 err = bpf_core_types_are_compat(obj->btf, local_type_id,
8098 btf, targ_type_id);
8103 local_type = btf__type_by_id(obj->btf, local_type_id);
8104 local_name = btf__name_by_offset(obj->btf, local_type->name_off);
8105 targ_name = btf__name_by_offset(btf, targ_type->name_off);
8129 struct btf *kern_btf = NULL;
8147 ret = bpf_core_types_are_compat(obj->btf, local_func_proto_id,
8212 t = btf__type_by_id(obj->btf, ext->btf_id);
8393 if (obj->btf)
8394 btf__set_fd(obj->btf, -1);
8407 btf__free(obj->btf_modules[i].btf);
8891 btf__free(obj->btf);
8929 struct btf *bpf_object__btf(const struct bpf_object *obj)
8931 return obj ? obj->btf : NULL;
8936 return obj->btf ? btf__fd(obj->btf) : -1;
9588 const struct btf *btf;
9597 btf = obj->btf;
9650 name = btf__name_by_offset(btf, member->name_off);
9652 if (!resolve_func_ptr(btf, member->type, NULL)) {
9727 static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix,
9741 return btf__find_by_name_kind(btf, btf_type_name, kind);
9744 static inline int find_attach_btf_id(struct btf *btf, const char *name,
9751 return find_btf_by_prefix_kind(btf, prefix, name, kind);
9757 struct btf *btf;
9760 btf = btf__load_vmlinux_btf();
9761 err = libbpf_get_error(btf);
9767 err = find_attach_btf_id(btf, name, attach_type);
9771 btf__free(btf);
9779 struct btf *btf;
9795 btf = btf__load_from_kernel_by_id(info.btf_id);
9796 err = libbpf_get_error(btf);
9801 err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC);
9802 btf__free(btf);
9833 ret = find_attach_btf_id(mod->btf, attach_name, attach_type);
10021 struct btf *btf;
10029 /* check btf existence */
10030 btf = bpf_object__btf(map->obj);
10031 if (!btf)
10035 datasec_type = btf_type_by_id(btf, bpf_map__btf_value_type_id(map));
10052 var_type = btf_type_by_id(btf, var->type);
10053 array_type = skip_mods_and_typedefs(btf, var_type->type, NULL);
10062 element_sz = btf__resolve_size(btf, array->type);
10071 new_array_id = btf__add_array(btf, array->index_type, array->type, nr_elements);
10075 /* adding a new btf type invalidates existing pointers to btf objects,
10078 datasec_type = btf_type_by_id(btf, map->btf_value_type_id);
10080 var_type = btf_type_by_id(btf, var->type);
10082 /* finally update btf info */
13559 struct btf *btf;
13568 btf = bpf_object__btf(s->obj);
13569 if (!btf) {
13591 map_type = btf__type_by_id(btf, map_type_id);
13603 var_type = btf__type_by_id(btf, var->type);
13604 var_name = btf__name_by_offset(btf, var_type->name_off);