Lines Matching refs:btf_ext
1194 struct btf_ext **btf_ext)
1270 if (btf_ext && secs.btf_ext_data) {
1271 *btf_ext = btf_ext__new(secs.btf_ext_data->d_buf, secs.btf_ext_data->d_size);
1272 if (IS_ERR(*btf_ext)) {
1273 err = PTR_ERR(*btf_ext);
1276 } else if (btf_ext) {
1277 *btf_ext = NULL;
1287 if (btf_ext)
1288 btf_ext__free(*btf_ext);
1295 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1297 return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1409 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1414 if (btf_ext)
1415 *btf_ext = NULL;
1423 return btf_parse_elf(path, base_btf, btf_ext);
1426 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1428 return libbpf_ptr(btf_parse(path, NULL, btf_ext));
3008 * - save info subsection start and sizing details in struct btf_ext
3011 static int btf_ext_parse_sec_info(struct btf_ext *btf_ext,
3031 info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
3034 if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
3108 static int btf_ext_parse_info(struct btf_ext *btf_ext, bool is_native)
3111 .off = btf_ext->hdr->func_info_off,
3112 .len = btf_ext->hdr->func_info_len,
3114 .ext_info = &btf_ext->func_info,
3118 .off = btf_ext->hdr->line_info_off,
3119 .len = btf_ext->hdr->line_info_len,
3121 .ext_info = &btf_ext->line_info,
3126 .ext_info = &btf_ext->core_relo_info,
3131 err = btf_ext_parse_sec_info(btf_ext, &func_info, is_native);
3135 err = btf_ext_parse_sec_info(btf_ext, &line_info, is_native);
3139 if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
3142 core_relo.off = btf_ext->hdr->core_relo_off;
3143 core_relo.len = btf_ext->hdr->core_relo_len;
3144 err = btf_ext_parse_sec_info(btf_ext, &core_relo, is_native);
3209 static void btf_ext_bswap_info(struct btf_ext *btf_ext, void *data)
3211 const bool is_native = btf_ext->swapped_endian;
3235 static int btf_ext_parse(struct btf_ext *btf_ext)
3237 __u32 hdr_len, data_size = btf_ext->data_size;
3238 struct btf_ext_header *hdr = btf_ext->hdr;
3283 btf_ext_bswap_hdr(btf_ext->hdr);
3286 err = btf_ext_parse_info(btf_ext, !swapped_endian);
3292 btf_ext_bswap_info(btf_ext, btf_ext->data);
3295 * Set btf_ext->swapped_endian only after all header and info data has
3299 btf_ext->swapped_endian = swapped_endian;
3303 void btf_ext__free(struct btf_ext *btf_ext)
3305 if (IS_ERR_OR_NULL(btf_ext))
3307 free(btf_ext->func_info.sec_idxs);
3308 free(btf_ext->line_info.sec_idxs);
3309 free(btf_ext->core_relo_info.sec_idxs);
3310 free(btf_ext->data);
3311 free(btf_ext->data_swapped);
3312 free(btf_ext);
3315 struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
3317 struct btf_ext *btf_ext;
3320 btf_ext = calloc(1, sizeof(struct btf_ext));
3321 if (!btf_ext)
3324 btf_ext->data_size = size;
3325 btf_ext->data = malloc(size);
3326 if (!btf_ext->data) {
3330 memcpy(btf_ext->data, data, size);
3332 err = btf_ext_parse(btf_ext);
3336 btf_ext__free(btf_ext);
3340 return btf_ext;
3343 static void *btf_ext_raw_data(const struct btf_ext *btf_ext_ro, bool swap_endian)
3345 struct btf_ext *btf_ext = (struct btf_ext *)btf_ext_ro;
3346 const __u32 data_sz = btf_ext->data_size;
3351 return btf_ext->data;
3352 else if (btf_ext->data_swapped)
3353 return btf_ext->data_swapped;
3359 memcpy(data, btf_ext->data, data_sz);
3361 btf_ext_bswap_info(btf_ext, data);
3363 btf_ext->data_swapped = data;
3367 const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size)
3371 data = btf_ext_raw_data(btf_ext, btf_ext->swapped_endian);
3375 *size = btf_ext->data_size;
3380 const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size);
3382 enum btf_endianness btf_ext__endianness(const struct btf_ext *btf_ext)
3385 return btf_ext->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
3387 return btf_ext->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
3390 int btf_ext__set_endianness(struct btf_ext *btf_ext, enum btf_endianness endian)
3395 btf_ext->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
3397 if (!btf_ext->swapped_endian) {
3398 free(btf_ext->data_swapped);
3399 btf_ext->data_swapped = NULL;
3423 * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section
3630 struct btf_ext *btf_ext;
3744 d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3812 if (!d->btf_ext)
3815 r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
5347 if (!d->btf_ext)
5350 r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
5429 int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
5435 seg = &btf_ext->func_info;
5446 seg = &btf_ext->core_relo_info;
5460 int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
5466 seg = &btf_ext->func_info;
5473 seg = &btf_ext->line_info;
5491 seg = &btf_ext->core_relo_info;