blob: 88a52ae56fc6b9d3692d367ab1b3e693c77157c9 [file] [log] [blame]
Alexei Starovoitov1bc38b82018-10-05 16:40:00 -07001/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -07002/* Copyright (c) 2018 Facebook */
3
Andrey Ignatoveff81902018-10-03 15:26:42 -07004#ifndef __LIBBPF_BTF_H
5#define __LIBBPF_BTF_H
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -07006
Andrii Nakryiko351131b2019-05-24 11:59:03 -07007#include <stdarg.h>
Martin KaFai Lau5b891af2018-07-24 08:40:21 -07008#include <linux/types.h>
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -07009
Stanislav Fomichev8c4905b2018-11-21 09:29:44 -080010#ifdef __cplusplus
11extern "C" {
12#endif
13
Andrey Ignatovab9e0842018-10-15 22:50:34 -070014#ifndef LIBBPF_API
15#define LIBBPF_API __attribute__((visibility("default")))
16#endif
17
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -070018#define BTF_ELF_SEC ".BTF"
Yonghong Song2993e052018-11-19 15:29:16 -080019#define BTF_EXT_ELF_SEC ".BTF.ext"
Andrii Nakryikoabd29c92019-06-17 12:26:56 -070020#define MAPS_ELF_SEC ".maps"
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -070021
22struct btf;
Yonghong Song2993e052018-11-19 15:29:16 -080023struct btf_ext;
Martin KaFai Lau38d5d3b2018-07-24 08:40:22 -070024struct btf_type;
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -070025
Daniel Borkmann1713d682019-04-09 23:20:14 +020026struct bpf_object;
27
Yonghong Song2993e052018-11-19 15:29:16 -080028/*
29 * The .BTF.ext ELF section layout defined as
30 * struct btf_ext_header
31 * func_info subsection
32 *
33 * The func_info subsection layout:
34 * record size for struct bpf_func_info in the func_info subsection
35 * struct btf_sec_func_info for section #1
36 * a list of bpf_func_info records for section #1
37 * where struct bpf_func_info mimics one in include/uapi/linux/bpf.h
38 * but may not be identical
39 * struct btf_sec_func_info for section #2
40 * a list of bpf_func_info records for section #2
41 * ......
42 *
43 * Note that the bpf_func_info record size in .BTF.ext may not
44 * be the same as the one defined in include/uapi/linux/bpf.h.
45 * The loader should ensure that record_size meets minimum
46 * requirement and pass the record as is to the kernel. The
47 * kernel will handle the func_info properly based on its contents.
48 */
49struct btf_ext_header {
50 __u16 magic;
51 __u8 version;
52 __u8 flags;
53 __u32 hdr_len;
54
55 /* All offsets are in bytes relative to the end of this header */
56 __u32 func_info_off;
57 __u32 func_info_len;
Martin KaFai Lau3d650142018-12-07 16:42:31 -080058 __u32 line_info_off;
59 __u32 line_info_len;
Yonghong Song2993e052018-11-19 15:29:16 -080060};
61
Andrey Ignatovab9e0842018-10-15 22:50:34 -070062LIBBPF_API void btf__free(struct btf *btf);
Yonghong Song8461ef82019-02-01 16:14:14 -080063LIBBPF_API struct btf *btf__new(__u8 *data, __u32 size);
Andrii Nakryikoe6c64852019-05-24 11:58:57 -070064LIBBPF_API struct btf *btf__parse_elf(const char *path,
65 struct btf_ext **btf_ext);
Daniel Borkmann1713d682019-04-09 23:20:14 +020066LIBBPF_API int btf__finalize_data(struct bpf_object *obj, struct btf *btf);
Andrii Nakryikod29d87f2019-02-08 11:19:36 -080067LIBBPF_API int btf__load(struct btf *btf);
Andrey Ignatovab9e0842018-10-15 22:50:34 -070068LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
69 const char *type_name);
Andrii Nakryiko9c651122019-02-04 17:29:46 -080070LIBBPF_API __u32 btf__get_nr_types(const struct btf *btf);
Andrey Ignatovab9e0842018-10-15 22:50:34 -070071LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
72 __u32 id);
73LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
74LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
75LIBBPF_API int btf__fd(const struct btf *btf);
Andrii Nakryiko02c87442019-02-08 11:19:37 -080076LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
Andrey Ignatovab9e0842018-10-15 22:50:34 -070077LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
Martin KaFai Lau1d2f44c2018-11-23 16:44:32 -080078LIBBPF_API int btf__get_from_id(__u32 id, struct btf **btf);
Yonghong Songa6c109a2019-02-05 11:48:22 -080079LIBBPF_API int btf__get_map_kv_tids(const struct btf *btf, const char *map_name,
Yonghong Song96408c42019-02-04 11:00:58 -080080 __u32 expected_key_size,
81 __u32 expected_value_size,
82 __u32 *key_type_id, __u32 *value_type_id);
Martin KaFai Lau8a138ae2018-04-18 15:56:05 -070083
Yonghong Songb8dcf8d2019-02-04 11:00:57 -080084LIBBPF_API struct btf_ext *btf_ext__new(__u8 *data, __u32 size);
85LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
Andrii Nakryiko1baabdc2019-02-28 15:31:22 -080086LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext,
Andrii Nakryikoae4ab4b2019-02-08 11:19:38 -080087 __u32 *size);
Yonghong Songb8dcf8d2019-02-04 11:00:57 -080088LIBBPF_API int btf_ext__reloc_func_info(const struct btf *btf,
89 const struct btf_ext *btf_ext,
90 const char *sec_name, __u32 insns_cnt,
91 void **func_info, __u32 *cnt);
92LIBBPF_API int btf_ext__reloc_line_info(const struct btf *btf,
93 const struct btf_ext *btf_ext,
94 const char *sec_name, __u32 insns_cnt,
95 void **line_info, __u32 *cnt);
96LIBBPF_API __u32 btf_ext__func_info_rec_size(const struct btf_ext *btf_ext);
97LIBBPF_API __u32 btf_ext__line_info_rec_size(const struct btf_ext *btf_ext);
Yonghong Song2993e052018-11-19 15:29:16 -080098
Andrii Nakryikod5caef52019-02-04 17:29:45 -080099struct btf_dedup_opts {
Andrii Nakryiko51edf5f2019-02-28 15:31:23 -0800100 unsigned int dedup_table_size;
Andrii Nakryikod5caef52019-02-04 17:29:45 -0800101 bool dont_resolve_fwds;
102};
103
104LIBBPF_API int btf__dedup(struct btf *btf, struct btf_ext *btf_ext,
105 const struct btf_dedup_opts *opts);
106
Andrii Nakryiko351131b2019-05-24 11:59:03 -0700107struct btf_dump;
108
109struct btf_dump_opts {
110 void *ctx;
111};
112
113typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args);
114
115LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf,
116 const struct btf_ext *btf_ext,
117 const struct btf_dump_opts *opts,
118 btf_dump_printf_fn_t printf_fn);
119LIBBPF_API void btf_dump__free(struct btf_dump *d);
120
121LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
122
Stanislav Fomichev8c4905b2018-11-21 09:29:44 -0800123#ifdef __cplusplus
124} /* extern "C" */
125#endif
126
Andrey Ignatoveff81902018-10-03 15:26:42 -0700127#endif /* __LIBBPF_BTF_H */