1
2
3
4
5
6
7
8
9#ifndef __LIBBPF_LIBBPF_INTERNAL_H
10#define __LIBBPF_LIBBPF_INTERNAL_H
11
12#include "libbpf.h"
13
14#define BTF_INFO_ENC(kind, kind_flag, vlen) \
15 ((!!(kind_flag) << 31) | ((kind) << 24) | ((vlen) & BTF_MAX_VLEN))
16#define BTF_TYPE_ENC(name, info, size_or_type) (name), (info), (size_or_type)
17#define BTF_INT_ENC(encoding, bits_offset, nr_bits) \
18 ((encoding) << 24 | (bits_offset) << 16 | (nr_bits))
19#define BTF_TYPE_INT_ENC(name, encoding, bits_offset, bits, sz) \
20 BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), sz), \
21 BTF_INT_ENC(encoding, bits_offset, bits)
22#define BTF_MEMBER_ENC(name, type, bits_offset) (name), (type), (bits_offset)
23#define BTF_PARAM_ENC(name, type) (name), (type)
24#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size)
25
26#ifndef min
27# define min(x, y) ((x) < (y) ? (x) : (y))
28#endif
29#ifndef max
30# define max(x, y) ((x) < (y) ? (y) : (x))
31#endif
32#ifndef offsetofend
33# define offsetofend(TYPE, FIELD) \
34 (offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD))
35#endif
36
37
38
39
40
41#ifdef SHARED
42# define COMPAT_VERSION(internal_name, api_name, version) \
43 asm(".symver " #internal_name "," #api_name "@" #version);
44# define DEFAULT_VERSION(internal_name, api_name, version) \
45 asm(".symver " #internal_name "," #api_name "@@" #version);
46#else
47# define COMPAT_VERSION(internal_name, api_name, version)
48# define DEFAULT_VERSION(internal_name, api_name, version) \
49 extern typeof(internal_name) api_name \
50 __attribute__((alias(#internal_name)));
51#endif
52
53extern void libbpf_print(enum libbpf_print_level level,
54 const char *format, ...)
55 __attribute__((format(printf, 2, 3)));
56
57#define __pr(level, fmt, ...) \
58do { \
59 libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
60} while (0)
61
62#define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
63#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
64#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
65
66static inline bool libbpf_validate_opts(const char *opts,
67 size_t opts_sz, size_t user_sz,
68 const char *type_name)
69{
70 if (user_sz < sizeof(size_t)) {
71 pr_warn("%s size (%zu) is too small\n", type_name, user_sz);
72 return false;
73 }
74 if (user_sz > opts_sz) {
75 size_t i;
76
77 for (i = opts_sz; i < user_sz; i++) {
78 if (opts[i]) {
79 pr_warn("%s has non-zero extra bytes",
80 type_name);
81 return false;
82 }
83 }
84 }
85 return true;
86}
87
88#define OPTS_VALID(opts, type) \
89 (!(opts) || libbpf_validate_opts((const char *)opts, \
90 offsetofend(struct type, \
91 type##__last_field), \
92 (opts)->sz, #type))
93#define OPTS_HAS(opts, field) \
94 ((opts) && opts->sz >= offsetofend(typeof(*(opts)), field))
95#define OPTS_GET(opts, field, fallback_value) \
96 (OPTS_HAS(opts, field) ? (opts)->field : fallback_value)
97
98int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
99 const char *str_sec, size_t str_len);
100
101struct btf_ext_info {
102
103
104
105
106 void *info;
107 __u32 rec_size;
108 __u32 len;
109};
110
111#define for_each_btf_ext_sec(seg, sec) \
112 for (sec = (seg)->info; \
113 (void *)sec < (seg)->info + (seg)->len; \
114 sec = (void *)sec + sizeof(struct btf_ext_info_sec) + \
115 (seg)->rec_size * sec->num_info)
116
117#define for_each_btf_ext_rec(seg, sec, i, rec) \
118 for (i = 0, rec = (void *)&(sec)->data; \
119 i < (sec)->num_info; \
120 i++, rec = (void *)rec + (seg)->rec_size)
121
122struct btf_ext {
123 union {
124 struct btf_ext_header *hdr;
125 void *data;
126 };
127 struct btf_ext_info func_info;
128 struct btf_ext_info line_info;
129 struct btf_ext_info field_reloc_info;
130 __u32 data_size;
131};
132
133struct btf_ext_info_sec {
134 __u32 sec_name_off;
135 __u32 num_info;
136
137 __u8 data[0];
138};
139
140
141struct bpf_func_info_min {
142 __u32 insn_off;
143 __u32 type_id;
144};
145
146
147struct bpf_line_info_min {
148 __u32 insn_off;
149 __u32 file_name_off;
150 __u32 line_off;
151 __u32 line_col;
152};
153
154
155
156
157
158
159enum bpf_field_info_kind {
160 BPF_FIELD_BYTE_OFFSET = 0,
161 BPF_FIELD_BYTE_SIZE = 1,
162 BPF_FIELD_EXISTS = 2,
163 BPF_FIELD_SIGNED = 3,
164 BPF_FIELD_LSHIFT_U64 = 4,
165 BPF_FIELD_RSHIFT_U64 = 5,
166};
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210struct bpf_field_reloc {
211 __u32 insn_off;
212 __u32 type_id;
213 __u32 access_str_off;
214 enum bpf_field_info_kind kind;
215};
216
217#endif
218