xref: /linux/tools/lib/bpf/btf.c (revision 41d0c467)
1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2 /* Copyright (c) 2018 Facebook */
3 
4 #include <byteswap.h>
5 #include <endian.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <fcntl.h>
10 #include <unistd.h>
11 #include <errno.h>
12 #include <sys/utsname.h>
13 #include <sys/param.h>
14 #include <sys/stat.h>
15 #include <linux/kernel.h>
16 #include <linux/err.h>
17 #include <linux/btf.h>
18 #include <gelf.h>
19 #include "btf.h"
20 #include "bpf.h"
21 #include "libbpf.h"
22 #include "libbpf_internal.h"
23 #include "hashmap.h"
24 #include "strset.h"
25 
26 #define BTF_MAX_NR_TYPES 0x7fffffffU
27 #define BTF_MAX_STR_OFFSET 0x7fffffffU
28 
29 static struct btf_type btf_void;
30 
31 struct btf {
32 	/* raw BTF data in native endianness */
33 	void *raw_data;
34 	/* raw BTF data in non-native endianness */
35 	void *raw_data_swapped;
36 	__u32 raw_size;
37 	/* whether target endianness differs from the native one */
38 	bool swapped_endian;
39 
40 	/*
41 	 * When BTF is loaded from an ELF or raw memory it is stored
42 	 * in a contiguous memory block. The hdr, type_data, and, strs_data
43 	 * point inside that memory region to their respective parts of BTF
44 	 * representation:
45 	 *
46 	 * +--------------------------------+
47 	 * |  Header  |  Types  |  Strings  |
48 	 * +--------------------------------+
49 	 * ^          ^         ^
50 	 * |          |         |
51 	 * hdr        |         |
52 	 * types_data-+         |
53 	 * strs_data------------+
54 	 *
55 	 * If BTF data is later modified, e.g., due to types added or
56 	 * removed, BTF deduplication performed, etc, this contiguous
57 	 * representation is broken up into three independently allocated
58 	 * memory regions to be able to modify them independently.
59 	 * raw_data is nulled out at that point, but can be later allocated
60 	 * and cached again if user calls btf__raw_data(), at which point
61 	 * raw_data will contain a contiguous copy of header, types, and
62 	 * strings:
63 	 *
64 	 * +----------+  +---------+  +-----------+
65 	 * |  Header  |  |  Types  |  |  Strings  |
66 	 * +----------+  +---------+  +-----------+
67 	 * ^             ^            ^
68 	 * |             |            |
69 	 * hdr           |            |
70 	 * types_data----+            |
71 	 * strset__data(strs_set)-----+
72 	 *
73 	 *               +----------+---------+-----------+
74 	 *               |  Header  |  Types  |  Strings  |
75 	 * raw_data----->+----------+---------+-----------+
76 	 */
77 	struct btf_header *hdr;
78 
79 	void *types_data;
80 	size_t types_data_cap; /* used size stored in hdr->type_len */
81 
82 	/* type ID to `struct btf_type *` lookup index
83 	 * type_offs[0] corresponds to the first non-VOID type:
84 	 *   - for base BTF it's type [1];
85 	 *   - for split BTF it's the first non-base BTF type.
86 	 */
87 	__u32 *type_offs;
88 	size_t type_offs_cap;
89 	/* number of types in this BTF instance:
90 	 *   - doesn't include special [0] void type;
91 	 *   - for split BTF counts number of types added on top of base BTF.
92 	 */
93 	__u32 nr_types;
94 	/* if not NULL, points to the base BTF on top of which the current
95 	 * split BTF is based
96 	 */
97 	struct btf *base_btf;
98 	/* BTF type ID of the first type in this BTF instance:
99 	 *   - for base BTF it's equal to 1;
100 	 *   - for split BTF it's equal to biggest type ID of base BTF plus 1.
101 	 */
102 	int start_id;
103 	/* logical string offset of this BTF instance:
104 	 *   - for base BTF it's equal to 0;
105 	 *   - for split BTF it's equal to total size of base BTF's string section size.
106 	 */
107 	int start_str_off;
108 
109 	/* only one of strs_data or strs_set can be non-NULL, depending on
110 	 * whether BTF is in a modifiable state (strs_set is used) or not
111 	 * (strs_data points inside raw_data)
112 	 */
113 	void *strs_data;
114 	/* a set of unique strings */
115 	struct strset *strs_set;
116 	/* whether strings are already deduplicated */
117 	bool strs_deduped;
118 
119 	/* whether base_btf should be freed in btf_free for this instance */
120 	bool owns_base;
121 
122 	/* BTF object FD, if loaded into kernel */
123 	int fd;
124 
125 	/* Pointer size (in bytes) for a target architecture of this BTF */
126 	int ptr_sz;
127 };
128 
ptr_to_u64(const void * ptr)129 static inline __u64 ptr_to_u64(const void *ptr)
130 {
131 	return (__u64) (unsigned long) ptr;
132 }
133 
134 /* Ensure given dynamically allocated memory region pointed to by *data* with
135  * capacity of *cap_cnt* elements each taking *elem_sz* bytes has enough
136  * memory to accommodate *add_cnt* new elements, assuming *cur_cnt* elements
137  * are already used. At most *max_cnt* elements can be ever allocated.
138  * If necessary, memory is reallocated and all existing data is copied over,
139  * new pointer to the memory region is stored at *data, new memory region
140  * capacity (in number of elements) is stored in *cap.
141  * On success, memory pointer to the beginning of unused memory is returned.
142  * On error, NULL is returned.
143  */
libbpf_add_mem(void ** data,size_t * cap_cnt,size_t elem_sz,size_t cur_cnt,size_t max_cnt,size_t add_cnt)144 void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz,
145 		     size_t cur_cnt, size_t max_cnt, size_t add_cnt)
146 {
147 	size_t new_cnt;
148 	void *new_data;
149 
150 	if (cur_cnt + add_cnt <= *cap_cnt)
151 		return *data + cur_cnt * elem_sz;
152 
153 	/* requested more than the set limit */
154 	if (cur_cnt + add_cnt > max_cnt)
155 		return NULL;
156 
157 	new_cnt = *cap_cnt;
158 	new_cnt += new_cnt / 4;		  /* expand by 25% */
159 	if (new_cnt < 16)		  /* but at least 16 elements */
160 		new_cnt = 16;
161 	if (new_cnt > max_cnt)		  /* but not exceeding a set limit */
162 		new_cnt = max_cnt;
163 	if (new_cnt < cur_cnt + add_cnt)  /* also ensure we have enough memory */
164 		new_cnt = cur_cnt + add_cnt;
165 
166 	new_data = libbpf_reallocarray(*data, new_cnt, elem_sz);
167 	if (!new_data)
168 		return NULL;
169 
170 	/* zero out newly allocated portion of memory */
171 	memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz);
172 
173 	*data = new_data;
174 	*cap_cnt = new_cnt;
175 	return new_data + cur_cnt * elem_sz;
176 }
177 
178 /* Ensure given dynamically allocated memory region has enough allocated space
179  * to accommodate *need_cnt* elements of size *elem_sz* bytes each
180  */
libbpf_ensure_mem(void ** data,size_t * cap_cnt,size_t elem_sz,size_t need_cnt)181 int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt)
182 {
183 	void *p;
184 
185 	if (need_cnt <= *cap_cnt)
186 		return 0;
187 
188 	p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt);
189 	if (!p)
190 		return -ENOMEM;
191 
192 	return 0;
193 }
194 
btf_add_type_offs_mem(struct btf * btf,size_t add_cnt)195 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt)
196 {
197 	return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32),
198 			      btf->nr_types, BTF_MAX_NR_TYPES, add_cnt);
199 }
200 
btf_add_type_idx_entry(struct btf * btf,__u32 type_off)201 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off)
202 {
203 	__u32 *p;
204 
205 	p = btf_add_type_offs_mem(btf, 1);
206 	if (!p)
207 		return -ENOMEM;
208 
209 	*p = type_off;
210 	return 0;
211 }
212 
btf_bswap_hdr(struct btf_header * h)213 static void btf_bswap_hdr(struct btf_header *h)
214 {
215 	h->magic = bswap_16(h->magic);
216 	h->hdr_len = bswap_32(h->hdr_len);
217 	h->type_off = bswap_32(h->type_off);
218 	h->type_len = bswap_32(h->type_len);
219 	h->str_off = bswap_32(h->str_off);
220 	h->str_len = bswap_32(h->str_len);
221 }
222 
btf_parse_hdr(struct btf * btf)223 static int btf_parse_hdr(struct btf *btf)
224 {
225 	struct btf_header *hdr = btf->hdr;
226 	__u32 meta_left;
227 
228 	if (btf->raw_size < sizeof(struct btf_header)) {
229 		pr_debug("BTF header not found\n");
230 		return -EINVAL;
231 	}
232 
233 	if (hdr->magic == bswap_16(BTF_MAGIC)) {
234 		btf->swapped_endian = true;
235 		if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) {
236 			pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n",
237 				bswap_32(hdr->hdr_len));
238 			return -ENOTSUP;
239 		}
240 		btf_bswap_hdr(hdr);
241 	} else if (hdr->magic != BTF_MAGIC) {
242 		pr_debug("Invalid BTF magic: %x\n", hdr->magic);
243 		return -EINVAL;
244 	}
245 
246 	if (btf->raw_size < hdr->hdr_len) {
247 		pr_debug("BTF header len %u larger than data size %u\n",
248 			 hdr->hdr_len, btf->raw_size);
249 		return -EINVAL;
250 	}
251 
252 	meta_left = btf->raw_size - hdr->hdr_len;
253 	if (meta_left < (long long)hdr->str_off + hdr->str_len) {
254 		pr_debug("Invalid BTF total size: %u\n", btf->raw_size);
255 		return -EINVAL;
256 	}
257 
258 	if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
259 		pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n",
260 			 hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
261 		return -EINVAL;
262 	}
263 
264 	if (hdr->type_off % 4) {
265 		pr_debug("BTF type section is not aligned to 4 bytes\n");
266 		return -EINVAL;
267 	}
268 
269 	return 0;
270 }
271 
btf_parse_str_sec(struct btf * btf)272 static int btf_parse_str_sec(struct btf *btf)
273 {
274 	const struct btf_header *hdr = btf->hdr;
275 	const char *start = btf->strs_data;
276 	const char *end = start + btf->hdr->str_len;
277 
278 	if (btf->base_btf && hdr->str_len == 0)
279 		return 0;
280 	if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) {
281 		pr_debug("Invalid BTF string section\n");
282 		return -EINVAL;
283 	}
284 	if (!btf->base_btf && start[0]) {
285 		pr_debug("Invalid BTF string section\n");
286 		return -EINVAL;
287 	}
288 	return 0;
289 }
290 
btf_type_size(const struct btf_type * t)291 static int btf_type_size(const struct btf_type *t)
292 {
293 	const int base_size = sizeof(struct btf_type);
294 	__u16 vlen = btf_vlen(t);
295 
296 	switch (btf_kind(t)) {
297 	case BTF_KIND_FWD:
298 	case BTF_KIND_CONST:
299 	case BTF_KIND_VOLATILE:
300 	case BTF_KIND_RESTRICT:
301 	case BTF_KIND_PTR:
302 	case BTF_KIND_TYPEDEF:
303 	case BTF_KIND_FUNC:
304 	case BTF_KIND_FLOAT:
305 	case BTF_KIND_TYPE_TAG:
306 		return base_size;
307 	case BTF_KIND_INT:
308 		return base_size + sizeof(__u32);
309 	case BTF_KIND_ENUM:
310 		return base_size + vlen * sizeof(struct btf_enum);
311 	case BTF_KIND_ENUM64:
312 		return base_size + vlen * sizeof(struct btf_enum64);
313 	case BTF_KIND_ARRAY:
314 		return base_size + sizeof(struct btf_array);
315 	case BTF_KIND_STRUCT:
316 	case BTF_KIND_UNION:
317 		return base_size + vlen * sizeof(struct btf_member);
318 	case BTF_KIND_FUNC_PROTO:
319 		return base_size + vlen * sizeof(struct btf_param);
320 	case BTF_KIND_VAR:
321 		return base_size + sizeof(struct btf_var);
322 	case BTF_KIND_DATASEC:
323 		return base_size + vlen * sizeof(struct btf_var_secinfo);
324 	case BTF_KIND_DECL_TAG:
325 		return base_size + sizeof(struct btf_decl_tag);
326 	default:
327 		pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
328 		return -EINVAL;
329 	}
330 }
331 
btf_bswap_type_base(struct btf_type * t)332 static void btf_bswap_type_base(struct btf_type *t)
333 {
334 	t->name_off = bswap_32(t->name_off);
335 	t->info = bswap_32(t->info);
336 	t->type = bswap_32(t->type);
337 }
338 
btf_bswap_type_rest(struct btf_type * t)339 static int btf_bswap_type_rest(struct btf_type *t)
340 {
341 	struct btf_var_secinfo *v;
342 	struct btf_enum64 *e64;
343 	struct btf_member *m;
344 	struct btf_array *a;
345 	struct btf_param *p;
346 	struct btf_enum *e;
347 	__u16 vlen = btf_vlen(t);
348 	int i;
349 
350 	switch (btf_kind(t)) {
351 	case BTF_KIND_FWD:
352 	case BTF_KIND_CONST:
353 	case BTF_KIND_VOLATILE:
354 	case BTF_KIND_RESTRICT:
355 	case BTF_KIND_PTR:
356 	case BTF_KIND_TYPEDEF:
357 	case BTF_KIND_FUNC:
358 	case BTF_KIND_FLOAT:
359 	case BTF_KIND_TYPE_TAG:
360 		return 0;
361 	case BTF_KIND_INT:
362 		*(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1));
363 		return 0;
364 	case BTF_KIND_ENUM:
365 		for (i = 0, e = btf_enum(t); i < vlen; i++, e++) {
366 			e->name_off = bswap_32(e->name_off);
367 			e->val = bswap_32(e->val);
368 		}
369 		return 0;
370 	case BTF_KIND_ENUM64:
371 		for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) {
372 			e64->name_off = bswap_32(e64->name_off);
373 			e64->val_lo32 = bswap_32(e64->val_lo32);
374 			e64->val_hi32 = bswap_32(e64->val_hi32);
375 		}
376 		return 0;
377 	case BTF_KIND_ARRAY:
378 		a = btf_array(t);
379 		a->type = bswap_32(a->type);
380 		a->index_type = bswap_32(a->index_type);
381 		a->nelems = bswap_32(a->nelems);
382 		return 0;
383 	case BTF_KIND_STRUCT:
384 	case BTF_KIND_UNION:
385 		for (i = 0, m = btf_members(t); i < vlen; i++, m++) {
386 			m->name_off = bswap_32(m->name_off);
387 			m->type = bswap_32(m->type);
388 			m->offset = bswap_32(m->offset);
389 		}
390 		return 0;
391 	case BTF_KIND_FUNC_PROTO:
392 		for (i = 0, p = btf_params(t); i < vlen; i++, p++) {
393 			p->name_off = bswap_32(p->name_off);
394 			p->type = bswap_32(p->type);
395 		}
396 		return 0;
397 	case BTF_KIND_VAR:
398 		btf_var(t)->linkage = bswap_32(btf_var(t)->linkage);
399 		return 0;
400 	case BTF_KIND_DATASEC:
401 		for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) {
402 			v->type = bswap_32(v->type);
403 			v->offset = bswap_32(v->offset);
404 			v->size = bswap_32(v->size);
405 		}
406 		return 0;
407 	case BTF_KIND_DECL_TAG:
408 		btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx);
409 		return 0;
410 	default:
411 		pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
412 		return -EINVAL;
413 	}
414 }
415 
btf_parse_type_sec(struct btf * btf)416 static int btf_parse_type_sec(struct btf *btf)
417 {
418 	struct btf_header *hdr = btf->hdr;
419 	void *next_type = btf->types_data;
420 	void *end_type = next_type + hdr->type_len;
421 	int err, type_size;
422 
423 	while (next_type + sizeof(struct btf_type) <= end_type) {
424 		if (btf->swapped_endian)
425 			btf_bswap_type_base(next_type);
426 
427 		type_size = btf_type_size(next_type);
428 		if (type_size < 0)
429 			return type_size;
430 		if (next_type + type_size > end_type) {
431 			pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types);
432 			return -EINVAL;
433 		}
434 
435 		if (btf->swapped_endian && btf_bswap_type_rest(next_type))
436 			return -EINVAL;
437 
438 		err = btf_add_type_idx_entry(btf, next_type - btf->types_data);
439 		if (err)
440 			return err;
441 
442 		next_type += type_size;
443 		btf->nr_types++;
444 	}
445 
446 	if (next_type != end_type) {
447 		pr_warn("BTF types data is malformed\n");
448 		return -EINVAL;
449 	}
450 
451 	return 0;
452 }
453 
btf_validate_str(const struct btf * btf,__u32 str_off,const char * what,__u32 type_id)454 static int btf_validate_str(const struct btf *btf, __u32 str_off, const char *what, __u32 type_id)
455 {
456 	const char *s;
457 
458 	s = btf__str_by_offset(btf, str_off);
459 	if (!s) {
460 		pr_warn("btf: type [%u]: invalid %s (string offset %u)\n", type_id, what, str_off);
461 		return -EINVAL;
462 	}
463 
464 	return 0;
465 }
466 
btf_validate_id(const struct btf * btf,__u32 id,__u32 ctx_id)467 static int btf_validate_id(const struct btf *btf, __u32 id, __u32 ctx_id)
468 {
469 	const struct btf_type *t;
470 
471 	t = btf__type_by_id(btf, id);
472 	if (!t) {
473 		pr_warn("btf: type [%u]: invalid referenced type ID %u\n", ctx_id, id);
474 		return -EINVAL;
475 	}
476 
477 	return 0;
478 }
479 
btf_validate_type(const struct btf * btf,const struct btf_type * t,__u32 id)480 static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id)
481 {
482 	__u32 kind = btf_kind(t);
483 	int err, i, n;
484 
485 	err = btf_validate_str(btf, t->name_off, "type name", id);
486 	if (err)
487 		return err;
488 
489 	switch (kind) {
490 	case BTF_KIND_UNKN:
491 	case BTF_KIND_INT:
492 	case BTF_KIND_FWD:
493 	case BTF_KIND_FLOAT:
494 		break;
495 	case BTF_KIND_PTR:
496 	case BTF_KIND_TYPEDEF:
497 	case BTF_KIND_VOLATILE:
498 	case BTF_KIND_CONST:
499 	case BTF_KIND_RESTRICT:
500 	case BTF_KIND_VAR:
501 	case BTF_KIND_DECL_TAG:
502 	case BTF_KIND_TYPE_TAG:
503 		err = btf_validate_id(btf, t->type, id);
504 		if (err)
505 			return err;
506 		break;
507 	case BTF_KIND_ARRAY: {
508 		const struct btf_array *a = btf_array(t);
509 
510 		err = btf_validate_id(btf, a->type, id);
511 		err = err ?: btf_validate_id(btf, a->index_type, id);
512 		if (err)
513 			return err;
514 		break;
515 	}
516 	case BTF_KIND_STRUCT:
517 	case BTF_KIND_UNION: {
518 		const struct btf_member *m = btf_members(t);
519 
520 		n = btf_vlen(t);
521 		for (i = 0; i < n; i++, m++) {
522 			err = btf_validate_str(btf, m->name_off, "field name", id);
523 			err = err ?: btf_validate_id(btf, m->type, id);
524 			if (err)
525 				return err;
526 		}
527 		break;
528 	}
529 	case BTF_KIND_ENUM: {
530 		const struct btf_enum *m = btf_enum(t);
531 
532 		n = btf_vlen(t);
533 		for (i = 0; i < n; i++, m++) {
534 			err = btf_validate_str(btf, m->name_off, "enum name", id);
535 			if (err)
536 				return err;
537 		}
538 		break;
539 	}
540 	case BTF_KIND_ENUM64: {
541 		const struct btf_enum64 *m = btf_enum64(t);
542 
543 		n = btf_vlen(t);
544 		for (i = 0; i < n; i++, m++) {
545 			err = btf_validate_str(btf, m->name_off, "enum name", id);
546 			if (err)
547 				return err;
548 		}
549 		break;
550 	}
551 	case BTF_KIND_FUNC: {
552 		const struct btf_type *ft;
553 
554 		err = btf_validate_id(btf, t->type, id);
555 		if (err)
556 			return err;
557 		ft = btf__type_by_id(btf, t->type);
558 		if (btf_kind(ft) != BTF_KIND_FUNC_PROTO) {
559 			pr_warn("btf: type [%u]: referenced type [%u] is not FUNC_PROTO\n", id, t->type);
560 			return -EINVAL;
561 		}
562 		break;
563 	}
564 	case BTF_KIND_FUNC_PROTO: {
565 		const struct btf_param *m = btf_params(t);
566 
567 		n = btf_vlen(t);
568 		for (i = 0; i < n; i++, m++) {
569 			err = btf_validate_str(btf, m->name_off, "param name", id);
570 			err = err ?: btf_validate_id(btf, m->type, id);
571 			if (err)
572 				return err;
573 		}
574 		break;
575 	}
576 	case BTF_KIND_DATASEC: {
577 		const struct btf_var_secinfo *m = btf_var_secinfos(t);
578 
579 		n = btf_vlen(t);
580 		for (i = 0; i < n; i++, m++) {
581 			err = btf_validate_id(btf, m->type, id);
582 			if (err)
583 				return err;
584 		}
585 		break;
586 	}
587 	default:
588 		pr_warn("btf: type [%u]: unrecognized kind %u\n", id, kind);
589 		return -EINVAL;
590 	}
591 	return 0;
592 }
593 
594 /* Validate basic sanity of BTF. It's intentionally less thorough than
595  * kernel's validation and validates only properties of BTF that libbpf relies
596  * on to be correct (e.g., valid type IDs, valid string offsets, etc)
597  */
btf_sanity_check(const struct btf * btf)598 static int btf_sanity_check(const struct btf *btf)
599 {
600 	const struct btf_type *t;
601 	__u32 i, n = btf__type_cnt(btf);
602 	int err;
603 
604 	for (i = btf->start_id; i < n; i++) {
605 		t = btf_type_by_id(btf, i);
606 		err = btf_validate_type(btf, t, i);
607 		if (err)
608 			return err;
609 	}
610 	return 0;
611 }
612 
btf__type_cnt(const struct btf * btf)613 __u32 btf__type_cnt(const struct btf *btf)
614 {
615 	return btf->start_id + btf->nr_types;
616 }
617 
btf__base_btf(const struct btf * btf)618 const struct btf *btf__base_btf(const struct btf *btf)
619 {
620 	return btf->base_btf;
621 }
622 
623 /* internal helper returning non-const pointer to a type */
btf_type_by_id(const struct btf * btf,__u32 type_id)624 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
625 {
626 	if (type_id == 0)
627 		return &btf_void;
628 	if (type_id < btf->start_id)
629 		return btf_type_by_id(btf->base_btf, type_id);
630 	return btf->types_data + btf->type_offs[type_id - btf->start_id];
631 }
632 
btf__type_by_id(const struct btf * btf,__u32 type_id)633 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id)
634 {
635 	if (type_id >= btf->start_id + btf->nr_types)
636 		return errno = EINVAL, NULL;
637 	return btf_type_by_id((struct btf *)btf, type_id);
638 }
639 
determine_ptr_size(const struct btf * btf)640 static int determine_ptr_size(const struct btf *btf)
641 {
642 	static const char * const long_aliases[] = {
643 		"long",
644 		"long int",
645 		"int long",
646 		"unsigned long",
647 		"long unsigned",
648 		"unsigned long int",
649 		"unsigned int long",
650 		"long unsigned int",
651 		"long int unsigned",
652 		"int unsigned long",
653 		"int long unsigned",
654 	};
655 	const struct btf_type *t;
656 	const char *name;
657 	int i, j, n;
658 
659 	if (btf->base_btf && btf->base_btf->ptr_sz > 0)
660 		return btf->base_btf->ptr_sz;
661 
662 	n = btf__type_cnt(btf);
663 	for (i = 1; i < n; i++) {
664 		t = btf__type_by_id(btf, i);
665 		if (!btf_is_int(t))
666 			continue;
667 
668 		if (t->size != 4 && t->size != 8)
669 			continue;
670 
671 		name = btf__name_by_offset(btf, t->name_off);
672 		if (!name)
673 			continue;
674 
675 		for (j = 0; j < ARRAY_SIZE(long_aliases); j++) {
676 			if (strcmp(name, long_aliases[j]) == 0)
677 				return t->size;
678 		}
679 	}
680 
681 	return -1;
682 }
683 
btf_ptr_sz(const struct btf * btf)684 static size_t btf_ptr_sz(const struct btf *btf)
685 {
686 	if (!btf->ptr_sz)
687 		((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
688 	return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
689 }
690 
691 /* Return pointer size this BTF instance assumes. The size is heuristically
692  * determined by looking for 'long' or 'unsigned long' integer type and
693  * recording its size in bytes. If BTF type information doesn't have any such
694  * type, this function returns 0. In the latter case, native architecture's
695  * pointer size is assumed, so will be either 4 or 8, depending on
696  * architecture that libbpf was compiled for. It's possible to override
697  * guessed value by using btf__set_pointer_size() API.
698  */
btf__pointer_size(const struct btf * btf)699 size_t btf__pointer_size(const struct btf *btf)
700 {
701 	if (!btf->ptr_sz)
702 		((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
703 
704 	if (btf->ptr_sz < 0)
705 		/* not enough BTF type info to guess */
706 		return 0;
707 
708 	return btf->ptr_sz;
709 }
710 
711 /* Override or set pointer size in bytes. Only values of 4 and 8 are
712  * supported.
713  */
btf__set_pointer_size(struct btf * btf,size_t ptr_sz)714 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz)
715 {
716 	if (ptr_sz != 4 && ptr_sz != 8)
717 		return libbpf_err(-EINVAL);
718 	btf->ptr_sz = ptr_sz;
719 	return 0;
720 }
721 
is_host_big_endian(void)722 static bool is_host_big_endian(void)
723 {
724 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
725 	return false;
726 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
727 	return true;
728 #else
729 # error "Unrecognized __BYTE_ORDER__"
730 #endif
731 }
732 
btf__endianness(const struct btf * btf)733 enum btf_endianness btf__endianness(const struct btf *btf)
734 {
735 	if (is_host_big_endian())
736 		return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
737 	else
738 		return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
739 }
740 
btf__set_endianness(struct btf * btf,enum btf_endianness endian)741 int btf__set_endianness(struct btf *btf, enum btf_endianness endian)
742 {
743 	if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN)
744 		return libbpf_err(-EINVAL);
745 
746 	btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
747 	if (!btf->swapped_endian) {
748 		free(btf->raw_data_swapped);
749 		btf->raw_data_swapped = NULL;
750 	}
751 	return 0;
752 }
753 
btf_type_is_void(const struct btf_type * t)754 static bool btf_type_is_void(const struct btf_type *t)
755 {
756 	return t == &btf_void || btf_is_fwd(t);
757 }
758 
btf_type_is_void_or_null(const struct btf_type * t)759 static bool btf_type_is_void_or_null(const struct btf_type *t)
760 {
761 	return !t || btf_type_is_void(t);
762 }
763 
764 #define MAX_RESOLVE_DEPTH 32
765 
btf__resolve_size(const struct btf * btf,__u32 type_id)766 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
767 {
768 	const struct btf_array *array;
769 	const struct btf_type *t;
770 	__u32 nelems = 1;
771 	__s64 size = -1;
772 	int i;
773 
774 	t = btf__type_by_id(btf, type_id);
775 	for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) {
776 		switch (btf_kind(t)) {
777 		case BTF_KIND_INT:
778 		case BTF_KIND_STRUCT:
779 		case BTF_KIND_UNION:
780 		case BTF_KIND_ENUM:
781 		case BTF_KIND_ENUM64:
782 		case BTF_KIND_DATASEC:
783 		case BTF_KIND_FLOAT:
784 			size = t->size;
785 			goto done;
786 		case BTF_KIND_PTR:
787 			size = btf_ptr_sz(btf);
788 			goto done;
789 		case BTF_KIND_TYPEDEF:
790 		case BTF_KIND_VOLATILE:
791 		case BTF_KIND_CONST:
792 		case BTF_KIND_RESTRICT:
793 		case BTF_KIND_VAR:
794 		case BTF_KIND_DECL_TAG:
795 		case BTF_KIND_TYPE_TAG:
796 			type_id = t->type;
797 			break;
798 		case BTF_KIND_ARRAY:
799 			array = btf_array(t);
800 			if (nelems && array->nelems > UINT32_MAX / nelems)
801 				return libbpf_err(-E2BIG);
802 			nelems *= array->nelems;
803 			type_id = array->type;
804 			break;
805 		default:
806 			return libbpf_err(-EINVAL);
807 		}
808 
809 		t = btf__type_by_id(btf, type_id);
810 	}
811 
812 done:
813 	if (size < 0)
814 		return libbpf_err(-EINVAL);
815 	if (nelems && size > UINT32_MAX / nelems)
816 		return libbpf_err(-E2BIG);
817 
818 	return nelems * size;
819 }
820 
btf__align_of(const struct btf * btf,__u32 id)821 int btf__align_of(const struct btf *btf, __u32 id)
822 {
823 	const struct btf_type *t = btf__type_by_id(btf, id);
824 	__u16 kind = btf_kind(t);
825 
826 	switch (kind) {
827 	case BTF_KIND_INT:
828 	case BTF_KIND_ENUM:
829 	case BTF_KIND_ENUM64:
830 	case BTF_KIND_FLOAT:
831 		return min(btf_ptr_sz(btf), (size_t)t->size);
832 	case BTF_KIND_PTR:
833 		return btf_ptr_sz(btf);
834 	case BTF_KIND_TYPEDEF:
835 	case BTF_KIND_VOLATILE:
836 	case BTF_KIND_CONST:
837 	case BTF_KIND_RESTRICT:
838 	case BTF_KIND_TYPE_TAG:
839 		return btf__align_of(btf, t->type);
840 	case BTF_KIND_ARRAY:
841 		return btf__align_of(btf, btf_array(t)->type);
842 	case BTF_KIND_STRUCT:
843 	case BTF_KIND_UNION: {
844 		const struct btf_member *m = btf_members(t);
845 		__u16 vlen = btf_vlen(t);
846 		int i, max_align = 1, align;
847 
848 		for (i = 0; i < vlen; i++, m++) {
849 			align = btf__align_of(btf, m->type);
850 			if (align <= 0)
851 				return libbpf_err(align);
852 			max_align = max(max_align, align);
853 
854 			/* if field offset isn't aligned according to field
855 			 * type's alignment, then struct must be packed
856 			 */
857 			if (btf_member_bitfield_size(t, i) == 0 &&
858 			    (m->offset % (8 * align)) != 0)
859 				return 1;
860 		}
861 
862 		/* if struct/union size isn't a multiple of its alignment,
863 		 * then struct must be packed
864 		 */
865 		if ((t->size % max_align) != 0)
866 			return 1;
867 
868 		return max_align;
869 	}
870 	default:
871 		pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t));
872 		return errno = EINVAL, 0;
873 	}
874 }
875 
btf__resolve_type(const struct btf * btf,__u32 type_id)876 int btf__resolve_type(const struct btf *btf, __u32 type_id)
877 {
878 	const struct btf_type *t;
879 	int depth = 0;
880 
881 	t = btf__type_by_id(btf, type_id);
882 	while (depth < MAX_RESOLVE_DEPTH &&
883 	       !btf_type_is_void_or_null(t) &&
884 	       (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) {
885 		type_id = t->type;
886 		t = btf__type_by_id(btf, type_id);
887 		depth++;
888 	}
889 
890 	if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t))
891 		return libbpf_err(-EINVAL);
892 
893 	return type_id;
894 }
895 
btf__find_by_name(const struct btf * btf,const char * type_name)896 __s32 btf__find_by_name(const struct btf *btf, const char *type_name)
897 {
898 	__u32 i, nr_types = btf__type_cnt(btf);
899 
900 	if (!strcmp(type_name, "void"))
901 		return 0;
902 
903 	for (i = 1; i < nr_types; i++) {
904 		const struct btf_type *t = btf__type_by_id(btf, i);
905 		const char *name = btf__name_by_offset(btf, t->name_off);
906 
907 		if (name && !strcmp(type_name, name))
908 			return i;
909 	}
910 
911 	return libbpf_err(-ENOENT);
912 }
913 
btf_find_by_name_kind(const struct btf * btf,int start_id,const char * type_name,__u32 kind)914 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id,
915 				   const char *type_name, __u32 kind)
916 {
917 	__u32 i, nr_types = btf__type_cnt(btf);
918 
919 	if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
920 		return 0;
921 
922 	for (i = start_id; i < nr_types; i++) {
923 		const struct btf_type *t = btf__type_by_id(btf, i);
924 		const char *name;
925 
926 		if (btf_kind(t) != kind)
927 			continue;
928 		name = btf__name_by_offset(btf, t->name_off);
929 		if (name && !strcmp(type_name, name))
930 			return i;
931 	}
932 
933 	return libbpf_err(-ENOENT);
934 }
935 
btf__find_by_name_kind_own(const struct btf * btf,const char * type_name,__u32 kind)936 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
937 				 __u32 kind)
938 {
939 	return btf_find_by_name_kind(btf, btf->start_id, type_name, kind);
940 }
941 
btf__find_by_name_kind(const struct btf * btf,const char * type_name,__u32 kind)942 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
943 			     __u32 kind)
944 {
945 	return btf_find_by_name_kind(btf, 1, type_name, kind);
946 }
947 
btf_is_modifiable(const struct btf * btf)948 static bool btf_is_modifiable(const struct btf *btf)
949 {
950 	return (void *)btf->hdr != btf->raw_data;
951 }
952 
btf__free(struct btf * btf)953 void btf__free(struct btf *btf)
954 {
955 	if (IS_ERR_OR_NULL(btf))
956 		return;
957 
958 	if (btf->fd >= 0)
959 		close(btf->fd);
960 
961 	if (btf_is_modifiable(btf)) {
962 		/* if BTF was modified after loading, it will have a split
963 		 * in-memory representation for header, types, and strings
964 		 * sections, so we need to free all of them individually. It
965 		 * might still have a cached contiguous raw data present,
966 		 * which will be unconditionally freed below.
967 		 */
968 		free(btf->hdr);
969 		free(btf->types_data);
970 		strset__free(btf->strs_set);
971 	}
972 	free(btf->raw_data);
973 	free(btf->raw_data_swapped);
974 	free(btf->type_offs);
975 	if (btf->owns_base)
976 		btf__free(btf->base_btf);
977 	free(btf);
978 }
979 
btf_new_empty(struct btf * base_btf)980 static struct btf *btf_new_empty(struct btf *base_btf)
981 {
982 	struct btf *btf;
983 
984 	btf = calloc(1, sizeof(*btf));
985 	if (!btf)
986 		return ERR_PTR(-ENOMEM);
987 
988 	btf->nr_types = 0;
989 	btf->start_id = 1;
990 	btf->start_str_off = 0;
991 	btf->fd = -1;
992 	btf->ptr_sz = sizeof(void *);
993 	btf->swapped_endian = false;
994 
995 	if (base_btf) {
996 		btf->base_btf = base_btf;
997 		btf->start_id = btf__type_cnt(base_btf);
998 		btf->start_str_off = base_btf->hdr->str_len;
999 		btf->swapped_endian = base_btf->swapped_endian;
1000 	}
1001 
1002 	/* +1 for empty string at offset 0 */
1003 	btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1);
1004 	btf->raw_data = calloc(1, btf->raw_size);
1005 	if (!btf->raw_data) {
1006 		free(btf);
1007 		return ERR_PTR(-ENOMEM);
1008 	}
1009 
1010 	btf->hdr = btf->raw_data;
1011 	btf->hdr->hdr_len = sizeof(struct btf_header);
1012 	btf->hdr->magic = BTF_MAGIC;
1013 	btf->hdr->version = BTF_VERSION;
1014 
1015 	btf->types_data = btf->raw_data + btf->hdr->hdr_len;
1016 	btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
1017 	btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */
1018 
1019 	return btf;
1020 }
1021 
btf__new_empty(void)1022 struct btf *btf__new_empty(void)
1023 {
1024 	return libbpf_ptr(btf_new_empty(NULL));
1025 }
1026 
btf__new_empty_split(struct btf * base_btf)1027 struct btf *btf__new_empty_split(struct btf *base_btf)
1028 {
1029 	return libbpf_ptr(btf_new_empty(base_btf));
1030 }
1031 
btf_new(const void * data,__u32 size,struct btf * base_btf)1032 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf)
1033 {
1034 	struct btf *btf;
1035 	int err;
1036 
1037 	btf = calloc(1, sizeof(struct btf));
1038 	if (!btf)
1039 		return ERR_PTR(-ENOMEM);
1040 
1041 	btf->nr_types = 0;
1042 	btf->start_id = 1;
1043 	btf->start_str_off = 0;
1044 	btf->fd = -1;
1045 
1046 	if (base_btf) {
1047 		btf->base_btf = base_btf;
1048 		btf->start_id = btf__type_cnt(base_btf);
1049 		btf->start_str_off = base_btf->hdr->str_len;
1050 	}
1051 
1052 	btf->raw_data = malloc(size);
1053 	if (!btf->raw_data) {
1054 		err = -ENOMEM;
1055 		goto done;
1056 	}
1057 	memcpy(btf->raw_data, data, size);
1058 	btf->raw_size = size;
1059 
1060 	btf->hdr = btf->raw_data;
1061 	err = btf_parse_hdr(btf);
1062 	if (err)
1063 		goto done;
1064 
1065 	btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
1066 	btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off;
1067 
1068 	err = btf_parse_str_sec(btf);
1069 	err = err ?: btf_parse_type_sec(btf);
1070 	err = err ?: btf_sanity_check(btf);
1071 	if (err)
1072 		goto done;
1073 
1074 done:
1075 	if (err) {
1076 		btf__free(btf);
1077 		return ERR_PTR(err);
1078 	}
1079 
1080 	return btf;
1081 }
1082 
btf__new(const void * data,__u32 size)1083 struct btf *btf__new(const void *data, __u32 size)
1084 {
1085 	return libbpf_ptr(btf_new(data, size, NULL));
1086 }
1087 
btf__new_split(const void * data,__u32 size,struct btf * base_btf)1088 struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf)
1089 {
1090 	return libbpf_ptr(btf_new(data, size, base_btf));
1091 }
1092 
1093 struct btf_elf_secs {
1094 	Elf_Data *btf_data;
1095 	Elf_Data *btf_ext_data;
1096 	Elf_Data *btf_base_data;
1097 };
1098 
btf_find_elf_sections(Elf * elf,const char * path,struct btf_elf_secs * secs)1099 static int btf_find_elf_sections(Elf *elf, const char *path, struct btf_elf_secs *secs)
1100 {
1101 	Elf_Scn *scn = NULL;
1102 	Elf_Data *data;
1103 	GElf_Ehdr ehdr;
1104 	size_t shstrndx;
1105 	int idx = 0;
1106 
1107 	if (!gelf_getehdr(elf, &ehdr)) {
1108 		pr_warn("failed to get EHDR from %s\n", path);
1109 		goto err;
1110 	}
1111 
1112 	if (elf_getshdrstrndx(elf, &shstrndx)) {
1113 		pr_warn("failed to get section names section index for %s\n",
1114 			path);
1115 		goto err;
1116 	}
1117 
1118 	if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) {
1119 		pr_warn("failed to get e_shstrndx from %s\n", path);
1120 		goto err;
1121 	}
1122 
1123 	while ((scn = elf_nextscn(elf, scn)) != NULL) {
1124 		Elf_Data **field;
1125 		GElf_Shdr sh;
1126 		char *name;
1127 
1128 		idx++;
1129 		if (gelf_getshdr(scn, &sh) != &sh) {
1130 			pr_warn("failed to get section(%d) header from %s\n",
1131 				idx, path);
1132 			goto err;
1133 		}
1134 		name = elf_strptr(elf, shstrndx, sh.sh_name);
1135 		if (!name) {
1136 			pr_warn("failed to get section(%d) name from %s\n",
1137 				idx, path);
1138 			goto err;
1139 		}
1140 
1141 		if (strcmp(name, BTF_ELF_SEC) == 0)
1142 			field = &secs->btf_data;
1143 		else if (strcmp(name, BTF_EXT_ELF_SEC) == 0)
1144 			field = &secs->btf_ext_data;
1145 		else if (strcmp(name, BTF_BASE_ELF_SEC) == 0)
1146 			field = &secs->btf_base_data;
1147 		else
1148 			continue;
1149 
1150 		data = elf_getdata(scn, 0);
1151 		if (!data) {
1152 			pr_warn("failed to get section(%d, %s) data from %s\n",
1153 				idx, name, path);
1154 			goto err;
1155 		}
1156 		*field = data;
1157 	}
1158 
1159 	return 0;
1160 
1161 err:
1162 	return -LIBBPF_ERRNO__FORMAT;
1163 }
1164 
btf_parse_elf(const char * path,struct btf * base_btf,struct btf_ext ** btf_ext)1165 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf,
1166 				 struct btf_ext **btf_ext)
1167 {
1168 	struct btf_elf_secs secs = {};
1169 	struct btf *dist_base_btf = NULL;
1170 	struct btf *btf = NULL;
1171 	int err = 0, fd = -1;
1172 	Elf *elf = NULL;
1173 
1174 	if (elf_version(EV_CURRENT) == EV_NONE) {
1175 		pr_warn("failed to init libelf for %s\n", path);
1176 		return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
1177 	}
1178 
1179 	fd = open(path, O_RDONLY | O_CLOEXEC);
1180 	if (fd < 0) {
1181 		err = -errno;
1182 		pr_warn("failed to open %s: %s\n", path, strerror(errno));
1183 		return ERR_PTR(err);
1184 	}
1185 
1186 	elf = elf_begin(fd, ELF_C_READ, NULL);
1187 	if (!elf) {
1188 		pr_warn("failed to open %s as ELF file\n", path);
1189 		goto done;
1190 	}
1191 
1192 	err = btf_find_elf_sections(elf, path, &secs);
1193 	if (err)
1194 		goto done;
1195 
1196 	if (!secs.btf_data) {
1197 		pr_warn("failed to find '%s' ELF section in %s\n", BTF_ELF_SEC, path);
1198 		err = -ENODATA;
1199 		goto done;
1200 	}
1201 
1202 	if (secs.btf_base_data) {
1203 		dist_base_btf = btf_new(secs.btf_base_data->d_buf, secs.btf_base_data->d_size,
1204 					NULL);
1205 		if (IS_ERR(dist_base_btf)) {
1206 			err = PTR_ERR(dist_base_btf);
1207 			dist_base_btf = NULL;
1208 			goto done;
1209 		}
1210 	}
1211 
1212 	btf = btf_new(secs.btf_data->d_buf, secs.btf_data->d_size,
1213 		      dist_base_btf ?: base_btf);
1214 	if (IS_ERR(btf)) {
1215 		err = PTR_ERR(btf);
1216 		goto done;
1217 	}
1218 	if (dist_base_btf && base_btf) {
1219 		err = btf__relocate(btf, base_btf);
1220 		if (err)
1221 			goto done;
1222 		btf__free(dist_base_btf);
1223 		dist_base_btf = NULL;
1224 	}
1225 
1226 	if (dist_base_btf)
1227 		btf->owns_base = true;
1228 
1229 	switch (gelf_getclass(elf)) {
1230 	case ELFCLASS32:
1231 		btf__set_pointer_size(btf, 4);
1232 		break;
1233 	case ELFCLASS64:
1234 		btf__set_pointer_size(btf, 8);
1235 		break;
1236 	default:
1237 		pr_warn("failed to get ELF class (bitness) for %s\n", path);
1238 		break;
1239 	}
1240 
1241 	if (btf_ext && secs.btf_ext_data) {
1242 		*btf_ext = btf_ext__new(secs.btf_ext_data->d_buf, secs.btf_ext_data->d_size);
1243 		if (IS_ERR(*btf_ext)) {
1244 			err = PTR_ERR(*btf_ext);
1245 			goto done;
1246 		}
1247 	} else if (btf_ext) {
1248 		*btf_ext = NULL;
1249 	}
1250 done:
1251 	if (elf)
1252 		elf_end(elf);
1253 	close(fd);
1254 
1255 	if (!err)
1256 		return btf;
1257 
1258 	if (btf_ext)
1259 		btf_ext__free(*btf_ext);
1260 	btf__free(dist_base_btf);
1261 	btf__free(btf);
1262 
1263 	return ERR_PTR(err);
1264 }
1265 
btf__parse_elf(const char * path,struct btf_ext ** btf_ext)1266 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1267 {
1268 	return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1269 }
1270 
btf__parse_elf_split(const char * path,struct btf * base_btf)1271 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf)
1272 {
1273 	return libbpf_ptr(btf_parse_elf(path, base_btf, NULL));
1274 }
1275 
btf_parse_raw(const char * path,struct btf * base_btf)1276 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
1277 {
1278 	struct btf *btf = NULL;
1279 	void *data = NULL;
1280 	FILE *f = NULL;
1281 	__u16 magic;
1282 	int err = 0;
1283 	long sz;
1284 
1285 	f = fopen(path, "rbe");
1286 	if (!f) {
1287 		err = -errno;
1288 		goto err_out;
1289 	}
1290 
1291 	/* check BTF magic */
1292 	if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) {
1293 		err = -EIO;
1294 		goto err_out;
1295 	}
1296 	if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) {
1297 		/* definitely not a raw BTF */
1298 		err = -EPROTO;
1299 		goto err_out;
1300 	}
1301 
1302 	/* get file size */
1303 	if (fseek(f, 0, SEEK_END)) {
1304 		err = -errno;
1305 		goto err_out;
1306 	}
1307 	sz = ftell(f);
1308 	if (sz < 0) {
1309 		err = -errno;
1310 		goto err_out;
1311 	}
1312 	/* rewind to the start */
1313 	if (fseek(f, 0, SEEK_SET)) {
1314 		err = -errno;
1315 		goto err_out;
1316 	}
1317 
1318 	/* pre-alloc memory and read all of BTF data */
1319 	data = malloc(sz);
1320 	if (!data) {
1321 		err = -ENOMEM;
1322 		goto err_out;
1323 	}
1324 	if (fread(data, 1, sz, f) < sz) {
1325 		err = -EIO;
1326 		goto err_out;
1327 	}
1328 
1329 	/* finally parse BTF data */
1330 	btf = btf_new(data, sz, base_btf);
1331 
1332 err_out:
1333 	free(data);
1334 	if (f)
1335 		fclose(f);
1336 	return err ? ERR_PTR(err) : btf;
1337 }
1338 
btf__parse_raw(const char * path)1339 struct btf *btf__parse_raw(const char *path)
1340 {
1341 	return libbpf_ptr(btf_parse_raw(path, NULL));
1342 }
1343 
btf__parse_raw_split(const char * path,struct btf * base_btf)1344 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf)
1345 {
1346 	return libbpf_ptr(btf_parse_raw(path, base_btf));
1347 }
1348 
btf_parse(const char * path,struct btf * base_btf,struct btf_ext ** btf_ext)1349 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1350 {
1351 	struct btf *btf;
1352 	int err;
1353 
1354 	if (btf_ext)
1355 		*btf_ext = NULL;
1356 
1357 	btf = btf_parse_raw(path, base_btf);
1358 	err = libbpf_get_error(btf);
1359 	if (!err)
1360 		return btf;
1361 	if (err != -EPROTO)
1362 		return ERR_PTR(err);
1363 	return btf_parse_elf(path, base_btf, btf_ext);
1364 }
1365 
btf__parse(const char * path,struct btf_ext ** btf_ext)1366 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1367 {
1368 	return libbpf_ptr(btf_parse(path, NULL, btf_ext));
1369 }
1370 
btf__parse_split(const char * path,struct btf * base_btf)1371 struct btf *btf__parse_split(const char *path, struct btf *base_btf)
1372 {
1373 	return libbpf_ptr(btf_parse(path, base_btf, NULL));
1374 }
1375 
1376 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1377 
btf_load_into_kernel(struct btf * btf,char * log_buf,size_t log_sz,__u32 log_level,int token_fd)1378 int btf_load_into_kernel(struct btf *btf,
1379 			 char *log_buf, size_t log_sz, __u32 log_level,
1380 			 int token_fd)
1381 {
1382 	LIBBPF_OPTS(bpf_btf_load_opts, opts);
1383 	__u32 buf_sz = 0, raw_size;
1384 	char *buf = NULL, *tmp;
1385 	void *raw_data;
1386 	int err = 0;
1387 
1388 	if (btf->fd >= 0)
1389 		return libbpf_err(-EEXIST);
1390 	if (log_sz && !log_buf)
1391 		return libbpf_err(-EINVAL);
1392 
1393 	/* cache native raw data representation */
1394 	raw_data = btf_get_raw_data(btf, &raw_size, false);
1395 	if (!raw_data) {
1396 		err = -ENOMEM;
1397 		goto done;
1398 	}
1399 	btf->raw_size = raw_size;
1400 	btf->raw_data = raw_data;
1401 
1402 retry_load:
1403 	/* if log_level is 0, we won't provide log_buf/log_size to the kernel,
1404 	 * initially. Only if BTF loading fails, we bump log_level to 1 and
1405 	 * retry, using either auto-allocated or custom log_buf. This way
1406 	 * non-NULL custom log_buf provides a buffer just in case, but hopes
1407 	 * for successful load and no need for log_buf.
1408 	 */
1409 	if (log_level) {
1410 		/* if caller didn't provide custom log_buf, we'll keep
1411 		 * allocating our own progressively bigger buffers for BTF
1412 		 * verification log
1413 		 */
1414 		if (!log_buf) {
1415 			buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2);
1416 			tmp = realloc(buf, buf_sz);
1417 			if (!tmp) {
1418 				err = -ENOMEM;
1419 				goto done;
1420 			}
1421 			buf = tmp;
1422 			buf[0] = '\0';
1423 		}
1424 
1425 		opts.log_buf = log_buf ? log_buf : buf;
1426 		opts.log_size = log_buf ? log_sz : buf_sz;
1427 		opts.log_level = log_level;
1428 	}
1429 
1430 	opts.token_fd = token_fd;
1431 	if (token_fd)
1432 		opts.btf_flags |= BPF_F_TOKEN_FD;
1433 
1434 	btf->fd = bpf_btf_load(raw_data, raw_size, &opts);
1435 	if (btf->fd < 0) {
1436 		/* time to turn on verbose mode and try again */
1437 		if (log_level == 0) {
1438 			log_level = 1;
1439 			goto retry_load;
1440 		}
1441 		/* only retry if caller didn't provide custom log_buf, but
1442 		 * make sure we can never overflow buf_sz
1443 		 */
1444 		if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2)
1445 			goto retry_load;
1446 
1447 		err = -errno;
1448 		pr_warn("BTF loading error: %d\n", err);
1449 		/* don't print out contents of custom log_buf */
1450 		if (!log_buf && buf[0])
1451 			pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf);
1452 	}
1453 
1454 done:
1455 	free(buf);
1456 	return libbpf_err(err);
1457 }
1458 
btf__load_into_kernel(struct btf * btf)1459 int btf__load_into_kernel(struct btf *btf)
1460 {
1461 	return btf_load_into_kernel(btf, NULL, 0, 0, 0);
1462 }
1463 
btf__fd(const struct btf * btf)1464 int btf__fd(const struct btf *btf)
1465 {
1466 	return btf->fd;
1467 }
1468 
btf__set_fd(struct btf * btf,int fd)1469 void btf__set_fd(struct btf *btf, int fd)
1470 {
1471 	btf->fd = fd;
1472 }
1473 
btf_strs_data(const struct btf * btf)1474 static const void *btf_strs_data(const struct btf *btf)
1475 {
1476 	return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set);
1477 }
1478 
btf_get_raw_data(const struct btf * btf,__u32 * size,bool swap_endian)1479 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian)
1480 {
1481 	struct btf_header *hdr = btf->hdr;
1482 	struct btf_type *t;
1483 	void *data, *p;
1484 	__u32 data_sz;
1485 	int i;
1486 
1487 	data = swap_endian ? btf->raw_data_swapped : btf->raw_data;
1488 	if (data) {
1489 		*size = btf->raw_size;
1490 		return data;
1491 	}
1492 
1493 	data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len;
1494 	data = calloc(1, data_sz);
1495 	if (!data)
1496 		return NULL;
1497 	p = data;
1498 
1499 	memcpy(p, hdr, hdr->hdr_len);
1500 	if (swap_endian)
1501 		btf_bswap_hdr(p);
1502 	p += hdr->hdr_len;
1503 
1504 	memcpy(p, btf->types_data, hdr->type_len);
1505 	if (swap_endian) {
1506 		for (i = 0; i < btf->nr_types; i++) {
1507 			t = p + btf->type_offs[i];
1508 			/* btf_bswap_type_rest() relies on native t->info, so
1509 			 * we swap base type info after we swapped all the
1510 			 * additional information
1511 			 */
1512 			if (btf_bswap_type_rest(t))
1513 				goto err_out;
1514 			btf_bswap_type_base(t);
1515 		}
1516 	}
1517 	p += hdr->type_len;
1518 
1519 	memcpy(p, btf_strs_data(btf), hdr->str_len);
1520 	p += hdr->str_len;
1521 
1522 	*size = data_sz;
1523 	return data;
1524 err_out:
1525 	free(data);
1526 	return NULL;
1527 }
1528 
btf__raw_data(const struct btf * btf_ro,__u32 * size)1529 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size)
1530 {
1531 	struct btf *btf = (struct btf *)btf_ro;
1532 	__u32 data_sz;
1533 	void *data;
1534 
1535 	data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian);
1536 	if (!data)
1537 		return errno = ENOMEM, NULL;
1538 
1539 	btf->raw_size = data_sz;
1540 	if (btf->swapped_endian)
1541 		btf->raw_data_swapped = data;
1542 	else
1543 		btf->raw_data = data;
1544 	*size = data_sz;
1545 	return data;
1546 }
1547 
1548 __attribute__((alias("btf__raw_data")))
1549 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1550 
btf__str_by_offset(const struct btf * btf,__u32 offset)1551 const char *btf__str_by_offset(const struct btf *btf, __u32 offset)
1552 {
1553 	if (offset < btf->start_str_off)
1554 		return btf__str_by_offset(btf->base_btf, offset);
1555 	else if (offset - btf->start_str_off < btf->hdr->str_len)
1556 		return btf_strs_data(btf) + (offset - btf->start_str_off);
1557 	else
1558 		return errno = EINVAL, NULL;
1559 }
1560 
btf__name_by_offset(const struct btf * btf,__u32 offset)1561 const char *btf__name_by_offset(const struct btf *btf, __u32 offset)
1562 {
1563 	return btf__str_by_offset(btf, offset);
1564 }
1565 
btf_get_from_fd(int btf_fd,struct btf * base_btf)1566 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf)
1567 {
1568 	struct bpf_btf_info btf_info;
1569 	__u32 len = sizeof(btf_info);
1570 	__u32 last_size;
1571 	struct btf *btf;
1572 	void *ptr;
1573 	int err;
1574 
1575 	/* we won't know btf_size until we call bpf_btf_get_info_by_fd(). so
1576 	 * let's start with a sane default - 4KiB here - and resize it only if
1577 	 * bpf_btf_get_info_by_fd() needs a bigger buffer.
1578 	 */
1579 	last_size = 4096;
1580 	ptr = malloc(last_size);
1581 	if (!ptr)
1582 		return ERR_PTR(-ENOMEM);
1583 
1584 	memset(&btf_info, 0, sizeof(btf_info));
1585 	btf_info.btf = ptr_to_u64(ptr);
1586 	btf_info.btf_size = last_size;
1587 	err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len);
1588 
1589 	if (!err && btf_info.btf_size > last_size) {
1590 		void *temp_ptr;
1591 
1592 		last_size = btf_info.btf_size;
1593 		temp_ptr = realloc(ptr, last_size);
1594 		if (!temp_ptr) {
1595 			btf = ERR_PTR(-ENOMEM);
1596 			goto exit_free;
1597 		}
1598 		ptr = temp_ptr;
1599 
1600 		len = sizeof(btf_info);
1601 		memset(&btf_info, 0, sizeof(btf_info));
1602 		btf_info.btf = ptr_to_u64(ptr);
1603 		btf_info.btf_size = last_size;
1604 
1605 		err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len);
1606 	}
1607 
1608 	if (err || btf_info.btf_size > last_size) {
1609 		btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG);
1610 		goto exit_free;
1611 	}
1612 
1613 	btf = btf_new(ptr, btf_info.btf_size, base_btf);
1614 
1615 exit_free:
1616 	free(ptr);
1617 	return btf;
1618 }
1619 
btf__load_from_kernel_by_id_split(__u32 id,struct btf * base_btf)1620 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf)
1621 {
1622 	struct btf *btf;
1623 	int btf_fd;
1624 
1625 	btf_fd = bpf_btf_get_fd_by_id(id);
1626 	if (btf_fd < 0)
1627 		return libbpf_err_ptr(-errno);
1628 
1629 	btf = btf_get_from_fd(btf_fd, base_btf);
1630 	close(btf_fd);
1631 
1632 	return libbpf_ptr(btf);
1633 }
1634 
btf__load_from_kernel_by_id(__u32 id)1635 struct btf *btf__load_from_kernel_by_id(__u32 id)
1636 {
1637 	return btf__load_from_kernel_by_id_split(id, NULL);
1638 }
1639 
btf_invalidate_raw_data(struct btf * btf)1640 static void btf_invalidate_raw_data(struct btf *btf)
1641 {
1642 	if (btf->raw_data) {
1643 		free(btf->raw_data);
1644 		btf->raw_data = NULL;
1645 	}
1646 	if (btf->raw_data_swapped) {
1647 		free(btf->raw_data_swapped);
1648 		btf->raw_data_swapped = NULL;
1649 	}
1650 }
1651 
1652 /* Ensure BTF is ready to be modified (by splitting into a three memory
1653  * regions for header, types, and strings). Also invalidate cached
1654  * raw_data, if any.
1655  */
btf_ensure_modifiable(struct btf * btf)1656 static int btf_ensure_modifiable(struct btf *btf)
1657 {
1658 	void *hdr, *types;
1659 	struct strset *set = NULL;
1660 	int err = -ENOMEM;
1661 
1662 	if (btf_is_modifiable(btf)) {
1663 		/* any BTF modification invalidates raw_data */
1664 		btf_invalidate_raw_data(btf);
1665 		return 0;
1666 	}
1667 
1668 	/* split raw data into three memory regions */
1669 	hdr = malloc(btf->hdr->hdr_len);
1670 	types = malloc(btf->hdr->type_len);
1671 	if (!hdr || !types)
1672 		goto err_out;
1673 
1674 	memcpy(hdr, btf->hdr, btf->hdr->hdr_len);
1675 	memcpy(types, btf->types_data, btf->hdr->type_len);
1676 
1677 	/* build lookup index for all strings */
1678 	set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len);
1679 	if (IS_ERR(set)) {
1680 		err = PTR_ERR(set);
1681 		goto err_out;
1682 	}
1683 
1684 	/* only when everything was successful, update internal state */
1685 	btf->hdr = hdr;
1686 	btf->types_data = types;
1687 	btf->types_data_cap = btf->hdr->type_len;
1688 	btf->strs_data = NULL;
1689 	btf->strs_set = set;
1690 	/* if BTF was created from scratch, all strings are guaranteed to be
1691 	 * unique and deduplicated
1692 	 */
1693 	if (btf->hdr->str_len == 0)
1694 		btf->strs_deduped = true;
1695 	if (!btf->base_btf && btf->hdr->str_len == 1)
1696 		btf->strs_deduped = true;
1697 
1698 	/* invalidate raw_data representation */
1699 	btf_invalidate_raw_data(btf);
1700 
1701 	return 0;
1702 
1703 err_out:
1704 	strset__free(set);
1705 	free(hdr);
1706 	free(types);
1707 	return err;
1708 }
1709 
1710 /* Find an offset in BTF string section that corresponds to a given string *s*.
1711  * Returns:
1712  *   - >0 offset into string section, if string is found;
1713  *   - -ENOENT, if string is not in the string section;
1714  *   - <0, on any other error.
1715  */
btf__find_str(struct btf * btf,const char * s)1716 int btf__find_str(struct btf *btf, const char *s)
1717 {
1718 	int off;
1719 
1720 	if (btf->base_btf) {
1721 		off = btf__find_str(btf->base_btf, s);
1722 		if (off != -ENOENT)
1723 			return off;
1724 	}
1725 
1726 	/* BTF needs to be in a modifiable state to build string lookup index */
1727 	if (btf_ensure_modifiable(btf))
1728 		return libbpf_err(-ENOMEM);
1729 
1730 	off = strset__find_str(btf->strs_set, s);
1731 	if (off < 0)
1732 		return libbpf_err(off);
1733 
1734 	return btf->start_str_off + off;
1735 }
1736 
1737 /* Add a string s to the BTF string section.
1738  * Returns:
1739  *   - > 0 offset into string section, on success;
1740  *   - < 0, on error.
1741  */
btf__add_str(struct btf * btf,const char * s)1742 int btf__add_str(struct btf *btf, const char *s)
1743 {
1744 	int off;
1745 
1746 	if (btf->base_btf) {
1747 		off = btf__find_str(btf->base_btf, s);
1748 		if (off != -ENOENT)
1749 			return off;
1750 	}
1751 
1752 	if (btf_ensure_modifiable(btf))
1753 		return libbpf_err(-ENOMEM);
1754 
1755 	off = strset__add_str(btf->strs_set, s);
1756 	if (off < 0)
1757 		return libbpf_err(off);
1758 
1759 	btf->hdr->str_len = strset__data_size(btf->strs_set);
1760 
1761 	return btf->start_str_off + off;
1762 }
1763 
btf_add_type_mem(struct btf * btf,size_t add_sz)1764 static void *btf_add_type_mem(struct btf *btf, size_t add_sz)
1765 {
1766 	return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1,
1767 			      btf->hdr->type_len, UINT_MAX, add_sz);
1768 }
1769 
btf_type_inc_vlen(struct btf_type * t)1770 static void btf_type_inc_vlen(struct btf_type *t)
1771 {
1772 	t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
1773 }
1774 
btf_commit_type(struct btf * btf,int data_sz)1775 static int btf_commit_type(struct btf *btf, int data_sz)
1776 {
1777 	int err;
1778 
1779 	err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
1780 	if (err)
1781 		return libbpf_err(err);
1782 
1783 	btf->hdr->type_len += data_sz;
1784 	btf->hdr->str_off += data_sz;
1785 	btf->nr_types++;
1786 	return btf->start_id + btf->nr_types - 1;
1787 }
1788 
1789 struct btf_pipe {
1790 	const struct btf *src;
1791 	struct btf *dst;
1792 	struct hashmap *str_off_map; /* map string offsets from src to dst */
1793 };
1794 
btf_rewrite_str(struct btf_pipe * p,__u32 * str_off)1795 static int btf_rewrite_str(struct btf_pipe *p, __u32 *str_off)
1796 {
1797 	long mapped_off;
1798 	int off, err;
1799 
1800 	if (!*str_off) /* nothing to do for empty strings */
1801 		return 0;
1802 
1803 	if (p->str_off_map &&
1804 	    hashmap__find(p->str_off_map, *str_off, &mapped_off)) {
1805 		*str_off = mapped_off;
1806 		return 0;
1807 	}
1808 
1809 	off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
1810 	if (off < 0)
1811 		return off;
1812 
1813 	/* Remember string mapping from src to dst.  It avoids
1814 	 * performing expensive string comparisons.
1815 	 */
1816 	if (p->str_off_map) {
1817 		err = hashmap__append(p->str_off_map, *str_off, off);
1818 		if (err)
1819 			return err;
1820 	}
1821 
1822 	*str_off = off;
1823 	return 0;
1824 }
1825 
btf_add_type(struct btf_pipe * p,const struct btf_type * src_type)1826 static int btf_add_type(struct btf_pipe *p, const struct btf_type *src_type)
1827 {
1828 	struct btf_field_iter it;
1829 	struct btf_type *t;
1830 	__u32 *str_off;
1831 	int sz, err;
1832 
1833 	sz = btf_type_size(src_type);
1834 	if (sz < 0)
1835 		return libbpf_err(sz);
1836 
1837 	/* deconstruct BTF, if necessary, and invalidate raw_data */
1838 	if (btf_ensure_modifiable(p->dst))
1839 		return libbpf_err(-ENOMEM);
1840 
1841 	t = btf_add_type_mem(p->dst, sz);
1842 	if (!t)
1843 		return libbpf_err(-ENOMEM);
1844 
1845 	memcpy(t, src_type, sz);
1846 
1847 	err = btf_field_iter_init(&it, t, BTF_FIELD_ITER_STRS);
1848 	if (err)
1849 		return libbpf_err(err);
1850 
1851 	while ((str_off = btf_field_iter_next(&it))) {
1852 		err = btf_rewrite_str(p, str_off);
1853 		if (err)
1854 			return libbpf_err(err);
1855 	}
1856 
1857 	return btf_commit_type(p->dst, sz);
1858 }
1859 
btf__add_type(struct btf * btf,const struct btf * src_btf,const struct btf_type * src_type)1860 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
1861 {
1862 	struct btf_pipe p = { .src = src_btf, .dst = btf };
1863 
1864 	return btf_add_type(&p, src_type);
1865 }
1866 
1867 static size_t btf_dedup_identity_hash_fn(long key, void *ctx);
1868 static bool btf_dedup_equal_fn(long k1, long k2, void *ctx);
1869 
btf__add_btf(struct btf * btf,const struct btf * src_btf)1870 int btf__add_btf(struct btf *btf, const struct btf *src_btf)
1871 {
1872 	struct btf_pipe p = { .src = src_btf, .dst = btf };
1873 	int data_sz, sz, cnt, i, err, old_strs_len;
1874 	__u32 *off;
1875 	void *t;
1876 
1877 	/* appending split BTF isn't supported yet */
1878 	if (src_btf->base_btf)
1879 		return libbpf_err(-ENOTSUP);
1880 
1881 	/* deconstruct BTF, if necessary, and invalidate raw_data */
1882 	if (btf_ensure_modifiable(btf))
1883 		return libbpf_err(-ENOMEM);
1884 
1885 	/* remember original strings section size if we have to roll back
1886 	 * partial strings section changes
1887 	 */
1888 	old_strs_len = btf->hdr->str_len;
1889 
1890 	data_sz = src_btf->hdr->type_len;
1891 	cnt = btf__type_cnt(src_btf) - 1;
1892 
1893 	/* pre-allocate enough memory for new types */
1894 	t = btf_add_type_mem(btf, data_sz);
1895 	if (!t)
1896 		return libbpf_err(-ENOMEM);
1897 
1898 	/* pre-allocate enough memory for type offset index for new types */
1899 	off = btf_add_type_offs_mem(btf, cnt);
1900 	if (!off)
1901 		return libbpf_err(-ENOMEM);
1902 
1903 	/* Map the string offsets from src_btf to the offsets from btf to improve performance */
1904 	p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
1905 	if (IS_ERR(p.str_off_map))
1906 		return libbpf_err(-ENOMEM);
1907 
1908 	/* bulk copy types data for all types from src_btf */
1909 	memcpy(t, src_btf->types_data, data_sz);
1910 
1911 	for (i = 0; i < cnt; i++) {
1912 		struct btf_field_iter it;
1913 		__u32 *type_id, *str_off;
1914 
1915 		sz = btf_type_size(t);
1916 		if (sz < 0) {
1917 			/* unlikely, has to be corrupted src_btf */
1918 			err = sz;
1919 			goto err_out;
1920 		}
1921 
1922 		/* fill out type ID to type offset mapping for lookups by type ID */
1923 		*off = t - btf->types_data;
1924 
1925 		/* add, dedup, and remap strings referenced by this BTF type */
1926 		err = btf_field_iter_init(&it, t, BTF_FIELD_ITER_STRS);
1927 		if (err)
1928 			goto err_out;
1929 		while ((str_off = btf_field_iter_next(&it))) {
1930 			err = btf_rewrite_str(&p, str_off);
1931 			if (err)
1932 				goto err_out;
1933 		}
1934 
1935 		/* remap all type IDs referenced from this BTF type */
1936 		err = btf_field_iter_init(&it, t, BTF_FIELD_ITER_IDS);
1937 		if (err)
1938 			goto err_out;
1939 
1940 		while ((type_id = btf_field_iter_next(&it))) {
1941 			if (!*type_id) /* nothing to do for VOID references */
1942 				continue;
1943 
1944 			/* we haven't updated btf's type count yet, so
1945 			 * btf->start_id + btf->nr_types - 1 is the type ID offset we should
1946 			 * add to all newly added BTF types
1947 			 */
1948 			*type_id += btf->start_id + btf->nr_types - 1;
1949 		}
1950 
1951 		/* go to next type data and type offset index entry */
1952 		t += sz;
1953 		off++;
1954 	}
1955 
1956 	/* Up until now any of the copied type data was effectively invisible,
1957 	 * so if we exited early before this point due to error, BTF would be
1958 	 * effectively unmodified. There would be extra internal memory
1959 	 * pre-allocated, but it would not be available for querying.  But now
1960 	 * that we've copied and rewritten all the data successfully, we can
1961 	 * update type count and various internal offsets and sizes to
1962 	 * "commit" the changes and made them visible to the outside world.
1963 	 */
1964 	btf->hdr->type_len += data_sz;
1965 	btf->hdr->str_off += data_sz;
1966 	btf->nr_types += cnt;
1967 
1968 	hashmap__free(p.str_off_map);
1969 
1970 	/* return type ID of the first added BTF type */
1971 	return btf->start_id + btf->nr_types - cnt;
1972 err_out:
1973 	/* zero out preallocated memory as if it was just allocated with
1974 	 * libbpf_add_mem()
1975 	 */
1976 	memset(btf->types_data + btf->hdr->type_len, 0, data_sz);
1977 	memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len);
1978 
1979 	/* and now restore original strings section size; types data size
1980 	 * wasn't modified, so doesn't need restoring, see big comment above
1981 	 */
1982 	btf->hdr->str_len = old_strs_len;
1983 
1984 	hashmap__free(p.str_off_map);
1985 
1986 	return libbpf_err(err);
1987 }
1988 
1989 /*
1990  * Append new BTF_KIND_INT type with:
1991  *   - *name* - non-empty, non-NULL type name;
1992  *   - *sz* - power-of-2 (1, 2, 4, ..) size of the type, in bytes;
1993  *   - encoding is a combination of BTF_INT_SIGNED, BTF_INT_CHAR, BTF_INT_BOOL.
1994  * Returns:
1995  *   - >0, type ID of newly added BTF type;
1996  *   - <0, on error.
1997  */
btf__add_int(struct btf * btf,const char * name,size_t byte_sz,int encoding)1998 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
1999 {
2000 	struct btf_type *t;
2001 	int sz, name_off;
2002 
2003 	/* non-empty name */
2004 	if (!name || !name[0])
2005 		return libbpf_err(-EINVAL);
2006 	/* byte_sz must be power of 2 */
2007 	if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16)
2008 		return libbpf_err(-EINVAL);
2009 	if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL))
2010 		return libbpf_err(-EINVAL);
2011 
2012 	/* deconstruct BTF, if necessary, and invalidate raw_data */
2013 	if (btf_ensure_modifiable(btf))
2014 		return libbpf_err(-ENOMEM);
2015 
2016 	sz = sizeof(struct btf_type) + sizeof(int);
2017 	t = btf_add_type_mem(btf, sz);
2018 	if (!t)
2019 		return libbpf_err(-ENOMEM);
2020 
2021 	/* if something goes wrong later, we might end up with an extra string,
2022 	 * but that shouldn't be a problem, because BTF can't be constructed
2023 	 * completely anyway and will most probably be just discarded
2024 	 */
2025 	name_off = btf__add_str(btf, name);
2026 	if (name_off < 0)
2027 		return name_off;
2028 
2029 	t->name_off = name_off;
2030 	t->info = btf_type_info(BTF_KIND_INT, 0, 0);
2031 	t->size = byte_sz;
2032 	/* set INT info, we don't allow setting legacy bit offset/size */
2033 	*(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
2034 
2035 	return btf_commit_type(btf, sz);
2036 }
2037 
2038 /*
2039  * Append new BTF_KIND_FLOAT type with:
2040  *   - *name* - non-empty, non-NULL type name;
2041  *   - *sz* - size of the type, in bytes;
2042  * Returns:
2043  *   - >0, type ID of newly added BTF type;
2044  *   - <0, on error.
2045  */
btf__add_float(struct btf * btf,const char * name,size_t byte_sz)2046 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz)
2047 {
2048 	struct btf_type *t;
2049 	int sz, name_off;
2050 
2051 	/* non-empty name */
2052 	if (!name || !name[0])
2053 		return libbpf_err(-EINVAL);
2054 
2055 	/* byte_sz must be one of the explicitly allowed values */
2056 	if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 &&
2057 	    byte_sz != 16)
2058 		return libbpf_err(-EINVAL);
2059 
2060 	if (btf_ensure_modifiable(btf))
2061 		return libbpf_err(-ENOMEM);
2062 
2063 	sz = sizeof(struct btf_type);
2064 	t = btf_add_type_mem(btf, sz);
2065 	if (!t)
2066 		return libbpf_err(-ENOMEM);
2067 
2068 	name_off = btf__add_str(btf, name);
2069 	if (name_off < 0)
2070 		return name_off;
2071 
2072 	t->name_off = name_off;
2073 	t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
2074 	t->size = byte_sz;
2075 
2076 	return btf_commit_type(btf, sz);
2077 }
2078 
2079 /* it's completely legal to append BTF types with type IDs pointing forward to
2080  * types that haven't been appended yet, so we only make sure that id looks
2081  * sane, we can't guarantee that ID will always be valid
2082  */
validate_type_id(int id)2083 static int validate_type_id(int id)
2084 {
2085 	if (id < 0 || id > BTF_MAX_NR_TYPES)
2086 		return -EINVAL;
2087 	return 0;
2088 }
2089 
2090 /* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */
btf_add_ref_kind(struct btf * btf,int kind,const char * name,int ref_type_id)2091 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
2092 {
2093 	struct btf_type *t;
2094 	int sz, name_off = 0;
2095 
2096 	if (validate_type_id(ref_type_id))
2097 		return libbpf_err(-EINVAL);
2098 
2099 	if (btf_ensure_modifiable(btf))
2100 		return libbpf_err(-ENOMEM);
2101 
2102 	sz = sizeof(struct btf_type);
2103 	t = btf_add_type_mem(btf, sz);
2104 	if (!t)
2105 		return libbpf_err(-ENOMEM);
2106 
2107 	if (name && name[0]) {
2108 		name_off = btf__add_str(btf, name);
2109 		if (name_off < 0)
2110 			return name_off;
2111 	}
2112 
2113 	t->name_off = name_off;
2114 	t->info = btf_type_info(kind, 0, 0);
2115 	t->type = ref_type_id;
2116 
2117 	return btf_commit_type(btf, sz);
2118 }
2119 
2120 /*
2121  * Append new BTF_KIND_PTR type with:
2122  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2123  * Returns:
2124  *   - >0, type ID of newly added BTF type;
2125  *   - <0, on error.
2126  */
btf__add_ptr(struct btf * btf,int ref_type_id)2127 int btf__add_ptr(struct btf *btf, int ref_type_id)
2128 {
2129 	return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
2130 }
2131 
2132 /*
2133  * Append new BTF_KIND_ARRAY type with:
2134  *   - *index_type_id* - type ID of the type describing array index;
2135  *   - *elem_type_id* - type ID of the type describing array element;
2136  *   - *nr_elems* - the size of the array;
2137  * Returns:
2138  *   - >0, type ID of newly added BTF type;
2139  *   - <0, on error.
2140  */
btf__add_array(struct btf * btf,int index_type_id,int elem_type_id,__u32 nr_elems)2141 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems)
2142 {
2143 	struct btf_type *t;
2144 	struct btf_array *a;
2145 	int sz;
2146 
2147 	if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
2148 		return libbpf_err(-EINVAL);
2149 
2150 	if (btf_ensure_modifiable(btf))
2151 		return libbpf_err(-ENOMEM);
2152 
2153 	sz = sizeof(struct btf_type) + sizeof(struct btf_array);
2154 	t = btf_add_type_mem(btf, sz);
2155 	if (!t)
2156 		return libbpf_err(-ENOMEM);
2157 
2158 	t->name_off = 0;
2159 	t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0);
2160 	t->size = 0;
2161 
2162 	a = btf_array(t);
2163 	a->type = elem_type_id;
2164 	a->index_type = index_type_id;
2165 	a->nelems = nr_elems;
2166 
2167 	return btf_commit_type(btf, sz);
2168 }
2169 
2170 /* generic STRUCT/UNION append function */
btf_add_composite(struct btf * btf,int kind,const char * name,__u32 bytes_sz)2171 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
2172 {
2173 	struct btf_type *t;
2174 	int sz, name_off = 0;
2175 
2176 	if (btf_ensure_modifiable(btf))
2177 		return libbpf_err(-ENOMEM);
2178 
2179 	sz = sizeof(struct btf_type);
2180 	t = btf_add_type_mem(btf, sz);
2181 	if (!t)
2182 		return libbpf_err(-ENOMEM);
2183 
2184 	if (name && name[0]) {
2185 		name_off = btf__add_str(btf, name);
2186 		if (name_off < 0)
2187 			return name_off;
2188 	}
2189 
2190 	/* start out with vlen=0 and no kflag; this will be adjusted when
2191 	 * adding each member
2192 	 */
2193 	t->name_off = name_off;
2194 	t->info = btf_type_info(kind, 0, 0);
2195 	t->size = bytes_sz;
2196 
2197 	return btf_commit_type(btf, sz);
2198 }
2199 
2200 /*
2201  * Append new BTF_KIND_STRUCT type with:
2202  *   - *name* - name of the struct, can be NULL or empty for anonymous structs;
2203  *   - *byte_sz* - size of the struct, in bytes;
2204  *
2205  * Struct initially has no fields in it. Fields can be added by
2206  * btf__add_field() right after btf__add_struct() succeeds.
2207  *
2208  * Returns:
2209  *   - >0, type ID of newly added BTF type;
2210  *   - <0, on error.
2211  */
btf__add_struct(struct btf * btf,const char * name,__u32 byte_sz)2212 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz)
2213 {
2214 	return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz);
2215 }
2216 
2217 /*
2218  * Append new BTF_KIND_UNION type with:
2219  *   - *name* - name of the union, can be NULL or empty for anonymous union;
2220  *   - *byte_sz* - size of the union, in bytes;
2221  *
2222  * Union initially has no fields in it. Fields can be added by
2223  * btf__add_field() right after btf__add_union() succeeds. All fields
2224  * should have *bit_offset* of 0.
2225  *
2226  * Returns:
2227  *   - >0, type ID of newly added BTF type;
2228  *   - <0, on error.
2229  */
btf__add_union(struct btf * btf,const char * name,__u32 byte_sz)2230 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz)
2231 {
2232 	return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
2233 }
2234 
btf_last_type(struct btf * btf)2235 static struct btf_type *btf_last_type(struct btf *btf)
2236 {
2237 	return btf_type_by_id(btf, btf__type_cnt(btf) - 1);
2238 }
2239 
2240 /*
2241  * Append new field for the current STRUCT/UNION type with:
2242  *   - *name* - name of the field, can be NULL or empty for anonymous field;
2243  *   - *type_id* - type ID for the type describing field type;
2244  *   - *bit_offset* - bit offset of the start of the field within struct/union;
2245  *   - *bit_size* - bit size of a bitfield, 0 for non-bitfield fields;
2246  * Returns:
2247  *   -  0, on success;
2248  *   - <0, on error.
2249  */
btf__add_field(struct btf * btf,const char * name,int type_id,__u32 bit_offset,__u32 bit_size)2250 int btf__add_field(struct btf *btf, const char *name, int type_id,
2251 		   __u32 bit_offset, __u32 bit_size)
2252 {
2253 	struct btf_type *t;
2254 	struct btf_member *m;
2255 	bool is_bitfield;
2256 	int sz, name_off = 0;
2257 
2258 	/* last type should be union/struct */
2259 	if (btf->nr_types == 0)
2260 		return libbpf_err(-EINVAL);
2261 	t = btf_last_type(btf);
2262 	if (!btf_is_composite(t))
2263 		return libbpf_err(-EINVAL);
2264 
2265 	if (validate_type_id(type_id))
2266 		return libbpf_err(-EINVAL);
2267 	/* best-effort bit field offset/size enforcement */
2268 	is_bitfield = bit_size || (bit_offset % 8 != 0);
2269 	if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff))
2270 		return libbpf_err(-EINVAL);
2271 
2272 	/* only offset 0 is allowed for unions */
2273 	if (btf_is_union(t) && bit_offset)
2274 		return libbpf_err(-EINVAL);
2275 
2276 	/* decompose and invalidate raw data */
2277 	if (btf_ensure_modifiable(btf))
2278 		return libbpf_err(-ENOMEM);
2279 
2280 	sz = sizeof(struct btf_member);
2281 	m = btf_add_type_mem(btf, sz);
2282 	if (!m)
2283 		return libbpf_err(-ENOMEM);
2284 
2285 	if (name && name[0]) {
2286 		name_off = btf__add_str(btf, name);
2287 		if (name_off < 0)
2288 			return name_off;
2289 	}
2290 
2291 	m->name_off = name_off;
2292 	m->type = type_id;
2293 	m->offset = bit_offset | (bit_size << 24);
2294 
2295 	/* btf_add_type_mem can invalidate t pointer */
2296 	t = btf_last_type(btf);
2297 	/* update parent type's vlen and kflag */
2298 	t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
2299 
2300 	btf->hdr->type_len += sz;
2301 	btf->hdr->str_off += sz;
2302 	return 0;
2303 }
2304 
btf_add_enum_common(struct btf * btf,const char * name,__u32 byte_sz,bool is_signed,__u8 kind)2305 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz,
2306 			       bool is_signed, __u8 kind)
2307 {
2308 	struct btf_type *t;
2309 	int sz, name_off = 0;
2310 
2311 	/* byte_sz must be power of 2 */
2312 	if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
2313 		return libbpf_err(-EINVAL);
2314 
2315 	if (btf_ensure_modifiable(btf))
2316 		return libbpf_err(-ENOMEM);
2317 
2318 	sz = sizeof(struct btf_type);
2319 	t = btf_add_type_mem(btf, sz);
2320 	if (!t)
2321 		return libbpf_err(-ENOMEM);
2322 
2323 	if (name && name[0]) {
2324 		name_off = btf__add_str(btf, name);
2325 		if (name_off < 0)
2326 			return name_off;
2327 	}
2328 
2329 	/* start out with vlen=0; it will be adjusted when adding enum values */
2330 	t->name_off = name_off;
2331 	t->info = btf_type_info(kind, 0, is_signed);
2332 	t->size = byte_sz;
2333 
2334 	return btf_commit_type(btf, sz);
2335 }
2336 
2337 /*
2338  * Append new BTF_KIND_ENUM type with:
2339  *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2340  *   - *byte_sz* - size of the enum, in bytes.
2341  *
2342  * Enum initially has no enum values in it (and corresponds to enum forward
2343  * declaration). Enumerator values can be added by btf__add_enum_value()
2344  * immediately after btf__add_enum() succeeds.
2345  *
2346  * Returns:
2347  *   - >0, type ID of newly added BTF type;
2348  *   - <0, on error.
2349  */
btf__add_enum(struct btf * btf,const char * name,__u32 byte_sz)2350 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
2351 {
2352 	/*
2353 	 * set the signedness to be unsigned, it will change to signed
2354 	 * if any later enumerator is negative.
2355 	 */
2356 	return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM);
2357 }
2358 
2359 /*
2360  * Append new enum value for the current ENUM type with:
2361  *   - *name* - name of the enumerator value, can't be NULL or empty;
2362  *   - *value* - integer value corresponding to enum value *name*;
2363  * Returns:
2364  *   -  0, on success;
2365  *   - <0, on error.
2366  */
btf__add_enum_value(struct btf * btf,const char * name,__s64 value)2367 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value)
2368 {
2369 	struct btf_type *t;
2370 	struct btf_enum *v;
2371 	int sz, name_off;
2372 
2373 	/* last type should be BTF_KIND_ENUM */
2374 	if (btf->nr_types == 0)
2375 		return libbpf_err(-EINVAL);
2376 	t = btf_last_type(btf);
2377 	if (!btf_is_enum(t))
2378 		return libbpf_err(-EINVAL);
2379 
2380 	/* non-empty name */
2381 	if (!name || !name[0])
2382 		return libbpf_err(-EINVAL);
2383 	if (value < INT_MIN || value > UINT_MAX)
2384 		return libbpf_err(-E2BIG);
2385 
2386 	/* decompose and invalidate raw data */
2387 	if (btf_ensure_modifiable(btf))
2388 		return libbpf_err(-ENOMEM);
2389 
2390 	sz = sizeof(struct btf_enum);
2391 	v = btf_add_type_mem(btf, sz);
2392 	if (!v)
2393 		return libbpf_err(-ENOMEM);
2394 
2395 	name_off = btf__add_str(btf, name);
2396 	if (name_off < 0)
2397 		return name_off;
2398 
2399 	v->name_off = name_off;
2400 	v->val = value;
2401 
2402 	/* update parent type's vlen */
2403 	t = btf_last_type(btf);
2404 	btf_type_inc_vlen(t);
2405 
2406 	/* if negative value, set signedness to signed */
2407 	if (value < 0)
2408 		t->info = btf_type_info(btf_kind(t), btf_vlen(t), true);
2409 
2410 	btf->hdr->type_len += sz;
2411 	btf->hdr->str_off += sz;
2412 	return 0;
2413 }
2414 
2415 /*
2416  * Append new BTF_KIND_ENUM64 type with:
2417  *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2418  *   - *byte_sz* - size of the enum, in bytes.
2419  *   - *is_signed* - whether the enum values are signed or not;
2420  *
2421  * Enum initially has no enum values in it (and corresponds to enum forward
2422  * declaration). Enumerator values can be added by btf__add_enum64_value()
2423  * immediately after btf__add_enum64() succeeds.
2424  *
2425  * Returns:
2426  *   - >0, type ID of newly added BTF type;
2427  *   - <0, on error.
2428  */
btf__add_enum64(struct btf * btf,const char * name,__u32 byte_sz,bool is_signed)2429 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz,
2430 		    bool is_signed)
2431 {
2432 	return btf_add_enum_common(btf, name, byte_sz, is_signed,
2433 				   BTF_KIND_ENUM64);
2434 }
2435 
2436 /*
2437  * Append new enum value for the current ENUM64 type with:
2438  *   - *name* - name of the enumerator value, can't be NULL or empty;
2439  *   - *value* - integer value corresponding to enum value *name*;
2440  * Returns:
2441  *   -  0, on success;
2442  *   - <0, on error.
2443  */
btf__add_enum64_value(struct btf * btf,const char * name,__u64 value)2444 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value)
2445 {
2446 	struct btf_enum64 *v;
2447 	struct btf_type *t;
2448 	int sz, name_off;
2449 
2450 	/* last type should be BTF_KIND_ENUM64 */
2451 	if (btf->nr_types == 0)
2452 		return libbpf_err(-EINVAL);
2453 	t = btf_last_type(btf);
2454 	if (!btf_is_enum64(t))
2455 		return libbpf_err(-EINVAL);
2456 
2457 	/* non-empty name */
2458 	if (!name || !name[0])
2459 		return libbpf_err(-EINVAL);
2460 
2461 	/* decompose and invalidate raw data */
2462 	if (btf_ensure_modifiable(btf))
2463 		return libbpf_err(-ENOMEM);
2464 
2465 	sz = sizeof(struct btf_enum64);
2466 	v = btf_add_type_mem(btf, sz);
2467 	if (!v)
2468 		return libbpf_err(-ENOMEM);
2469 
2470 	name_off = btf__add_str(btf, name);
2471 	if (name_off < 0)
2472 		return name_off;
2473 
2474 	v->name_off = name_off;
2475 	v->val_lo32 = (__u32)value;
2476 	v->val_hi32 = value >> 32;
2477 
2478 	/* update parent type's vlen */
2479 	t = btf_last_type(btf);
2480 	btf_type_inc_vlen(t);
2481 
2482 	btf->hdr->type_len += sz;
2483 	btf->hdr->str_off += sz;
2484 	return 0;
2485 }
2486 
2487 /*
2488  * Append new BTF_KIND_FWD type with:
2489  *   - *name*, non-empty/non-NULL name;
2490  *   - *fwd_kind*, kind of forward declaration, one of BTF_FWD_STRUCT,
2491  *     BTF_FWD_UNION, or BTF_FWD_ENUM;
2492  * Returns:
2493  *   - >0, type ID of newly added BTF type;
2494  *   - <0, on error.
2495  */
btf__add_fwd(struct btf * btf,const char * name,enum btf_fwd_kind fwd_kind)2496 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
2497 {
2498 	if (!name || !name[0])
2499 		return libbpf_err(-EINVAL);
2500 
2501 	switch (fwd_kind) {
2502 	case BTF_FWD_STRUCT:
2503 	case BTF_FWD_UNION: {
2504 		struct btf_type *t;
2505 		int id;
2506 
2507 		id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
2508 		if (id <= 0)
2509 			return id;
2510 		t = btf_type_by_id(btf, id);
2511 		t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION);
2512 		return id;
2513 	}
2514 	case BTF_FWD_ENUM:
2515 		/* enum forward in BTF currently is just an enum with no enum
2516 		 * values; we also assume a standard 4-byte size for it
2517 		 */
2518 		return btf__add_enum(btf, name, sizeof(int));
2519 	default:
2520 		return libbpf_err(-EINVAL);
2521 	}
2522 }
2523 
2524 /*
2525  * Append new BTF_KING_TYPEDEF type with:
2526  *   - *name*, non-empty/non-NULL name;
2527  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2528  * Returns:
2529  *   - >0, type ID of newly added BTF type;
2530  *   - <0, on error.
2531  */
btf__add_typedef(struct btf * btf,const char * name,int ref_type_id)2532 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
2533 {
2534 	if (!name || !name[0])
2535 		return libbpf_err(-EINVAL);
2536 
2537 	return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
2538 }
2539 
2540 /*
2541  * Append new BTF_KIND_VOLATILE type with:
2542  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2543  * Returns:
2544  *   - >0, type ID of newly added BTF type;
2545  *   - <0, on error.
2546  */
btf__add_volatile(struct btf * btf,int ref_type_id)2547 int btf__add_volatile(struct btf *btf, int ref_type_id)
2548 {
2549 	return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
2550 }
2551 
2552 /*
2553  * Append new BTF_KIND_CONST type with:
2554  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2555  * Returns:
2556  *   - >0, type ID of newly added BTF type;
2557  *   - <0, on error.
2558  */
btf__add_const(struct btf * btf,int ref_type_id)2559 int btf__add_const(struct btf *btf, int ref_type_id)
2560 {
2561 	return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
2562 }
2563 
2564 /*
2565  * Append new BTF_KIND_RESTRICT type with:
2566  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2567  * Returns:
2568  *   - >0, type ID of newly added BTF type;
2569  *   - <0, on error.
2570  */
btf__add_restrict(struct btf * btf,int ref_type_id)2571 int btf__add_restrict(struct btf *btf, int ref_type_id)
2572 {
2573 	return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
2574 }
2575 
2576 /*
2577  * Append new BTF_KIND_TYPE_TAG type with:
2578  *   - *value*, non-empty/non-NULL tag value;
2579  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2580  * Returns:
2581  *   - >0, type ID of newly added BTF type;
2582  *   - <0, on error.
2583  */
btf__add_type_tag(struct btf * btf,const char * value,int ref_type_id)2584 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
2585 {
2586 	if (!value || !value[0])
2587 		return libbpf_err(-EINVAL);
2588 
2589 	return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
2590 }
2591 
2592 /*
2593  * Append new BTF_KIND_FUNC type with:
2594  *   - *name*, non-empty/non-NULL name;
2595  *   - *proto_type_id* - FUNC_PROTO's type ID, it might not exist yet;
2596  * Returns:
2597  *   - >0, type ID of newly added BTF type;
2598  *   - <0, on error.
2599  */
btf__add_func(struct btf * btf,const char * name,enum btf_func_linkage linkage,int proto_type_id)2600 int btf__add_func(struct btf *btf, const char *name,
2601 		  enum btf_func_linkage linkage, int proto_type_id)
2602 {
2603 	int id;
2604 
2605 	if (!name || !name[0])
2606 		return libbpf_err(-EINVAL);
2607 	if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL &&
2608 	    linkage != BTF_FUNC_EXTERN)
2609 		return libbpf_err(-EINVAL);
2610 
2611 	id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
2612 	if (id > 0) {
2613 		struct btf_type *t = btf_type_by_id(btf, id);
2614 
2615 		t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0);
2616 	}
2617 	return libbpf_err(id);
2618 }
2619 
2620 /*
2621  * Append new BTF_KIND_FUNC_PROTO with:
2622  *   - *ret_type_id* - type ID for return result of a function.
2623  *
2624  * Function prototype initially has no arguments, but they can be added by
2625  * btf__add_func_param() one by one, immediately after
2626  * btf__add_func_proto() succeeded.
2627  *
2628  * Returns:
2629  *   - >0, type ID of newly added BTF type;
2630  *   - <0, on error.
2631  */
btf__add_func_proto(struct btf * btf,int ret_type_id)2632 int btf__add_func_proto(struct btf *btf, int ret_type_id)
2633 {
2634 	struct btf_type *t;
2635 	int sz;
2636 
2637 	if (validate_type_id(ret_type_id))
2638 		return libbpf_err(-EINVAL);
2639 
2640 	if (btf_ensure_modifiable(btf))
2641 		return libbpf_err(-ENOMEM);
2642 
2643 	sz = sizeof(struct btf_type);
2644 	t = btf_add_type_mem(btf, sz);
2645 	if (!t)
2646 		return libbpf_err(-ENOMEM);
2647 
2648 	/* start out with vlen=0; this will be adjusted when adding enum
2649 	 * values, if necessary
2650 	 */
2651 	t->name_off = 0;
2652 	t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
2653 	t->type = ret_type_id;
2654 
2655 	return btf_commit_type(btf, sz);
2656 }
2657 
2658 /*
2659  * Append new function parameter for current FUNC_PROTO type with:
2660  *   - *name* - parameter name, can be NULL or empty;
2661  *   - *type_id* - type ID describing the type of the parameter.
2662  * Returns:
2663  *   -  0, on success;
2664  *   - <0, on error.
2665  */
btf__add_func_param(struct btf * btf,const char * name,int type_id)2666 int btf__add_func_param(struct btf *btf, const char *name, int type_id)
2667 {
2668 	struct btf_type *t;
2669 	struct btf_param *p;
2670 	int sz, name_off = 0;
2671 
2672 	if (validate_type_id(type_id))
2673 		return libbpf_err(-EINVAL);
2674 
2675 	/* last type should be BTF_KIND_FUNC_PROTO */
2676 	if (btf->nr_types == 0)
2677 		return libbpf_err(-EINVAL);
2678 	t = btf_last_type(btf);
2679 	if (!btf_is_func_proto(t))
2680 		return libbpf_err(-EINVAL);
2681 
2682 	/* decompose and invalidate raw data */
2683 	if (btf_ensure_modifiable(btf))
2684 		return libbpf_err(-ENOMEM);
2685 
2686 	sz = sizeof(struct btf_param);
2687 	p = btf_add_type_mem(btf, sz);
2688 	if (!p)
2689 		return libbpf_err(-ENOMEM);
2690 
2691 	if (name && name[0]) {
2692 		name_off = btf__add_str(btf, name);
2693 		if (name_off < 0)
2694 			return name_off;
2695 	}
2696 
2697 	p->name_off = name_off;
2698 	p->type = type_id;
2699 
2700 	/* update parent type's vlen */
2701 	t = btf_last_type(btf);
2702 	btf_type_inc_vlen(t);
2703 
2704 	btf->hdr->type_len += sz;
2705 	btf->hdr->str_off += sz;
2706 	return 0;
2707 }
2708 
2709 /*
2710  * Append new BTF_KIND_VAR type with:
2711  *   - *name* - non-empty/non-NULL name;
2712  *   - *linkage* - variable linkage, one of BTF_VAR_STATIC,
2713  *     BTF_VAR_GLOBAL_ALLOCATED, or BTF_VAR_GLOBAL_EXTERN;
2714  *   - *type_id* - type ID of the type describing the type of the variable.
2715  * Returns:
2716  *   - >0, type ID of newly added BTF type;
2717  *   - <0, on error.
2718  */
btf__add_var(struct btf * btf,const char * name,int linkage,int type_id)2719 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id)
2720 {
2721 	struct btf_type *t;
2722 	struct btf_var *v;
2723 	int sz, name_off;
2724 
2725 	/* non-empty name */
2726 	if (!name || !name[0])
2727 		return libbpf_err(-EINVAL);
2728 	if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED &&
2729 	    linkage != BTF_VAR_GLOBAL_EXTERN)
2730 		return libbpf_err(-EINVAL);
2731 	if (validate_type_id(type_id))
2732 		return libbpf_err(-EINVAL);
2733 
2734 	/* deconstruct BTF, if necessary, and invalidate raw_data */
2735 	if (btf_ensure_modifiable(btf))
2736 		return libbpf_err(-ENOMEM);
2737 
2738 	sz = sizeof(struct btf_type) + sizeof(struct btf_var);
2739 	t = btf_add_type_mem(btf, sz);
2740 	if (!t)
2741 		return libbpf_err(-ENOMEM);
2742 
2743 	name_off = btf__add_str(btf, name);
2744 	if (name_off < 0)
2745 		return name_off;
2746 
2747 	t->name_off = name_off;
2748 	t->info = btf_type_info(BTF_KIND_VAR, 0, 0);
2749 	t->type = type_id;
2750 
2751 	v = btf_var(t);
2752 	v->linkage = linkage;
2753 
2754 	return btf_commit_type(btf, sz);
2755 }
2756 
2757 /*
2758  * Append new BTF_KIND_DATASEC type with:
2759  *   - *name* - non-empty/non-NULL name;
2760  *   - *byte_sz* - data section size, in bytes.
2761  *
2762  * Data section is initially empty. Variables info can be added with
2763  * btf__add_datasec_var_info() calls, after btf__add_datasec() succeeds.
2764  *
2765  * Returns:
2766  *   - >0, type ID of newly added BTF type;
2767  *   - <0, on error.
2768  */
btf__add_datasec(struct btf * btf,const char * name,__u32 byte_sz)2769 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
2770 {
2771 	struct btf_type *t;
2772 	int sz, name_off;
2773 
2774 	/* non-empty name */
2775 	if (!name || !name[0])
2776 		return libbpf_err(-EINVAL);
2777 
2778 	if (btf_ensure_modifiable(btf))
2779 		return libbpf_err(-ENOMEM);
2780 
2781 	sz = sizeof(struct btf_type);
2782 	t = btf_add_type_mem(btf, sz);
2783 	if (!t)
2784 		return libbpf_err(-ENOMEM);
2785 
2786 	name_off = btf__add_str(btf, name);
2787 	if (name_off < 0)
2788 		return name_off;
2789 
2790 	/* start with vlen=0, which will be update as var_secinfos are added */
2791 	t->name_off = name_off;
2792 	t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
2793 	t->size = byte_sz;
2794 
2795 	return btf_commit_type(btf, sz);
2796 }
2797 
2798 /*
2799  * Append new data section variable information entry for current DATASEC type:
2800  *   - *var_type_id* - type ID, describing type of the variable;
2801  *   - *offset* - variable offset within data section, in bytes;
2802  *   - *byte_sz* - variable size, in bytes.
2803  *
2804  * Returns:
2805  *   -  0, on success;
2806  *   - <0, on error.
2807  */
btf__add_datasec_var_info(struct btf * btf,int var_type_id,__u32 offset,__u32 byte_sz)2808 int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz)
2809 {
2810 	struct btf_type *t;
2811 	struct btf_var_secinfo *v;
2812 	int sz;
2813 
2814 	/* last type should be BTF_KIND_DATASEC */
2815 	if (btf->nr_types == 0)
2816 		return libbpf_err(-EINVAL);
2817 	t = btf_last_type(btf);
2818 	if (!btf_is_datasec(t))
2819 		return libbpf_err(-EINVAL);
2820 
2821 	if (validate_type_id(var_type_id))
2822 		return libbpf_err(-EINVAL);
2823 
2824 	/* decompose and invalidate raw data */
2825 	if (btf_ensure_modifiable(btf))
2826 		return libbpf_err(-ENOMEM);
2827 
2828 	sz = sizeof(struct btf_var_secinfo);
2829 	v = btf_add_type_mem(btf, sz);
2830 	if (!v)
2831 		return libbpf_err(-ENOMEM);
2832 
2833 	v->type = var_type_id;
2834 	v->offset = offset;
2835 	v->size = byte_sz;
2836 
2837 	/* update parent type's vlen */
2838 	t = btf_last_type(btf);
2839 	btf_type_inc_vlen(t);
2840 
2841 	btf->hdr->type_len += sz;
2842 	btf->hdr->str_off += sz;
2843 	return 0;
2844 }
2845 
2846 /*
2847  * Append new BTF_KIND_DECL_TAG type with:
2848  *   - *value* - non-empty/non-NULL string;
2849  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2850  *   - *component_idx* - -1 for tagging reference type, otherwise struct/union
2851  *     member or function argument index;
2852  * Returns:
2853  *   - >0, type ID of newly added BTF type;
2854  *   - <0, on error.
2855  */
btf__add_decl_tag(struct btf * btf,const char * value,int ref_type_id,int component_idx)2856 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
2857 		 int component_idx)
2858 {
2859 	struct btf_type *t;
2860 	int sz, value_off;
2861 
2862 	if (!value || !value[0] || component_idx < -1)
2863 		return libbpf_err(-EINVAL);
2864 
2865 	if (validate_type_id(ref_type_id))
2866 		return libbpf_err(-EINVAL);
2867 
2868 	if (btf_ensure_modifiable(btf))
2869 		return libbpf_err(-ENOMEM);
2870 
2871 	sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag);
2872 	t = btf_add_type_mem(btf, sz);
2873 	if (!t)
2874 		return libbpf_err(-ENOMEM);
2875 
2876 	value_off = btf__add_str(btf, value);
2877 	if (value_off < 0)
2878 		return value_off;
2879 
2880 	t->name_off = value_off;
2881 	t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
2882 	t->type = ref_type_id;
2883 	btf_decl_tag(t)->component_idx = component_idx;
2884 
2885 	return btf_commit_type(btf, sz);
2886 }
2887 
2888 struct btf_ext_sec_setup_param {
2889 	__u32 off;
2890 	__u32 len;
2891 	__u32 min_rec_size;
2892 	struct btf_ext_info *ext_info;
2893 	const char *desc;
2894 };
2895 
btf_ext_setup_info(struct btf_ext * btf_ext,struct btf_ext_sec_setup_param * ext_sec)2896 static int btf_ext_setup_info(struct btf_ext *btf_ext,
2897 			      struct btf_ext_sec_setup_param *ext_sec)
2898 {
2899 	const struct btf_ext_info_sec *sinfo;
2900 	struct btf_ext_info *ext_info;
2901 	__u32 info_left, record_size;
2902 	size_t sec_cnt = 0;
2903 	/* The start of the info sec (including the __u32 record_size). */
2904 	void *info;
2905 
2906 	if (ext_sec->len == 0)
2907 		return 0;
2908 
2909 	if (ext_sec->off & 0x03) {
2910 		pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n",
2911 		     ext_sec->desc);
2912 		return -EINVAL;
2913 	}
2914 
2915 	info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
2916 	info_left = ext_sec->len;
2917 
2918 	if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
2919 		pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n",
2920 			 ext_sec->desc, ext_sec->off, ext_sec->len);
2921 		return -EINVAL;
2922 	}
2923 
2924 	/* At least a record size */
2925 	if (info_left < sizeof(__u32)) {
2926 		pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc);
2927 		return -EINVAL;
2928 	}
2929 
2930 	/* The record size needs to meet the minimum standard */
2931 	record_size = *(__u32 *)info;
2932 	if (record_size < ext_sec->min_rec_size ||
2933 	    record_size & 0x03) {
2934 		pr_debug("%s section in .BTF.ext has invalid record size %u\n",
2935 			 ext_sec->desc, record_size);
2936 		return -EINVAL;
2937 	}
2938 
2939 	sinfo = info + sizeof(__u32);
2940 	info_left -= sizeof(__u32);
2941 
2942 	/* If no records, return failure now so .BTF.ext won't be used. */
2943 	if (!info_left) {
2944 		pr_debug("%s section in .BTF.ext has no records", ext_sec->desc);
2945 		return -EINVAL;
2946 	}
2947 
2948 	while (info_left) {
2949 		unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec);
2950 		__u64 total_record_size;
2951 		__u32 num_records;
2952 
2953 		if (info_left < sec_hdrlen) {
2954 			pr_debug("%s section header is not found in .BTF.ext\n",
2955 			     ext_sec->desc);
2956 			return -EINVAL;
2957 		}
2958 
2959 		num_records = sinfo->num_info;
2960 		if (num_records == 0) {
2961 			pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2962 			     ext_sec->desc);
2963 			return -EINVAL;
2964 		}
2965 
2966 		total_record_size = sec_hdrlen + (__u64)num_records * record_size;
2967 		if (info_left < total_record_size) {
2968 			pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2969 			     ext_sec->desc);
2970 			return -EINVAL;
2971 		}
2972 
2973 		info_left -= total_record_size;
2974 		sinfo = (void *)sinfo + total_record_size;
2975 		sec_cnt++;
2976 	}
2977 
2978 	ext_info = ext_sec->ext_info;
2979 	ext_info->len = ext_sec->len - sizeof(__u32);
2980 	ext_info->rec_size = record_size;
2981 	ext_info->info = info + sizeof(__u32);
2982 	ext_info->sec_cnt = sec_cnt;
2983 
2984 	return 0;
2985 }
2986 
btf_ext_setup_func_info(struct btf_ext * btf_ext)2987 static int btf_ext_setup_func_info(struct btf_ext *btf_ext)
2988 {
2989 	struct btf_ext_sec_setup_param param = {
2990 		.off = btf_ext->hdr->func_info_off,
2991 		.len = btf_ext->hdr->func_info_len,
2992 		.min_rec_size = sizeof(struct bpf_func_info_min),
2993 		.ext_info = &btf_ext->func_info,
2994 		.desc = "func_info"
2995 	};
2996 
2997 	return btf_ext_setup_info(btf_ext, &param);
2998 }
2999 
btf_ext_setup_line_info(struct btf_ext * btf_ext)3000 static int btf_ext_setup_line_info(struct btf_ext *btf_ext)
3001 {
3002 	struct btf_ext_sec_setup_param param = {
3003 		.off = btf_ext->hdr->line_info_off,
3004 		.len = btf_ext->hdr->line_info_len,
3005 		.min_rec_size = sizeof(struct bpf_line_info_min),
3006 		.ext_info = &btf_ext->line_info,
3007 		.desc = "line_info",
3008 	};
3009 
3010 	return btf_ext_setup_info(btf_ext, &param);
3011 }
3012 
btf_ext_setup_core_relos(struct btf_ext * btf_ext)3013 static int btf_ext_setup_core_relos(struct btf_ext *btf_ext)
3014 {
3015 	struct btf_ext_sec_setup_param param = {
3016 		.off = btf_ext->hdr->core_relo_off,
3017 		.len = btf_ext->hdr->core_relo_len,
3018 		.min_rec_size = sizeof(struct bpf_core_relo),
3019 		.ext_info = &btf_ext->core_relo_info,
3020 		.desc = "core_relo",
3021 	};
3022 
3023 	return btf_ext_setup_info(btf_ext, &param);
3024 }
3025 
btf_ext_parse_hdr(__u8 * data,__u32 data_size)3026 static int btf_ext_parse_hdr(__u8 *data, __u32 data_size)
3027 {
3028 	const struct btf_ext_header *hdr = (struct btf_ext_header *)data;
3029 
3030 	if (data_size < offsetofend(struct btf_ext_header, hdr_len) ||
3031 	    data_size < hdr->hdr_len) {
3032 		pr_debug("BTF.ext header not found");
3033 		return -EINVAL;
3034 	}
3035 
3036 	if (hdr->magic == bswap_16(BTF_MAGIC)) {
3037 		pr_warn("BTF.ext in non-native endianness is not supported\n");
3038 		return -ENOTSUP;
3039 	} else if (hdr->magic != BTF_MAGIC) {
3040 		pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic);
3041 		return -EINVAL;
3042 	}
3043 
3044 	if (hdr->version != BTF_VERSION) {
3045 		pr_debug("Unsupported BTF.ext version:%u\n", hdr->version);
3046 		return -ENOTSUP;
3047 	}
3048 
3049 	if (hdr->flags) {
3050 		pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags);
3051 		return -ENOTSUP;
3052 	}
3053 
3054 	if (data_size == hdr->hdr_len) {
3055 		pr_debug("BTF.ext has no data\n");
3056 		return -EINVAL;
3057 	}
3058 
3059 	return 0;
3060 }
3061 
btf_ext__free(struct btf_ext * btf_ext)3062 void btf_ext__free(struct btf_ext *btf_ext)
3063 {
3064 	if (IS_ERR_OR_NULL(btf_ext))
3065 		return;
3066 	free(btf_ext->func_info.sec_idxs);
3067 	free(btf_ext->line_info.sec_idxs);
3068 	free(btf_ext->core_relo_info.sec_idxs);
3069 	free(btf_ext->data);
3070 	free(btf_ext);
3071 }
3072 
btf_ext__new(const __u8 * data,__u32 size)3073 struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
3074 {
3075 	struct btf_ext *btf_ext;
3076 	int err;
3077 
3078 	btf_ext = calloc(1, sizeof(struct btf_ext));
3079 	if (!btf_ext)
3080 		return libbpf_err_ptr(-ENOMEM);
3081 
3082 	btf_ext->data_size = size;
3083 	btf_ext->data = malloc(size);
3084 	if (!btf_ext->data) {
3085 		err = -ENOMEM;
3086 		goto done;
3087 	}
3088 	memcpy(btf_ext->data, data, size);
3089 
3090 	err = btf_ext_parse_hdr(btf_ext->data, size);
3091 	if (err)
3092 		goto done;
3093 
3094 	if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) {
3095 		err = -EINVAL;
3096 		goto done;
3097 	}
3098 
3099 	err = btf_ext_setup_func_info(btf_ext);
3100 	if (err)
3101 		goto done;
3102 
3103 	err = btf_ext_setup_line_info(btf_ext);
3104 	if (err)
3105 		goto done;
3106 
3107 	if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
3108 		goto done; /* skip core relos parsing */
3109 
3110 	err = btf_ext_setup_core_relos(btf_ext);
3111 	if (err)
3112 		goto done;
3113 
3114 done:
3115 	if (err) {
3116 		btf_ext__free(btf_ext);
3117 		return libbpf_err_ptr(err);
3118 	}
3119 
3120 	return btf_ext;
3121 }
3122 
btf_ext__raw_data(const struct btf_ext * btf_ext,__u32 * size)3123 const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size)
3124 {
3125 	*size = btf_ext->data_size;
3126 	return btf_ext->data;
3127 }
3128 
3129 __attribute__((alias("btf_ext__raw_data")))
3130 const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size);
3131 
3132 
3133 struct btf_dedup;
3134 
3135 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3136 static void btf_dedup_free(struct btf_dedup *d);
3137 static int btf_dedup_prep(struct btf_dedup *d);
3138 static int btf_dedup_strings(struct btf_dedup *d);
3139 static int btf_dedup_prim_types(struct btf_dedup *d);
3140 static int btf_dedup_struct_types(struct btf_dedup *d);
3141 static int btf_dedup_ref_types(struct btf_dedup *d);
3142 static int btf_dedup_resolve_fwds(struct btf_dedup *d);
3143 static int btf_dedup_compact_types(struct btf_dedup *d);
3144 static int btf_dedup_remap_types(struct btf_dedup *d);
3145 
3146 /*
3147  * Deduplicate BTF types and strings.
3148  *
3149  * BTF dedup algorithm takes as an input `struct btf` representing `.BTF` ELF
3150  * section with all BTF type descriptors and string data. It overwrites that
3151  * memory in-place with deduplicated types and strings without any loss of
3152  * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section
3153  * is provided, all the strings referenced from .BTF.ext section are honored
3154  * and updated to point to the right offsets after deduplication.
3155  *
3156  * If function returns with error, type/string data might be garbled and should
3157  * be discarded.
3158  *
3159  * More verbose and detailed description of both problem btf_dedup is solving,
3160  * as well as solution could be found at:
3161  * https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
3162  *
3163  * Problem description and justification
3164  * =====================================
3165  *
3166  * BTF type information is typically emitted either as a result of conversion
3167  * from DWARF to BTF or directly by compiler. In both cases, each compilation
3168  * unit contains information about a subset of all the types that are used
3169  * in an application. These subsets are frequently overlapping and contain a lot
3170  * of duplicated information when later concatenated together into a single
3171  * binary. This algorithm ensures that each unique type is represented by single
3172  * BTF type descriptor, greatly reducing resulting size of BTF data.
3173  *
3174  * Compilation unit isolation and subsequent duplication of data is not the only
3175  * problem. The same type hierarchy (e.g., struct and all the type that struct
3176  * references) in different compilation units can be represented in BTF to
3177  * various degrees of completeness (or, rather, incompleteness) due to
3178  * struct/union forward declarations.
3179  *
3180  * Let's take a look at an example, that we'll use to better understand the
3181  * problem (and solution). Suppose we have two compilation units, each using
3182  * same `struct S`, but each of them having incomplete type information about
3183  * struct's fields:
3184  *
3185  * // CU #1:
3186  * struct S;
3187  * struct A {
3188  *	int a;
3189  *	struct A* self;
3190  *	struct S* parent;
3191  * };
3192  * struct B;
3193  * struct S {
3194  *	struct A* a_ptr;
3195  *	struct B* b_ptr;
3196  * };
3197  *
3198  * // CU #2:
3199  * struct S;
3200  * struct A;
3201  * struct B {
3202  *	int b;
3203  *	struct B* self;
3204  *	struct S* parent;
3205  * };
3206  * struct S {
3207  *	struct A* a_ptr;
3208  *	struct B* b_ptr;
3209  * };
3210  *
3211  * In case of CU #1, BTF data will know only that `struct B` exist (but no
3212  * more), but will know the complete type information about `struct A`. While
3213  * for CU #2, it will know full type information about `struct B`, but will
3214  * only know about forward declaration of `struct A` (in BTF terms, it will
3215  * have `BTF_KIND_FWD` type descriptor with name `B`).
3216  *
3217  * This compilation unit isolation means that it's possible that there is no
3218  * single CU with complete type information describing structs `S`, `A`, and
3219  * `B`. Also, we might get tons of duplicated and redundant type information.
3220  *
3221  * Additional complication we need to keep in mind comes from the fact that
3222  * types, in general, can form graphs containing cycles, not just DAGs.
3223  *
3224  * While algorithm does deduplication, it also merges and resolves type
3225  * information (unless disabled throught `struct btf_opts`), whenever possible.
3226  * E.g., in the example above with two compilation units having partial type
3227  * information for structs `A` and `B`, the output of algorithm will emit
3228  * a single copy of each BTF type that describes structs `A`, `B`, and `S`
3229  * (as well as type information for `int` and pointers), as if they were defined
3230  * in a single compilation unit as:
3231  *
3232  * struct A {
3233  *	int a;
3234  *	struct A* self;
3235  *	struct S* parent;
3236  * };
3237  * struct B {
3238  *	int b;
3239  *	struct B* self;
3240  *	struct S* parent;
3241  * };
3242  * struct S {
3243  *	struct A* a_ptr;
3244  *	struct B* b_ptr;
3245  * };
3246  *
3247  * Algorithm summary
3248  * =================
3249  *
3250  * Algorithm completes its work in 7 separate passes:
3251  *
3252  * 1. Strings deduplication.
3253  * 2. Primitive types deduplication (int, enum, fwd).
3254  * 3. Struct/union types deduplication.
3255  * 4. Resolve unambiguous forward declarations.
3256  * 5. Reference types deduplication (pointers, typedefs, arrays, funcs, func
3257  *    protos, and const/volatile/restrict modifiers).
3258  * 6. Types compaction.
3259  * 7. Types remapping.
3260  *
3261  * Algorithm determines canonical type descriptor, which is a single
3262  * representative type for each truly unique type. This canonical type is the
3263  * one that will go into final deduplicated BTF type information. For
3264  * struct/unions, it is also the type that algorithm will merge additional type
3265  * information into (while resolving FWDs), as it discovers it from data in
3266  * other CUs. Each input BTF type eventually gets either mapped to itself, if
3267  * that type is canonical, or to some other type, if that type is equivalent
3268  * and was chosen as canonical representative. This mapping is stored in
3269  * `btf_dedup->map` array. This map is also used to record STRUCT/UNION that
3270  * FWD type got resolved to.
3271  *
3272  * To facilitate fast discovery of canonical types, we also maintain canonical
3273  * index (`btf_dedup->dedup_table`), which maps type descriptor's signature hash
3274  * (i.e., hashed kind, name, size, fields, etc) into a list of canonical types
3275  * that match that signature. With sufficiently good choice of type signature
3276  * hashing function, we can limit number of canonical types for each unique type
3277  * signature to a very small number, allowing to find canonical type for any
3278  * duplicated type very quickly.
3279  *
3280  * Struct/union deduplication is the most critical part and algorithm for
3281  * deduplicating structs/unions is described in greater details in comments for
3282  * `btf_dedup_is_equiv` function.
3283  */
btf__dedup(struct btf * btf,const struct btf_dedup_opts * opts)3284 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts)
3285 {
3286 	struct btf_dedup *d;
3287 	int err;
3288 
3289 	if (!OPTS_VALID(opts, btf_dedup_opts))
3290 		return libbpf_err(-EINVAL);
3291 
3292 	d = btf_dedup_new(btf, opts);
3293 	if (IS_ERR(d)) {
3294 		pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d));
3295 		return libbpf_err(-EINVAL);
3296 	}
3297 
3298 	if (btf_ensure_modifiable(btf)) {
3299 		err = -ENOMEM;
3300 		goto done;
3301 	}
3302 
3303 	err = btf_dedup_prep(d);
3304 	if (err) {
3305 		pr_debug("btf_dedup_prep failed:%d\n", err);
3306 		goto done;
3307 	}
3308 	err = btf_dedup_strings(d);
3309 	if (err < 0) {
3310 		pr_debug("btf_dedup_strings failed:%d\n", err);
3311 		goto done;
3312 	}
3313 	err = btf_dedup_prim_types(d);
3314 	if (err < 0) {
3315 		pr_debug("btf_dedup_prim_types failed:%d\n", err);
3316 		goto done;
3317 	}
3318 	err = btf_dedup_struct_types(d);
3319 	if (err < 0) {
3320 		pr_debug("btf_dedup_struct_types failed:%d\n", err);
3321 		goto done;
3322 	}
3323 	err = btf_dedup_resolve_fwds(d);
3324 	if (err < 0) {
3325 		pr_debug("btf_dedup_resolve_fwds failed:%d\n", err);
3326 		goto done;
3327 	}
3328 	err = btf_dedup_ref_types(d);
3329 	if (err < 0) {
3330 		pr_debug("btf_dedup_ref_types failed:%d\n", err);
3331 		goto done;
3332 	}
3333 	err = btf_dedup_compact_types(d);
3334 	if (err < 0) {
3335 		pr_debug("btf_dedup_compact_types failed:%d\n", err);
3336 		goto done;
3337 	}
3338 	err = btf_dedup_remap_types(d);
3339 	if (err < 0) {
3340 		pr_debug("btf_dedup_remap_types failed:%d\n", err);
3341 		goto done;
3342 	}
3343 
3344 done:
3345 	btf_dedup_free(d);
3346 	return libbpf_err(err);
3347 }
3348 
3349 #define BTF_UNPROCESSED_ID ((__u32)-1)
3350 #define BTF_IN_PROGRESS_ID ((__u32)-2)
3351 
3352 struct btf_dedup {
3353 	/* .BTF section to be deduped in-place */
3354 	struct btf *btf;
3355 	/*
3356 	 * Optional .BTF.ext section. When provided, any strings referenced
3357 	 * from it will be taken into account when deduping strings
3358 	 */
3359 	struct btf_ext *btf_ext;
3360 	/*
3361 	 * This is a map from any type's signature hash to a list of possible
3362 	 * canonical representative type candidates. Hash collisions are
3363 	 * ignored, so even types of various kinds can share same list of
3364 	 * candidates, which is fine because we rely on subsequent
3365 	 * btf_xxx_equal() checks to authoritatively verify type equality.
3366 	 */
3367 	struct hashmap *dedup_table;
3368 	/* Canonical types map */
3369 	__u32 *map;
3370 	/* Hypothetical mapping, used during type graph equivalence checks */
3371 	__u32 *hypot_map;
3372 	__u32 *hypot_list;
3373 	size_t hypot_cnt;
3374 	size_t hypot_cap;
3375 	/* Whether hypothetical mapping, if successful, would need to adjust
3376 	 * already canonicalized types (due to a new forward declaration to
3377 	 * concrete type resolution). In such case, during split BTF dedup
3378 	 * candidate type would still be considered as different, because base
3379 	 * BTF is considered to be immutable.
3380 	 */
3381 	bool hypot_adjust_canon;
3382 	/* Various option modifying behavior of algorithm */
3383 	struct btf_dedup_opts opts;
3384 	/* temporary strings deduplication state */
3385 	struct strset *strs_set;
3386 };
3387 
hash_combine(long h,long value)3388 static long hash_combine(long h, long value)
3389 {
3390 	return h * 31 + value;
3391 }
3392 
3393 #define for_each_dedup_cand(d, node, hash) \
3394 	hashmap__for_each_key_entry(d->dedup_table, node, hash)
3395 
btf_dedup_table_add(struct btf_dedup * d,long hash,__u32 type_id)3396 static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id)
3397 {
3398 	return hashmap__append(d->dedup_table, hash, type_id);
3399 }
3400 
btf_dedup_hypot_map_add(struct btf_dedup * d,__u32 from_id,__u32 to_id)3401 static int btf_dedup_hypot_map_add(struct btf_dedup *d,
3402 				   __u32 from_id, __u32 to_id)
3403 {
3404 	if (d->hypot_cnt == d->hypot_cap) {
3405 		__u32 *new_list;
3406 
3407 		d->hypot_cap += max((size_t)16, d->hypot_cap / 2);
3408 		new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32));
3409 		if (!new_list)
3410 			return -ENOMEM;
3411 		d->hypot_list = new_list;
3412 	}
3413 	d->hypot_list[d->hypot_cnt++] = from_id;
3414 	d->hypot_map[from_id] = to_id;
3415 	return 0;
3416 }
3417 
btf_dedup_clear_hypot_map(struct btf_dedup * d)3418 static void btf_dedup_clear_hypot_map(struct btf_dedup *d)
3419 {
3420 	int i;
3421 
3422 	for (i = 0; i < d->hypot_cnt; i++)
3423 		d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID;
3424 	d->hypot_cnt = 0;
3425 	d->hypot_adjust_canon = false;
3426 }
3427 
btf_dedup_free(struct btf_dedup * d)3428 static void btf_dedup_free(struct btf_dedup *d)
3429 {
3430 	hashmap__free(d->dedup_table);
3431 	d->dedup_table = NULL;
3432 
3433 	free(d->map);
3434 	d->map = NULL;
3435 
3436 	free(d->hypot_map);
3437 	d->hypot_map = NULL;
3438 
3439 	free(d->hypot_list);
3440 	d->hypot_list = NULL;
3441 
3442 	free(d);
3443 }
3444 
btf_dedup_identity_hash_fn(long key,void * ctx)3445 static size_t btf_dedup_identity_hash_fn(long key, void *ctx)
3446 {
3447 	return key;
3448 }
3449 
btf_dedup_collision_hash_fn(long key,void * ctx)3450 static size_t btf_dedup_collision_hash_fn(long key, void *ctx)
3451 {
3452 	return 0;
3453 }
3454 
btf_dedup_equal_fn(long k1,long k2,void * ctx)3455 static bool btf_dedup_equal_fn(long k1, long k2, void *ctx)
3456 {
3457 	return k1 == k2;
3458 }
3459 
btf_dedup_new(struct btf * btf,const struct btf_dedup_opts * opts)3460 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts)
3461 {
3462 	struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup));
3463 	hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn;
3464 	int i, err = 0, type_cnt;
3465 
3466 	if (!d)
3467 		return ERR_PTR(-ENOMEM);
3468 
3469 	if (OPTS_GET(opts, force_collisions, false))
3470 		hash_fn = btf_dedup_collision_hash_fn;
3471 
3472 	d->btf = btf;
3473 	d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3474 
3475 	d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL);
3476 	if (IS_ERR(d->dedup_table)) {
3477 		err = PTR_ERR(d->dedup_table);
3478 		d->dedup_table = NULL;
3479 		goto done;
3480 	}
3481 
3482 	type_cnt = btf__type_cnt(btf);
3483 	d->map = malloc(sizeof(__u32) * type_cnt);
3484 	if (!d->map) {
3485 		err = -ENOMEM;
3486 		goto done;
3487 	}
3488 	/* special BTF "void" type is made canonical immediately */
3489 	d->map[0] = 0;
3490 	for (i = 1; i < type_cnt; i++) {
3491 		struct btf_type *t = btf_type_by_id(d->btf, i);
3492 
3493 		/* VAR and DATASEC are never deduped and are self-canonical */
3494 		if (btf_is_var(t) || btf_is_datasec(t))
3495 			d->map[i] = i;
3496 		else
3497 			d->map[i] = BTF_UNPROCESSED_ID;
3498 	}
3499 
3500 	d->hypot_map = malloc(sizeof(__u32) * type_cnt);
3501 	if (!d->hypot_map) {
3502 		err = -ENOMEM;
3503 		goto done;
3504 	}
3505 	for (i = 0; i < type_cnt; i++)
3506 		d->hypot_map[i] = BTF_UNPROCESSED_ID;
3507 
3508 done:
3509 	if (err) {
3510 		btf_dedup_free(d);
3511 		return ERR_PTR(err);
3512 	}
3513 
3514 	return d;
3515 }
3516 
3517 /*
3518  * Iterate over all possible places in .BTF and .BTF.ext that can reference
3519  * string and pass pointer to it to a provided callback `fn`.
3520  */
btf_for_each_str_off(struct btf_dedup * d,str_off_visit_fn fn,void * ctx)3521 static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx)
3522 {
3523 	int i, r;
3524 
3525 	for (i = 0; i < d->btf->nr_types; i++) {
3526 		struct btf_field_iter it;
3527 		struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
3528 		__u32 *str_off;
3529 
3530 		r = btf_field_iter_init(&it, t, BTF_FIELD_ITER_STRS);
3531 		if (r)
3532 			return r;
3533 
3534 		while ((str_off = btf_field_iter_next(&it))) {
3535 			r = fn(str_off, ctx);
3536 			if (r)
3537 				return r;
3538 		}
3539 	}
3540 
3541 	if (!d->btf_ext)
3542 		return 0;
3543 
3544 	r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
3545 	if (r)
3546 		return r;
3547 
3548 	return 0;
3549 }
3550 
strs_dedup_remap_str_off(__u32 * str_off_ptr,void * ctx)3551 static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx)
3552 {
3553 	struct btf_dedup *d = ctx;
3554 	__u32 str_off = *str_off_ptr;
3555 	const char *s;
3556 	int off, err;
3557 
3558 	/* don't touch empty string or string in main BTF */
3559 	if (str_off == 0 || str_off < d->btf->start_str_off)
3560 		return 0;
3561 
3562 	s = btf__str_by_offset(d->btf, str_off);
3563 	if (d->btf->base_btf) {
3564 		err = btf__find_str(d->btf->base_btf, s);
3565 		if (err >= 0) {
3566 			*str_off_ptr = err;
3567 			return 0;
3568 		}
3569 		if (err != -ENOENT)
3570 			return err;
3571 	}
3572 
3573 	off = strset__add_str(d->strs_set, s);
3574 	if (off < 0)
3575 		return off;
3576 
3577 	*str_off_ptr = d->btf->start_str_off + off;
3578 	return 0;
3579 }
3580 
3581 /*
3582  * Dedup string and filter out those that are not referenced from either .BTF
3583  * or .BTF.ext (if provided) sections.
3584  *
3585  * This is done by building index of all strings in BTF's string section,
3586  * then iterating over all entities that can reference strings (e.g., type
3587  * names, struct field names, .BTF.ext line info, etc) and marking corresponding
3588  * strings as used. After that all used strings are deduped and compacted into
3589  * sequential blob of memory and new offsets are calculated. Then all the string
3590  * references are iterated again and rewritten using new offsets.
3591  */
btf_dedup_strings(struct btf_dedup * d)3592 static int btf_dedup_strings(struct btf_dedup *d)
3593 {
3594 	int err;
3595 
3596 	if (d->btf->strs_deduped)
3597 		return 0;
3598 
3599 	d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0);
3600 	if (IS_ERR(d->strs_set)) {
3601 		err = PTR_ERR(d->strs_set);
3602 		goto err_out;
3603 	}
3604 
3605 	if (!d->btf->base_btf) {
3606 		/* insert empty string; we won't be looking it up during strings
3607 		 * dedup, but it's good to have it for generic BTF string lookups
3608 		 */
3609 		err = strset__add_str(d->strs_set, "");
3610 		if (err < 0)
3611 			goto err_out;
3612 	}
3613 
3614 	/* remap string offsets */
3615 	err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d);
3616 	if (err)
3617 		goto err_out;
3618 
3619 	/* replace BTF string data and hash with deduped ones */
3620 	strset__free(d->btf->strs_set);
3621 	d->btf->hdr->str_len = strset__data_size(d->strs_set);
3622 	d->btf->strs_set = d->strs_set;
3623 	d->strs_set = NULL;
3624 	d->btf->strs_deduped = true;
3625 	return 0;
3626 
3627 err_out:
3628 	strset__free(d->strs_set);
3629 	d->strs_set = NULL;
3630 
3631 	return err;
3632 }
3633 
btf_hash_common(struct btf_type * t)3634 static long btf_hash_common(struct btf_type *t)
3635 {
3636 	long h;
3637 
3638 	h = hash_combine(0, t->name_off);
3639 	h = hash_combine(h, t->info);
3640 	h = hash_combine(h, t->size);
3641 	return h;
3642 }
3643 
btf_equal_common(struct btf_type * t1,struct btf_type * t2)3644 static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2)
3645 {
3646 	return t1->name_off == t2->name_off &&
3647 	       t1->info == t2->info &&
3648 	       t1->size == t2->size;
3649 }
3650 
3651 /* Calculate type signature hash of INT or TAG. */
btf_hash_int_decl_tag(struct btf_type * t)3652 static long btf_hash_int_decl_tag(struct btf_type *t)
3653 {
3654 	__u32 info = *(__u32 *)(t + 1);
3655 	long h;
3656 
3657 	h = btf_hash_common(t);
3658 	h = hash_combine(h, info);
3659 	return h;
3660 }
3661 
3662 /* Check structural equality of two INTs or TAGs. */
btf_equal_int_tag(struct btf_type * t1,struct btf_type * t2)3663 static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2)
3664 {
3665 	__u32 info1, info2;
3666 
3667 	if (!btf_equal_common(t1, t2))
3668 		return false;
3669 	info1 = *(__u32 *)(t1 + 1);
3670 	info2 = *(__u32 *)(t2 + 1);
3671 	return info1 == info2;
3672 }
3673 
3674 /* Calculate type signature hash of ENUM/ENUM64. */
btf_hash_enum(struct btf_type * t)3675 static long btf_hash_enum(struct btf_type *t)
3676 {
3677 	long h;
3678 
3679 	/* don't hash vlen, enum members and size to support enum fwd resolving */
3680 	h = hash_combine(0, t->name_off);
3681 	return h;
3682 }
3683 
btf_equal_enum_members(struct btf_type * t1,struct btf_type * t2)3684 static bool btf_equal_enum_members(struct btf_type *t1, struct btf_type *t2)
3685 {
3686 	const struct btf_enum *m1, *m2;
3687 	__u16 vlen;
3688 	int i;
3689 
3690 	vlen = btf_vlen(t1);
3691 	m1 = btf_enum(t1);
3692 	m2 = btf_enum(t2);
3693 	for (i = 0; i < vlen; i++) {
3694 		if (m1->name_off != m2->name_off || m1->val != m2->val)
3695 			return false;
3696 		m1++;
3697 		m2++;
3698 	}
3699 	return true;
3700 }
3701 
btf_equal_enum64_members(struct btf_type * t1,struct btf_type * t2)3702 static bool btf_equal_enum64_members(struct btf_type *t1, struct btf_type *t2)
3703 {
3704 	const struct btf_enum64 *m1, *m2;
3705 	__u16 vlen;
3706 	int i;
3707 
3708 	vlen = btf_vlen(t1);
3709 	m1 = btf_enum64(t1);
3710 	m2 = btf_enum64(t2);
3711 	for (i = 0; i < vlen; i++) {
3712 		if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 ||
3713 		    m1->val_hi32 != m2->val_hi32)
3714 			return false;
3715 		m1++;
3716 		m2++;
3717 	}
3718 	return true;
3719 }
3720 
3721 /* Check structural equality of two ENUMs or ENUM64s. */
btf_equal_enum(struct btf_type * t1,struct btf_type * t2)3722 static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2)
3723 {
3724 	if (!btf_equal_common(t1, t2))
3725 		return false;
3726 
3727 	/* t1 & t2 kinds are identical because of btf_equal_common */
3728 	if (btf_kind(t1) == BTF_KIND_ENUM)
3729 		return btf_equal_enum_members(t1, t2);
3730 	else
3731 		return btf_equal_enum64_members(t1, t2);
3732 }
3733 
btf_is_enum_fwd(struct btf_type * t)3734 static inline bool btf_is_enum_fwd(struct btf_type *t)
3735 {
3736 	return btf_is_any_enum(t) && btf_vlen(t) == 0;
3737 }
3738 
btf_compat_enum(struct btf_type * t1,struct btf_type * t2)3739 static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2)
3740 {
3741 	if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3742 		return btf_equal_enum(t1, t2);
3743 	/* At this point either t1 or t2 or both are forward declarations, thus:
3744 	 * - skip comparing vlen because it is zero for forward declarations;
3745 	 * - skip comparing size to allow enum forward declarations
3746 	 *   to be compatible with enum64 full declarations;
3747 	 * - skip comparing kind for the same reason.
3748 	 */
3749 	return t1->name_off == t2->name_off &&
3750 	       btf_is_any_enum(t1) && btf_is_any_enum(t2);
3751 }
3752 
3753 /*
3754  * Calculate type signature hash of STRUCT/UNION, ignoring referenced type IDs,
3755  * as referenced type IDs equivalence is established separately during type
3756  * graph equivalence check algorithm.
3757  */
btf_hash_struct(struct btf_type * t)3758 static long btf_hash_struct(struct btf_type *t)
3759 {
3760 	const struct btf_member *member = btf_members(t);
3761 	__u32 vlen = btf_vlen(t);
3762 	long h = btf_hash_common(t);
3763 	int i;
3764 
3765 	for (i = 0; i < vlen; i++) {
3766 		h = hash_combine(h, member->name_off);
3767 		h = hash_combine(h, member->offset);
3768 		/* no hashing of referenced type ID, it can be unresolved yet */
3769 		member++;
3770 	}
3771 	return h;
3772 }
3773 
3774 /*
3775  * Check structural compatibility of two STRUCTs/UNIONs, ignoring referenced
3776  * type IDs. This check is performed during type graph equivalence check and
3777  * referenced types equivalence is checked separately.
3778  */
btf_shallow_equal_struct(struct btf_type * t1,struct btf_type * t2)3779 static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2)
3780 {
3781 	const struct btf_member *m1, *m2;
3782 	__u16 vlen;
3783 	int i;
3784 
3785 	if (!btf_equal_common(t1, t2))
3786 		return false;
3787 
3788 	vlen = btf_vlen(t1);
3789 	m1 = btf_members(t1);
3790 	m2 = btf_members(t2);
3791 	for (i = 0; i < vlen; i++) {
3792 		if (m1->name_off != m2->name_off || m1->offset != m2->offset)
3793 			return false;
3794 		m1++;
3795 		m2++;
3796 	}
3797 	return true;
3798 }
3799 
3800 /*
3801  * Calculate type signature hash of ARRAY, including referenced type IDs,
3802  * under assumption that they were already resolved to canonical type IDs and
3803  * are not going to change.
3804  */
btf_hash_array(struct btf_type * t)3805 static long btf_hash_array(struct btf_type *t)
3806 {
3807 	const struct btf_array *info = btf_array(t);
3808 	long h = btf_hash_common(t);
3809 
3810 	h = hash_combine(h, info->type);
3811 	h = hash_combine(h, info->index_type);
3812 	h = hash_combine(h, info->nelems);
3813 	return h;
3814 }
3815 
3816 /*
3817  * Check exact equality of two ARRAYs, taking into account referenced
3818  * type IDs, under assumption that they were already resolved to canonical
3819  * type IDs and are not going to change.
3820  * This function is called during reference types deduplication to compare
3821  * ARRAY to potential canonical representative.
3822  */
btf_equal_array(struct btf_type * t1,struct btf_type * t2)3823 static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2)
3824 {
3825 	const struct btf_array *info1, *info2;
3826 
3827 	if (!btf_equal_common(t1, t2))
3828 		return false;
3829 
3830 	info1 = btf_array(t1);
3831 	info2 = btf_array(t2);
3832 	return info1->type == info2->type &&
3833 	       info1->index_type == info2->index_type &&
3834 	       info1->nelems == info2->nelems;
3835 }
3836 
3837 /*
3838  * Check structural compatibility of two ARRAYs, ignoring referenced type
3839  * IDs. This check is performed during type graph equivalence check and
3840  * referenced types equivalence is checked separately.
3841  */
btf_compat_array(struct btf_type * t1,struct btf_type * t2)3842 static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2)
3843 {
3844 	if (!btf_equal_common(t1, t2))
3845 		return false;
3846 
3847 	return btf_array(t1)->nelems == btf_array(t2)->nelems;
3848 }
3849 
3850 /*
3851  * Calculate type signature hash of FUNC_PROTO, including referenced type IDs,
3852  * under assumption that they were already resolved to canonical type IDs and
3853  * are not going to change.
3854  */
btf_hash_fnproto(struct btf_type * t)3855 static long btf_hash_fnproto(struct btf_type *t)
3856 {
3857 	const struct btf_param *member = btf_params(t);
3858 	__u16 vlen = btf_vlen(t);
3859 	long h = btf_hash_common(t);
3860 	int i;
3861 
3862 	for (i = 0; i < vlen; i++) {
3863 		h = hash_combine(h, member->name_off);
3864 		h = hash_combine(h, member->type);
3865 		member++;
3866 	}
3867 	return h;
3868 }
3869 
3870 /*
3871  * Check exact equality of two FUNC_PROTOs, taking into account referenced
3872  * type IDs, under assumption that they were already resolved to canonical
3873  * type IDs and are not going to change.
3874  * This function is called during reference types deduplication to compare
3875  * FUNC_PROTO to potential canonical representative.
3876  */
btf_equal_fnproto(struct btf_type * t1,struct btf_type * t2)3877 static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2)
3878 {
3879 	const struct btf_param *m1, *m2;
3880 	__u16 vlen;
3881 	int i;
3882 
3883 	if (!btf_equal_common(t1, t2))
3884 		return false;
3885 
3886 	vlen = btf_vlen(t1);
3887 	m1 = btf_params(t1);
3888 	m2 = btf_params(t2);
3889 	for (i = 0; i < vlen; i++) {
3890 		if (m1->name_off != m2->name_off || m1->type != m2->type)
3891 			return false;
3892 		m1++;
3893 		m2++;
3894 	}
3895 	return true;
3896 }
3897 
3898 /*
3899  * Check structural compatibility of two FUNC_PROTOs, ignoring referenced type
3900  * IDs. This check is performed during type graph equivalence check and
3901  * referenced types equivalence is checked separately.
3902  */
btf_compat_fnproto(struct btf_type * t1,struct btf_type * t2)3903 static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2)
3904 {
3905 	const struct btf_param *m1, *m2;
3906 	__u16 vlen;
3907 	int i;
3908 
3909 	/* skip return type ID */
3910 	if (t1->name_off != t2->name_off || t1->info != t2->info)
3911 		return false;
3912 
3913 	vlen = btf_vlen(t1);
3914 	m1 = btf_params(t1);
3915 	m2 = btf_params(t2);
3916 	for (i = 0; i < vlen; i++) {
3917 		if (m1->name_off != m2->name_off)
3918 			return false;
3919 		m1++;
3920 		m2++;
3921 	}
3922 	return true;
3923 }
3924 
3925 /* Prepare split BTF for deduplication by calculating hashes of base BTF's
3926  * types and initializing the rest of the state (canonical type mapping) for
3927  * the fixed base BTF part.
3928  */
btf_dedup_prep(struct btf_dedup * d)3929 static int btf_dedup_prep(struct btf_dedup *d)
3930 {
3931 	struct btf_type *t;
3932 	int type_id;
3933 	long h;
3934 
3935 	if (!d->btf->base_btf)
3936 		return 0;
3937 
3938 	for (type_id = 1; type_id < d->btf->start_id; type_id++) {
3939 		t = btf_type_by_id(d->btf, type_id);
3940 
3941 		/* all base BTF types are self-canonical by definition */
3942 		d->map[type_id] = type_id;
3943 
3944 		switch (btf_kind(t)) {
3945 		case BTF_KIND_VAR:
3946 		case BTF_KIND_DATASEC:
3947 			/* VAR and DATASEC are never hash/deduplicated */
3948 			continue;
3949 		case BTF_KIND_CONST:
3950 		case BTF_KIND_VOLATILE:
3951 		case BTF_KIND_RESTRICT:
3952 		case BTF_KIND_PTR:
3953 		case BTF_KIND_FWD:
3954 		case BTF_KIND_TYPEDEF:
3955 		case BTF_KIND_FUNC:
3956 		case BTF_KIND_FLOAT:
3957 		case BTF_KIND_TYPE_TAG:
3958 			h = btf_hash_common(t);
3959 			break;
3960 		case BTF_KIND_INT:
3961 		case BTF_KIND_DECL_TAG:
3962 			h = btf_hash_int_decl_tag(t);
3963 			break;
3964 		case BTF_KIND_ENUM:
3965 		case BTF_KIND_ENUM64:
3966 			h = btf_hash_enum(t);
3967 			break;
3968 		case BTF_KIND_STRUCT:
3969 		case BTF_KIND_UNION:
3970 			h = btf_hash_struct(t);
3971 			break;
3972 		case BTF_KIND_ARRAY:
3973 			h = btf_hash_array(t);
3974 			break;
3975 		case BTF_KIND_FUNC_PROTO:
3976 			h = btf_hash_fnproto(t);
3977 			break;
3978 		default:
3979 			pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id);
3980 			return -EINVAL;
3981 		}
3982 		if (btf_dedup_table_add(d, h, type_id))
3983 			return -ENOMEM;
3984 	}
3985 
3986 	return 0;
3987 }
3988 
3989 /*
3990  * Deduplicate primitive types, that can't reference other types, by calculating
3991  * their type signature hash and comparing them with any possible canonical
3992  * candidate. If no canonical candidate matches, type itself is marked as
3993  * canonical and is added into `btf_dedup->dedup_table` as another candidate.
3994  */
btf_dedup_prim_type(struct btf_dedup * d,__u32 type_id)3995 static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id)
3996 {
3997 	struct btf_type *t = btf_type_by_id(d->btf, type_id);
3998 	struct hashmap_entry *hash_entry;
3999 	struct btf_type *cand;
4000 	/* if we don't find equivalent type, then we are canonical */
4001 	__u32 new_id = type_id;
4002 	__u32 cand_id;
4003 	long h;
4004 
4005 	switch (btf_kind(t)) {
4006 	case BTF_KIND_CONST:
4007 	case BTF_KIND_VOLATILE:
4008 	case BTF_KIND_RESTRICT:
4009 	case BTF_KIND_PTR:
4010 	case BTF_KIND_TYPEDEF:
4011 	case BTF_KIND_ARRAY:
4012 	case BTF_KIND_STRUCT:
4013 	case BTF_KIND_UNION:
4014 	case BTF_KIND_FUNC:
4015 	case BTF_KIND_FUNC_PROTO:
4016 	case BTF_KIND_VAR:
4017 	case BTF_KIND_DATASEC:
4018 	case BTF_KIND_DECL_TAG:
4019 	case BTF_KIND_TYPE_TAG:
4020 		return 0;
4021 
4022 	case BTF_KIND_INT:
4023 		h = btf_hash_int_decl_tag(t);
4024 		for_each_dedup_cand(d, hash_entry, h) {
4025 			cand_id = hash_entry->value;
4026 			cand = btf_type_by_id(d->btf, cand_id);
4027 			if (btf_equal_int_tag(t, cand)) {
4028 				new_id = cand_id;
4029 				break;
4030 			}
4031 		}
4032 		break;
4033 
4034 	case BTF_KIND_ENUM:
4035 	case BTF_KIND_ENUM64:
4036 		h = btf_hash_enum(t);
4037 		for_each_dedup_cand(d, hash_entry, h) {
4038 			cand_id = hash_entry->value;
4039 			cand = btf_type_by_id(d->btf, cand_id);
4040 			if (btf_equal_enum(t, cand)) {
4041 				new_id = cand_id;
4042 				break;
4043 			}
4044 			if (btf_compat_enum(t, cand)) {
4045 				if (btf_is_enum_fwd(t)) {
4046 					/* resolve fwd to full enum */
4047 					new_id = cand_id;
4048 					break;
4049 				}
4050 				/* resolve canonical enum fwd to full enum */
4051 				d->map[cand_id] = type_id;
4052 			}
4053 		}
4054 		break;
4055 
4056 	case BTF_KIND_FWD:
4057 	case BTF_KIND_FLOAT:
4058 		h = btf_hash_common(t);
4059 		for_each_dedup_cand(d, hash_entry, h) {
4060 			cand_id = hash_entry->value;
4061 			cand = btf_type_by_id(d->btf, cand_id);
4062 			if (btf_equal_common(t, cand)) {
4063 				new_id = cand_id;
4064 				break;
4065 			}
4066 		}
4067 		break;
4068 
4069 	default:
4070 		return -EINVAL;
4071 	}
4072 
4073 	d->map[type_id] = new_id;
4074 	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4075 		return -ENOMEM;
4076 
4077 	return 0;
4078 }
4079 
btf_dedup_prim_types(struct btf_dedup * d)4080 static int btf_dedup_prim_types(struct btf_dedup *d)
4081 {
4082 	int i, err;
4083 
4084 	for (i = 0; i < d->btf->nr_types; i++) {
4085 		err = btf_dedup_prim_type(d, d->btf->start_id + i);
4086 		if (err)
4087 			return err;
4088 	}
4089 	return 0;
4090 }
4091 
4092 /*
4093  * Check whether type is already mapped into canonical one (could be to itself).
4094  */
is_type_mapped(struct btf_dedup * d,uint32_t type_id)4095 static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id)
4096 {
4097 	return d->map[type_id] <= BTF_MAX_NR_TYPES;
4098 }
4099 
4100 /*
4101  * Resolve type ID into its canonical type ID, if any; otherwise return original
4102  * type ID. If type is FWD and is resolved into STRUCT/UNION already, follow
4103  * STRUCT/UNION link and resolve it into canonical type ID as well.
4104  */
resolve_type_id(struct btf_dedup * d,__u32 type_id)4105 static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id)
4106 {
4107 	while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
4108 		type_id = d->map[type_id];
4109 	return type_id;
4110 }
4111 
4112 /*
4113  * Resolve FWD to underlying STRUCT/UNION, if any; otherwise return original
4114  * type ID.
4115  */
resolve_fwd_id(struct btf_dedup * d,uint32_t type_id)4116 static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id)
4117 {
4118 	__u32 orig_type_id = type_id;
4119 
4120 	if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
4121 		return type_id;
4122 
4123 	while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
4124 		type_id = d->map[type_id];
4125 
4126 	if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
4127 		return type_id;
4128 
4129 	return orig_type_id;
4130 }
4131 
4132 
btf_fwd_kind(struct btf_type * t)4133 static inline __u16 btf_fwd_kind(struct btf_type *t)
4134 {
4135 	return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT;
4136 }
4137 
4138 /* Check if given two types are identical ARRAY definitions */
btf_dedup_identical_arrays(struct btf_dedup * d,__u32 id1,__u32 id2)4139 static bool btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2)
4140 {
4141 	struct btf_type *t1, *t2;
4142 
4143 	t1 = btf_type_by_id(d->btf, id1);
4144 	t2 = btf_type_by_id(d->btf, id2);
4145 	if (!btf_is_array(t1) || !btf_is_array(t2))
4146 		return false;
4147 
4148 	return btf_equal_array(t1, t2);
4149 }
4150 
4151 /* Check if given two types are identical STRUCT/UNION definitions */
btf_dedup_identical_structs(struct btf_dedup * d,__u32 id1,__u32 id2)4152 static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2)
4153 {
4154 	const struct btf_member *m1, *m2;
4155 	struct btf_type *t1, *t2;
4156 	int n, i;
4157 
4158 	t1 = btf_type_by_id(d->btf, id1);
4159 	t2 = btf_type_by_id(d->btf, id2);
4160 
4161 	if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2))
4162 		return false;
4163 
4164 	if (!btf_shallow_equal_struct(t1, t2))
4165 		return false;
4166 
4167 	m1 = btf_members(t1);
4168 	m2 = btf_members(t2);
4169 	for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) {
4170 		if (m1->type != m2->type &&
4171 		    !btf_dedup_identical_arrays(d, m1->type, m2->type) &&
4172 		    !btf_dedup_identical_structs(d, m1->type, m2->type))
4173 			return false;
4174 	}
4175 	return true;
4176 }
4177 
4178 /*
4179  * Check equivalence of BTF type graph formed by candidate struct/union (we'll
4180  * call it "candidate graph" in this description for brevity) to a type graph
4181  * formed by (potential) canonical struct/union ("canonical graph" for brevity
4182  * here, though keep in mind that not all types in canonical graph are
4183  * necessarily canonical representatives themselves, some of them might be
4184  * duplicates or its uniqueness might not have been established yet).
4185  * Returns:
4186  *  - >0, if type graphs are equivalent;
4187  *  -  0, if not equivalent;
4188  *  - <0, on error.
4189  *
4190  * Algorithm performs side-by-side DFS traversal of both type graphs and checks
4191  * equivalence of BTF types at each step. If at any point BTF types in candidate
4192  * and canonical graphs are not compatible structurally, whole graphs are
4193  * incompatible. If types are structurally equivalent (i.e., all information
4194  * except referenced type IDs is exactly the same), a mapping from `canon_id` to
4195  * a `cand_id` is recoded in hypothetical mapping (`btf_dedup->hypot_map`).
4196  * If a type references other types, then those referenced types are checked
4197  * for equivalence recursively.
4198  *
4199  * During DFS traversal, if we find that for current `canon_id` type we
4200  * already have some mapping in hypothetical map, we check for two possible
4201  * situations:
4202  *   - `canon_id` is mapped to exactly the same type as `cand_id`. This will
4203  *     happen when type graphs have cycles. In this case we assume those two
4204  *     types are equivalent.
4205  *   - `canon_id` is mapped to different type. This is contradiction in our
4206  *     hypothetical mapping, because same graph in canonical graph corresponds
4207  *     to two different types in candidate graph, which for equivalent type
4208  *     graphs shouldn't happen. This condition terminates equivalence check
4209  *     with negative result.
4210  *
4211  * If type graphs traversal exhausts types to check and find no contradiction,
4212  * then type graphs are equivalent.
4213  *
4214  * When checking types for equivalence, there is one special case: FWD types.
4215  * If FWD type resolution is allowed and one of the types (either from canonical
4216  * or candidate graph) is FWD and other is STRUCT/UNION (depending on FWD's kind
4217  * flag) and their names match, hypothetical mapping is updated to point from
4218  * FWD to STRUCT/UNION. If graphs will be determined as equivalent successfully,
4219  * this mapping will be used to record FWD -> STRUCT/UNION mapping permanently.
4220  *
4221  * Technically, this could lead to incorrect FWD to STRUCT/UNION resolution,
4222  * if there are two exactly named (or anonymous) structs/unions that are
4223  * compatible structurally, one of which has FWD field, while other is concrete
4224  * STRUCT/UNION, but according to C sources they are different structs/unions
4225  * that are referencing different types with the same name. This is extremely
4226  * unlikely to happen, but btf_dedup API allows to disable FWD resolution if
4227  * this logic is causing problems.
4228  *
4229  * Doing FWD resolution means that both candidate and/or canonical graphs can
4230  * consists of portions of the graph that come from multiple compilation units.
4231  * This is due to the fact that types within single compilation unit are always
4232  * deduplicated and FWDs are already resolved, if referenced struct/union
4233  * definition is available. So, if we had unresolved FWD and found corresponding
4234  * STRUCT/UNION, they will be from different compilation units. This
4235  * consequently means that when we "link" FWD to corresponding STRUCT/UNION,
4236  * type graph will likely have at least two different BTF types that describe
4237  * same type (e.g., most probably there will be two different BTF types for the
4238  * same 'int' primitive type) and could even have "overlapping" parts of type
4239  * graph that describe same subset of types.
4240  *
4241  * This in turn means that our assumption that each type in canonical graph
4242  * must correspond to exactly one type in candidate graph might not hold
4243  * anymore and will make it harder to detect contradictions using hypothetical
4244  * map. To handle this problem, we allow to follow FWD -> STRUCT/UNION
4245  * resolution only in canonical graph. FWDs in candidate graphs are never
4246  * resolved. To see why it's OK, let's check all possible situations w.r.t. FWDs
4247  * that can occur:
4248  *   - Both types in canonical and candidate graphs are FWDs. If they are
4249  *     structurally equivalent, then they can either be both resolved to the
4250  *     same STRUCT/UNION or not resolved at all. In both cases they are
4251  *     equivalent and there is no need to resolve FWD on candidate side.
4252  *   - Both types in canonical and candidate graphs are concrete STRUCT/UNION,
4253  *     so nothing to resolve as well, algorithm will check equivalence anyway.
4254  *   - Type in canonical graph is FWD, while type in candidate is concrete
4255  *     STRUCT/UNION. In this case candidate graph comes from single compilation
4256  *     unit, so there is exactly one BTF type for each unique C type. After
4257  *     resolving FWD into STRUCT/UNION, there might be more than one BTF type
4258  *     in canonical graph mapping to single BTF type in candidate graph, but
4259  *     because hypothetical mapping maps from canonical to candidate types, it's
4260  *     alright, and we still maintain the property of having single `canon_id`
4261  *     mapping to single `cand_id` (there could be two different `canon_id`
4262  *     mapped to the same `cand_id`, but it's not contradictory).
4263  *   - Type in canonical graph is concrete STRUCT/UNION, while type in candidate
4264  *     graph is FWD. In this case we are just going to check compatibility of
4265  *     STRUCT/UNION and corresponding FWD, and if they are compatible, we'll
4266  *     assume that whatever STRUCT/UNION FWD resolves to must be equivalent to
4267  *     a concrete STRUCT/UNION from canonical graph. If the rest of type graphs
4268  *     turn out equivalent, we'll re-resolve FWD to concrete STRUCT/UNION from
4269  *     canonical graph.
4270  */
btf_dedup_is_equiv(struct btf_dedup * d,__u32 cand_id,__u32 canon_id)4271 static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id,
4272 			      __u32 canon_id)
4273 {
4274 	struct btf_type *cand_type;
4275 	struct btf_type *canon_type;
4276 	__u32 hypot_type_id;
4277 	__u16 cand_kind;
4278 	__u16 canon_kind;
4279 	int i, eq;
4280 
4281 	/* if both resolve to the same canonical, they must be equivalent */
4282 	if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id))
4283 		return 1;
4284 
4285 	canon_id = resolve_fwd_id(d, canon_id);
4286 
4287 	hypot_type_id = d->hypot_map[canon_id];
4288 	if (hypot_type_id <= BTF_MAX_NR_TYPES) {
4289 		if (hypot_type_id == cand_id)
4290 			return 1;
4291 		/* In some cases compiler will generate different DWARF types
4292 		 * for *identical* array type definitions and use them for
4293 		 * different fields within the *same* struct. This breaks type
4294 		 * equivalence check, which makes an assumption that candidate
4295 		 * types sub-graph has a consistent and deduped-by-compiler
4296 		 * types within a single CU. So work around that by explicitly
4297 		 * allowing identical array types here.
4298 		 */
4299 		if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id))
4300 			return 1;
4301 		/* It turns out that similar situation can happen with
4302 		 * struct/union sometimes, sigh... Handle the case where
4303 		 * structs/unions are exactly the same, down to the referenced
4304 		 * type IDs. Anything more complicated (e.g., if referenced
4305 		 * types are different, but equivalent) is *way more*
4306 		 * complicated and requires a many-to-many equivalence mapping.
4307 		 */
4308 		if (btf_dedup_identical_structs(d, hypot_type_id, cand_id))
4309 			return 1;
4310 		return 0;
4311 	}
4312 
4313 	if (btf_dedup_hypot_map_add(d, canon_id, cand_id))
4314 		return -ENOMEM;
4315 
4316 	cand_type = btf_type_by_id(d->btf, cand_id);
4317 	canon_type = btf_type_by_id(d->btf, canon_id);
4318 	cand_kind = btf_kind(cand_type);
4319 	canon_kind = btf_kind(canon_type);
4320 
4321 	if (cand_type->name_off != canon_type->name_off)
4322 		return 0;
4323 
4324 	/* FWD <--> STRUCT/UNION equivalence check, if enabled */
4325 	if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD)
4326 	    && cand_kind != canon_kind) {
4327 		__u16 real_kind;
4328 		__u16 fwd_kind;
4329 
4330 		if (cand_kind == BTF_KIND_FWD) {
4331 			real_kind = canon_kind;
4332 			fwd_kind = btf_fwd_kind(cand_type);
4333 		} else {
4334 			real_kind = cand_kind;
4335 			fwd_kind = btf_fwd_kind(canon_type);
4336 			/* we'd need to resolve base FWD to STRUCT/UNION */
4337 			if (fwd_kind == real_kind && canon_id < d->btf->start_id)
4338 				d->hypot_adjust_canon = true;
4339 		}
4340 		return fwd_kind == real_kind;
4341 	}
4342 
4343 	if (cand_kind != canon_kind)
4344 		return 0;
4345 
4346 	switch (cand_kind) {
4347 	case BTF_KIND_INT:
4348 		return btf_equal_int_tag(cand_type, canon_type);
4349 
4350 	case BTF_KIND_ENUM:
4351 	case BTF_KIND_ENUM64:
4352 		return btf_compat_enum(cand_type, canon_type);
4353 
4354 	case BTF_KIND_FWD:
4355 	case BTF_KIND_FLOAT:
4356 		return btf_equal_common(cand_type, canon_type);
4357 
4358 	case BTF_KIND_CONST:
4359 	case BTF_KIND_VOLATILE:
4360 	case BTF_KIND_RESTRICT:
4361 	case BTF_KIND_PTR:
4362 	case BTF_KIND_TYPEDEF:
4363 	case BTF_KIND_FUNC:
4364 	case BTF_KIND_TYPE_TAG:
4365 		if (cand_type->info != canon_type->info)
4366 			return 0;
4367 		return btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4368 
4369 	case BTF_KIND_ARRAY: {
4370 		const struct btf_array *cand_arr, *canon_arr;
4371 
4372 		if (!btf_compat_array(cand_type, canon_type))
4373 			return 0;
4374 		cand_arr = btf_array(cand_type);
4375 		canon_arr = btf_array(canon_type);
4376 		eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type);
4377 		if (eq <= 0)
4378 			return eq;
4379 		return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type);
4380 	}
4381 
4382 	case BTF_KIND_STRUCT:
4383 	case BTF_KIND_UNION: {
4384 		const struct btf_member *cand_m, *canon_m;
4385 		__u16 vlen;
4386 
4387 		if (!btf_shallow_equal_struct(cand_type, canon_type))
4388 			return 0;
4389 		vlen = btf_vlen(cand_type);
4390 		cand_m = btf_members(cand_type);
4391 		canon_m = btf_members(canon_type);
4392 		for (i = 0; i < vlen; i++) {
4393 			eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type);
4394 			if (eq <= 0)
4395 				return eq;
4396 			cand_m++;
4397 			canon_m++;
4398 		}
4399 
4400 		return 1;
4401 	}
4402 
4403 	case BTF_KIND_FUNC_PROTO: {
4404 		const struct btf_param *cand_p, *canon_p;
4405 		__u16 vlen;
4406 
4407 		if (!btf_compat_fnproto(cand_type, canon_type))
4408 			return 0;
4409 		eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4410 		if (eq <= 0)
4411 			return eq;
4412 		vlen = btf_vlen(cand_type);
4413 		cand_p = btf_params(cand_type);
4414 		canon_p = btf_params(canon_type);
4415 		for (i = 0; i < vlen; i++) {
4416 			eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type);
4417 			if (eq <= 0)
4418 				return eq;
4419 			cand_p++;
4420 			canon_p++;
4421 		}
4422 		return 1;
4423 	}
4424 
4425 	default:
4426 		return -EINVAL;
4427 	}
4428 	return 0;
4429 }
4430 
4431 /*
4432  * Use hypothetical mapping, produced by successful type graph equivalence
4433  * check, to augment existing struct/union canonical mapping, where possible.
4434  *
4435  * If BTF_KIND_FWD resolution is allowed, this mapping is also used to record
4436  * FWD -> STRUCT/UNION correspondence as well. FWD resolution is bidirectional:
4437  * it doesn't matter if FWD type was part of canonical graph or candidate one,
4438  * we are recording the mapping anyway. As opposed to carefulness required
4439  * for struct/union correspondence mapping (described below), for FWD resolution
4440  * it's not important, as by the time that FWD type (reference type) will be
4441  * deduplicated all structs/unions will be deduped already anyway.
4442  *
4443  * Recording STRUCT/UNION mapping is purely a performance optimization and is
4444  * not required for correctness. It needs to be done carefully to ensure that
4445  * struct/union from candidate's type graph is not mapped into corresponding
4446  * struct/union from canonical type graph that itself hasn't been resolved into
4447  * canonical representative. The only guarantee we have is that canonical
4448  * struct/union was determined as canonical and that won't change. But any
4449  * types referenced through that struct/union fields could have been not yet
4450  * resolved, so in case like that it's too early to establish any kind of
4451  * correspondence between structs/unions.
4452  *
4453  * No canonical correspondence is derived for primitive types (they are already
4454  * deduplicated completely already anyway) or reference types (they rely on
4455  * stability of struct/union canonical relationship for equivalence checks).
4456  */
btf_dedup_merge_hypot_map(struct btf_dedup * d)4457 static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
4458 {
4459 	__u32 canon_type_id, targ_type_id;
4460 	__u16 t_kind, c_kind;
4461 	__u32 t_id, c_id;
4462 	int i;
4463 
4464 	for (i = 0; i < d->hypot_cnt; i++) {
4465 		canon_type_id = d->hypot_list[i];
4466 		targ_type_id = d->hypot_map[canon_type_id];
4467 		t_id = resolve_type_id(d, targ_type_id);
4468 		c_id = resolve_type_id(d, canon_type_id);
4469 		t_kind = btf_kind(btf__type_by_id(d->btf, t_id));
4470 		c_kind = btf_kind(btf__type_by_id(d->btf, c_id));
4471 		/*
4472 		 * Resolve FWD into STRUCT/UNION.
4473 		 * It's ok to resolve FWD into STRUCT/UNION that's not yet
4474 		 * mapped to canonical representative (as opposed to
4475 		 * STRUCT/UNION <--> STRUCT/UNION mapping logic below), because
4476 		 * eventually that struct is going to be mapped and all resolved
4477 		 * FWDs will automatically resolve to correct canonical
4478 		 * representative. This will happen before ref type deduping,
4479 		 * which critically depends on stability of these mapping. This
4480 		 * stability is not a requirement for STRUCT/UNION equivalence
4481 		 * checks, though.
4482 		 */
4483 
4484 		/* if it's the split BTF case, we still need to point base FWD
4485 		 * to STRUCT/UNION in a split BTF, because FWDs from split BTF
4486 		 * will be resolved against base FWD. If we don't point base
4487 		 * canonical FWD to the resolved STRUCT/UNION, then all the
4488 		 * FWDs in split BTF won't be correctly resolved to a proper
4489 		 * STRUCT/UNION.
4490 		 */
4491 		if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD)
4492 			d->map[c_id] = t_id;
4493 
4494 		/* if graph equivalence determined that we'd need to adjust
4495 		 * base canonical types, then we need to only point base FWDs
4496 		 * to STRUCTs/UNIONs and do no more modifications. For all
4497 		 * other purposes the type graphs were not equivalent.
4498 		 */
4499 		if (d->hypot_adjust_canon)
4500 			continue;
4501 
4502 		if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
4503 			d->map[t_id] = c_id;
4504 
4505 		if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) &&
4506 		    c_kind != BTF_KIND_FWD &&
4507 		    is_type_mapped(d, c_id) &&
4508 		    !is_type_mapped(d, t_id)) {
4509 			/*
4510 			 * as a perf optimization, we can map struct/union
4511 			 * that's part of type graph we just verified for
4512 			 * equivalence. We can do that for struct/union that has
4513 			 * canonical representative only, though.
4514 			 */
4515 			d->map[t_id] = c_id;
4516 		}
4517 	}
4518 }
4519 
4520 /*
4521  * Deduplicate struct/union types.
4522  *
4523  * For each struct/union type its type signature hash is calculated, taking
4524  * into account type's name, size, number, order and names of fields, but
4525  * ignoring type ID's referenced from fields, because they might not be deduped
4526  * completely until after reference types deduplication phase. This type hash
4527  * is used to iterate over all potential canonical types, sharing same hash.
4528  * For each canonical candidate we check whether type graphs that they form
4529  * (through referenced types in fields and so on) are equivalent using algorithm
4530  * implemented in `btf_dedup_is_equiv`. If such equivalence is found and
4531  * BTF_KIND_FWD resolution is allowed, then hypothetical mapping
4532  * (btf_dedup->hypot_map) produced by aforementioned type graph equivalence
4533  * algorithm is used to record FWD -> STRUCT/UNION mapping. It's also used to
4534  * potentially map other structs/unions to their canonical representatives,
4535  * if such relationship hasn't yet been established. This speeds up algorithm
4536  * by eliminating some of the duplicate work.
4537  *
4538  * If no matching canonical representative was found, struct/union is marked
4539  * as canonical for itself and is added into btf_dedup->dedup_table hash map
4540  * for further look ups.
4541  */
btf_dedup_struct_type(struct btf_dedup * d,__u32 type_id)4542 static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id)
4543 {
4544 	struct btf_type *cand_type, *t;
4545 	struct hashmap_entry *hash_entry;
4546 	/* if we don't find equivalent type, then we are canonical */
4547 	__u32 new_id = type_id;
4548 	__u16 kind;
4549 	long h;
4550 
4551 	/* already deduped or is in process of deduping (loop detected) */
4552 	if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4553 		return 0;
4554 
4555 	t = btf_type_by_id(d->btf, type_id);
4556 	kind = btf_kind(t);
4557 
4558 	if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4559 		return 0;
4560 
4561 	h = btf_hash_struct(t);
4562 	for_each_dedup_cand(d, hash_entry, h) {
4563 		__u32 cand_id = hash_entry->value;
4564 		int eq;
4565 
4566 		/*
4567 		 * Even though btf_dedup_is_equiv() checks for
4568 		 * btf_shallow_equal_struct() internally when checking two
4569 		 * structs (unions) for equivalence, we need to guard here
4570 		 * from picking matching FWD type as a dedup candidate.
4571 		 * This can happen due to hash collision. In such case just
4572 		 * relying on btf_dedup_is_equiv() would lead to potentially
4573 		 * creating a loop (FWD -> STRUCT and STRUCT -> FWD), because
4574 		 * FWD and compatible STRUCT/UNION are considered equivalent.
4575 		 */
4576 		cand_type = btf_type_by_id(d->btf, cand_id);
4577 		if (!btf_shallow_equal_struct(t, cand_type))
4578 			continue;
4579 
4580 		btf_dedup_clear_hypot_map(d);
4581 		eq = btf_dedup_is_equiv(d, type_id, cand_id);
4582 		if (eq < 0)
4583 			return eq;
4584 		if (!eq)
4585 			continue;
4586 		btf_dedup_merge_hypot_map(d);
4587 		if (d->hypot_adjust_canon) /* not really equivalent */
4588 			continue;
4589 		new_id = cand_id;
4590 		break;
4591 	}
4592 
4593 	d->map[type_id] = new_id;
4594 	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4595 		return -ENOMEM;
4596 
4597 	return 0;
4598 }
4599 
btf_dedup_struct_types(struct btf_dedup * d)4600 static int btf_dedup_struct_types(struct btf_dedup *d)
4601 {
4602 	int i, err;
4603 
4604 	for (i = 0; i < d->btf->nr_types; i++) {
4605 		err = btf_dedup_struct_type(d, d->btf->start_id + i);
4606 		if (err)
4607 			return err;
4608 	}
4609 	return 0;
4610 }
4611 
4612 /*
4613  * Deduplicate reference type.
4614  *
4615  * Once all primitive and struct/union types got deduplicated, we can easily
4616  * deduplicate all other (reference) BTF types. This is done in two steps:
4617  *
4618  * 1. Resolve all referenced type IDs into their canonical type IDs. This
4619  * resolution can be done either immediately for primitive or struct/union types
4620  * (because they were deduped in previous two phases) or recursively for
4621  * reference types. Recursion will always terminate at either primitive or
4622  * struct/union type, at which point we can "unwind" chain of reference types
4623  * one by one. There is no danger of encountering cycles because in C type
4624  * system the only way to form type cycle is through struct/union, so any chain
4625  * of reference types, even those taking part in a type cycle, will inevitably
4626  * reach struct/union at some point.
4627  *
4628  * 2. Once all referenced type IDs are resolved into canonical ones, BTF type
4629  * becomes "stable", in the sense that no further deduplication will cause
4630  * any changes to it. With that, it's now possible to calculate type's signature
4631  * hash (this time taking into account referenced type IDs) and loop over all
4632  * potential canonical representatives. If no match was found, current type
4633  * will become canonical representative of itself and will be added into
4634  * btf_dedup->dedup_table as another possible canonical representative.
4635  */
btf_dedup_ref_type(struct btf_dedup * d,__u32 type_id)4636 static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id)
4637 {
4638 	struct hashmap_entry *hash_entry;
4639 	__u32 new_id = type_id, cand_id;
4640 	struct btf_type *t, *cand;
4641 	/* if we don't find equivalent type, then we are representative type */
4642 	int ref_type_id;
4643 	long h;
4644 
4645 	if (d->map[type_id] == BTF_IN_PROGRESS_ID)
4646 		return -ELOOP;
4647 	if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4648 		return resolve_type_id(d, type_id);
4649 
4650 	t = btf_type_by_id(d->btf, type_id);
4651 	d->map[type_id] = BTF_IN_PROGRESS_ID;
4652 
4653 	switch (btf_kind(t)) {
4654 	case BTF_KIND_CONST:
4655 	case BTF_KIND_VOLATILE:
4656 	case BTF_KIND_RESTRICT:
4657 	case BTF_KIND_PTR:
4658 	case BTF_KIND_TYPEDEF:
4659 	case BTF_KIND_FUNC:
4660 	case BTF_KIND_TYPE_TAG:
4661 		ref_type_id = btf_dedup_ref_type(d, t->type);
4662 		if (ref_type_id < 0)
4663 			return ref_type_id;
4664 		t->type = ref_type_id;
4665 
4666 		h = btf_hash_common(t);
4667 		for_each_dedup_cand(d, hash_entry, h) {
4668 			cand_id = hash_entry->value;
4669 			cand = btf_type_by_id(d->btf, cand_id);
4670 			if (btf_equal_common(t, cand)) {
4671 				new_id = cand_id;
4672 				break;
4673 			}
4674 		}
4675 		break;
4676 
4677 	case BTF_KIND_DECL_TAG:
4678 		ref_type_id = btf_dedup_ref_type(d, t->type);
4679 		if (ref_type_id < 0)
4680 			return ref_type_id;
4681 		t->type = ref_type_id;
4682 
4683 		h = btf_hash_int_decl_tag(t);
4684 		for_each_dedup_cand(d, hash_entry, h) {
4685 			cand_id = hash_entry->value;
4686 			cand = btf_type_by_id(d->btf, cand_id);
4687 			if (btf_equal_int_tag(t, cand)) {
4688 				new_id = cand_id;
4689 				break;
4690 			}
4691 		}
4692 		break;
4693 
4694 	case BTF_KIND_ARRAY: {
4695 		struct btf_array *info = btf_array(t);
4696 
4697 		ref_type_id = btf_dedup_ref_type(d, info->type);
4698 		if (ref_type_id < 0)
4699 			return ref_type_id;
4700 		info->type = ref_type_id;
4701 
4702 		ref_type_id = btf_dedup_ref_type(d, info->index_type);
4703 		if (ref_type_id < 0)
4704 			return ref_type_id;
4705 		info->index_type = ref_type_id;
4706 
4707 		h = btf_hash_array(t);
4708 		for_each_dedup_cand(d, hash_entry, h) {
4709 			cand_id = hash_entry->value;
4710 			cand = btf_type_by_id(d->btf, cand_id);
4711 			if (btf_equal_array(t, cand)) {
4712 				new_id = cand_id;
4713 				break;
4714 			}
4715 		}
4716 		break;
4717 	}
4718 
4719 	case BTF_KIND_FUNC_PROTO: {
4720 		struct btf_param *param;
4721 		__u16 vlen;
4722 		int i;
4723 
4724 		ref_type_id = btf_dedup_ref_type(d, t->type);
4725 		if (ref_type_id < 0)
4726 			return ref_type_id;
4727 		t->type = ref_type_id;
4728 
4729 		vlen = btf_vlen(t);
4730 		param = btf_params(t);
4731 		for (i = 0; i < vlen; i++) {
4732 			ref_type_id = btf_dedup_ref_type(d, param->type);
4733 			if (ref_type_id < 0)
4734 				return ref_type_id;
4735 			param->type = ref_type_id;
4736 			param++;
4737 		}
4738 
4739 		h = btf_hash_fnproto(t);
4740 		for_each_dedup_cand(d, hash_entry, h) {
4741 			cand_id = hash_entry->value;
4742 			cand = btf_type_by_id(d->btf, cand_id);
4743 			if (btf_equal_fnproto(t, cand)) {
4744 				new_id = cand_id;
4745 				break;
4746 			}
4747 		}
4748 		break;
4749 	}
4750 
4751 	default:
4752 		return -EINVAL;
4753 	}
4754 
4755 	d->map[type_id] = new_id;
4756 	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4757 		return -ENOMEM;
4758 
4759 	return new_id;
4760 }
4761 
btf_dedup_ref_types(struct btf_dedup * d)4762 static int btf_dedup_ref_types(struct btf_dedup *d)
4763 {
4764 	int i, err;
4765 
4766 	for (i = 0; i < d->btf->nr_types; i++) {
4767 		err = btf_dedup_ref_type(d, d->btf->start_id + i);
4768 		if (err < 0)
4769 			return err;
4770 	}
4771 	/* we won't need d->dedup_table anymore */
4772 	hashmap__free(d->dedup_table);
4773 	d->dedup_table = NULL;
4774 	return 0;
4775 }
4776 
4777 /*
4778  * Collect a map from type names to type ids for all canonical structs
4779  * and unions. If the same name is shared by several canonical types
4780  * use a special value 0 to indicate this fact.
4781  */
btf_dedup_fill_unique_names_map(struct btf_dedup * d,struct hashmap * names_map)4782 static int btf_dedup_fill_unique_names_map(struct btf_dedup *d, struct hashmap *names_map)
4783 {
4784 	__u32 nr_types = btf__type_cnt(d->btf);
4785 	struct btf_type *t;
4786 	__u32 type_id;
4787 	__u16 kind;
4788 	int err;
4789 
4790 	/*
4791 	 * Iterate over base and split module ids in order to get all
4792 	 * available structs in the map.
4793 	 */
4794 	for (type_id = 1; type_id < nr_types; ++type_id) {
4795 		t = btf_type_by_id(d->btf, type_id);
4796 		kind = btf_kind(t);
4797 
4798 		if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4799 			continue;
4800 
4801 		/* Skip non-canonical types */
4802 		if (type_id != d->map[type_id])
4803 			continue;
4804 
4805 		err = hashmap__add(names_map, t->name_off, type_id);
4806 		if (err == -EEXIST)
4807 			err = hashmap__set(names_map, t->name_off, 0, NULL, NULL);
4808 
4809 		if (err)
4810 			return err;
4811 	}
4812 
4813 	return 0;
4814 }
4815 
btf_dedup_resolve_fwd(struct btf_dedup * d,struct hashmap * names_map,__u32 type_id)4816 static int btf_dedup_resolve_fwd(struct btf_dedup *d, struct hashmap *names_map, __u32 type_id)
4817 {
4818 	struct btf_type *t = btf_type_by_id(d->btf, type_id);
4819 	enum btf_fwd_kind fwd_kind = btf_kflag(t);
4820 	__u16 cand_kind, kind = btf_kind(t);
4821 	struct btf_type *cand_t;
4822 	uintptr_t cand_id;
4823 
4824 	if (kind != BTF_KIND_FWD)
4825 		return 0;
4826 
4827 	/* Skip if this FWD already has a mapping */
4828 	if (type_id != d->map[type_id])
4829 		return 0;
4830 
4831 	if (!hashmap__find(names_map, t->name_off, &cand_id))
4832 		return 0;
4833 
4834 	/* Zero is a special value indicating that name is not unique */
4835 	if (!cand_id)
4836 		return 0;
4837 
4838 	cand_t = btf_type_by_id(d->btf, cand_id);
4839 	cand_kind = btf_kind(cand_t);
4840 	if ((cand_kind == BTF_KIND_STRUCT && fwd_kind != BTF_FWD_STRUCT) ||
4841 	    (cand_kind == BTF_KIND_UNION && fwd_kind != BTF_FWD_UNION))
4842 		return 0;
4843 
4844 	d->map[type_id] = cand_id;
4845 
4846 	return 0;
4847 }
4848 
4849 /*
4850  * Resolve unambiguous forward declarations.
4851  *
4852  * The lion's share of all FWD declarations is resolved during
4853  * `btf_dedup_struct_types` phase when different type graphs are
4854  * compared against each other. However, if in some compilation unit a
4855  * FWD declaration is not a part of a type graph compared against
4856  * another type graph that declaration's canonical type would not be
4857  * changed. Example:
4858  *
4859  * CU #1:
4860  *
4861  * struct foo;
4862  * struct foo *some_global;
4863  *
4864  * CU #2:
4865  *
4866  * struct foo { int u; };
4867  * struct foo *another_global;
4868  *
4869  * After `btf_dedup_struct_types` the BTF looks as follows:
4870  *
4871  * [1] STRUCT 'foo' size=4 vlen=1 ...
4872  * [2] INT 'int' size=4 ...
4873  * [3] PTR '(anon)' type_id=1
4874  * [4] FWD 'foo' fwd_kind=struct
4875  * [5] PTR '(anon)' type_id=4
4876  *
4877  * This pass assumes that such FWD declarations should be mapped to
4878  * structs or unions with identical name in case if the name is not
4879  * ambiguous.
4880  */
btf_dedup_resolve_fwds(struct btf_dedup * d)4881 static int btf_dedup_resolve_fwds(struct btf_dedup *d)
4882 {
4883 	int i, err;
4884 	struct hashmap *names_map;
4885 
4886 	names_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
4887 	if (IS_ERR(names_map))
4888 		return PTR_ERR(names_map);
4889 
4890 	err = btf_dedup_fill_unique_names_map(d, names_map);
4891 	if (err < 0)
4892 		goto exit;
4893 
4894 	for (i = 0; i < d->btf->nr_types; i++) {
4895 		err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i);
4896 		if (err < 0)
4897 			break;
4898 	}
4899 
4900 exit:
4901 	hashmap__free(names_map);
4902 	return err;
4903 }
4904 
4905 /*
4906  * Compact types.
4907  *
4908  * After we established for each type its corresponding canonical representative
4909  * type, we now can eliminate types that are not canonical and leave only
4910  * canonical ones layed out sequentially in memory by copying them over
4911  * duplicates. During compaction btf_dedup->hypot_map array is reused to store
4912  * a map from original type ID to a new compacted type ID, which will be used
4913  * during next phase to "fix up" type IDs, referenced from struct/union and
4914  * reference types.
4915  */
btf_dedup_compact_types(struct btf_dedup * d)4916 static int btf_dedup_compact_types(struct btf_dedup *d)
4917 {
4918 	__u32 *new_offs;
4919 	__u32 next_type_id = d->btf->start_id;
4920 	const struct btf_type *t;
4921 	void *p;
4922 	int i, id, len;
4923 
4924 	/* we are going to reuse hypot_map to store compaction remapping */
4925 	d->hypot_map[0] = 0;
4926 	/* base BTF types are not renumbered */
4927 	for (id = 1; id < d->btf->start_id; id++)
4928 		d->hypot_map[id] = id;
4929 	for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++)
4930 		d->hypot_map[id] = BTF_UNPROCESSED_ID;
4931 
4932 	p = d->btf->types_data;
4933 
4934 	for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) {
4935 		if (d->map[id] != id)
4936 			continue;
4937 
4938 		t = btf__type_by_id(d->btf, id);
4939 		len = btf_type_size(t);
4940 		if (len < 0)
4941 			return len;
4942 
4943 		memmove(p, t, len);
4944 		d->hypot_map[id] = next_type_id;
4945 		d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data;
4946 		p += len;
4947 		next_type_id++;
4948 	}
4949 
4950 	/* shrink struct btf's internal types index and update btf_header */
4951 	d->btf->nr_types = next_type_id - d->btf->start_id;
4952 	d->btf->type_offs_cap = d->btf->nr_types;
4953 	d->btf->hdr->type_len = p - d->btf->types_data;
4954 	new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap,
4955 				       sizeof(*new_offs));
4956 	if (d->btf->type_offs_cap && !new_offs)
4957 		return -ENOMEM;
4958 	d->btf->type_offs = new_offs;
4959 	d->btf->hdr->str_off = d->btf->hdr->type_len;
4960 	d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len;
4961 	return 0;
4962 }
4963 
4964 /*
4965  * Figure out final (deduplicated and compacted) type ID for provided original
4966  * `type_id` by first resolving it into corresponding canonical type ID and
4967  * then mapping it to a deduplicated type ID, stored in btf_dedup->hypot_map,
4968  * which is populated during compaction phase.
4969  */
btf_dedup_remap_type_id(__u32 * type_id,void * ctx)4970 static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx)
4971 {
4972 	struct btf_dedup *d = ctx;
4973 	__u32 resolved_type_id, new_type_id;
4974 
4975 	resolved_type_id = resolve_type_id(d, *type_id);
4976 	new_type_id = d->hypot_map[resolved_type_id];
4977 	if (new_type_id > BTF_MAX_NR_TYPES)
4978 		return -EINVAL;
4979 
4980 	*type_id = new_type_id;
4981 	return 0;
4982 }
4983 
4984 /*
4985  * Remap referenced type IDs into deduped type IDs.
4986  *
4987  * After BTF types are deduplicated and compacted, their final type IDs may
4988  * differ from original ones. The map from original to a corresponding
4989  * deduped type ID is stored in btf_dedup->hypot_map and is populated during
4990  * compaction phase. During remapping phase we are rewriting all type IDs
4991  * referenced from any BTF type (e.g., struct fields, func proto args, etc) to
4992  * their final deduped type IDs.
4993  */
btf_dedup_remap_types(struct btf_dedup * d)4994 static int btf_dedup_remap_types(struct btf_dedup *d)
4995 {
4996 	int i, r;
4997 
4998 	for (i = 0; i < d->btf->nr_types; i++) {
4999 		struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
5000 		struct btf_field_iter it;
5001 		__u32 *type_id;
5002 
5003 		r = btf_field_iter_init(&it, t, BTF_FIELD_ITER_IDS);
5004 		if (r)
5005 			return r;
5006 
5007 		while ((type_id = btf_field_iter_next(&it))) {
5008 			__u32 resolved_id, new_id;
5009 
5010 			resolved_id = resolve_type_id(d, *type_id);
5011 			new_id = d->hypot_map[resolved_id];
5012 			if (new_id > BTF_MAX_NR_TYPES)
5013 				return -EINVAL;
5014 
5015 			*type_id = new_id;
5016 		}
5017 	}
5018 
5019 	if (!d->btf_ext)
5020 		return 0;
5021 
5022 	r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
5023 	if (r)
5024 		return r;
5025 
5026 	return 0;
5027 }
5028 
5029 /*
5030  * Probe few well-known locations for vmlinux kernel image and try to load BTF
5031  * data out of it to use for target BTF.
5032  */
btf__load_vmlinux_btf(void)5033 struct btf *btf__load_vmlinux_btf(void)
5034 {
5035 	const char *sysfs_btf_path = "/sys/kernel/btf/vmlinux";
5036 	/* fall back locations, trying to find vmlinux on disk */
5037 	const char *locations[] = {
5038 		"/boot/vmlinux-%1$s",
5039 		"/lib/modules/%1$s/vmlinux-%1$s",
5040 		"/lib/modules/%1$s/build/vmlinux",
5041 		"/usr/lib/modules/%1$s/kernel/vmlinux",
5042 		"/usr/lib/debug/boot/vmlinux-%1$s",
5043 		"/usr/lib/debug/boot/vmlinux-%1$s.debug",
5044 		"/usr/lib/debug/lib/modules/%1$s/vmlinux",
5045 	};
5046 	char path[PATH_MAX + 1];
5047 	struct utsname buf;
5048 	struct btf *btf;
5049 	int i, err;
5050 
5051 	/* is canonical sysfs location accessible? */
5052 	if (faccessat(AT_FDCWD, sysfs_btf_path, F_OK, AT_EACCESS) < 0) {
5053 		pr_warn("kernel BTF is missing at '%s', was CONFIG_DEBUG_INFO_BTF enabled?\n",
5054 			sysfs_btf_path);
5055 	} else {
5056 		btf = btf__parse(sysfs_btf_path, NULL);
5057 		if (!btf) {
5058 			err = -errno;
5059 			pr_warn("failed to read kernel BTF from '%s': %d\n", sysfs_btf_path, err);
5060 			return libbpf_err_ptr(err);
5061 		}
5062 		pr_debug("loaded kernel BTF from '%s'\n", sysfs_btf_path);
5063 		return btf;
5064 	}
5065 
5066 	/* try fallback locations */
5067 	uname(&buf);
5068 	for (i = 0; i < ARRAY_SIZE(locations); i++) {
5069 		snprintf(path, PATH_MAX, locations[i], buf.release);
5070 
5071 		if (faccessat(AT_FDCWD, path, R_OK, AT_EACCESS))
5072 			continue;
5073 
5074 		btf = btf__parse(path, NULL);
5075 		err = libbpf_get_error(btf);
5076 		pr_debug("loading kernel BTF '%s': %d\n", path, err);
5077 		if (err)
5078 			continue;
5079 
5080 		return btf;
5081 	}
5082 
5083 	pr_warn("failed to find valid kernel BTF\n");
5084 	return libbpf_err_ptr(-ESRCH);
5085 }
5086 
5087 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
5088 
btf__load_module_btf(const char * module_name,struct btf * vmlinux_btf)5089 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf)
5090 {
5091 	char path[80];
5092 
5093 	snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name);
5094 	return btf__parse_split(path, vmlinux_btf);
5095 }
5096 
btf_ext_visit_type_ids(struct btf_ext * btf_ext,type_id_visit_fn visit,void * ctx)5097 int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
5098 {
5099 	const struct btf_ext_info *seg;
5100 	struct btf_ext_info_sec *sec;
5101 	int i, err;
5102 
5103 	seg = &btf_ext->func_info;
5104 	for_each_btf_ext_sec(seg, sec) {
5105 		struct bpf_func_info_min *rec;
5106 
5107 		for_each_btf_ext_rec(seg, sec, i, rec) {
5108 			err = visit(&rec->type_id, ctx);
5109 			if (err < 0)
5110 				return err;
5111 		}
5112 	}
5113 
5114 	seg = &btf_ext->core_relo_info;
5115 	for_each_btf_ext_sec(seg, sec) {
5116 		struct bpf_core_relo *rec;
5117 
5118 		for_each_btf_ext_rec(seg, sec, i, rec) {
5119 			err = visit(&rec->type_id, ctx);
5120 			if (err < 0)
5121 				return err;
5122 		}
5123 	}
5124 
5125 	return 0;
5126 }
5127 
btf_ext_visit_str_offs(struct btf_ext * btf_ext,str_off_visit_fn visit,void * ctx)5128 int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
5129 {
5130 	const struct btf_ext_info *seg;
5131 	struct btf_ext_info_sec *sec;
5132 	int i, err;
5133 
5134 	seg = &btf_ext->func_info;
5135 	for_each_btf_ext_sec(seg, sec) {
5136 		err = visit(&sec->sec_name_off, ctx);
5137 		if (err)
5138 			return err;
5139 	}
5140 
5141 	seg = &btf_ext->line_info;
5142 	for_each_btf_ext_sec(seg, sec) {
5143 		struct bpf_line_info_min *rec;
5144 
5145 		err = visit(&sec->sec_name_off, ctx);
5146 		if (err)
5147 			return err;
5148 
5149 		for_each_btf_ext_rec(seg, sec, i, rec) {
5150 			err = visit(&rec->file_name_off, ctx);
5151 			if (err)
5152 				return err;
5153 			err = visit(&rec->line_off, ctx);
5154 			if (err)
5155 				return err;
5156 		}
5157 	}
5158 
5159 	seg = &btf_ext->core_relo_info;
5160 	for_each_btf_ext_sec(seg, sec) {
5161 		struct bpf_core_relo *rec;
5162 
5163 		err = visit(&sec->sec_name_off, ctx);
5164 		if (err)
5165 			return err;
5166 
5167 		for_each_btf_ext_rec(seg, sec, i, rec) {
5168 			err = visit(&rec->access_str_off, ctx);
5169 			if (err)
5170 				return err;
5171 		}
5172 	}
5173 
5174 	return 0;
5175 }
5176 
5177 struct btf_distill {
5178 	struct btf_pipe pipe;
5179 	int *id_map;
5180 	unsigned int split_start_id;
5181 	unsigned int split_start_str;
5182 	int diff_id;
5183 };
5184 
btf_add_distilled_type_ids(struct btf_distill * dist,__u32 i)5185 static int btf_add_distilled_type_ids(struct btf_distill *dist, __u32 i)
5186 {
5187 	struct btf_type *split_t = btf_type_by_id(dist->pipe.src, i);
5188 	struct btf_field_iter it;
5189 	__u32 *id;
5190 	int err;
5191 
5192 	err = btf_field_iter_init(&it, split_t, BTF_FIELD_ITER_IDS);
5193 	if (err)
5194 		return err;
5195 	while ((id = btf_field_iter_next(&it))) {
5196 		struct btf_type *base_t;
5197 
5198 		if (!*id)
5199 			continue;
5200 		/* split BTF id, not needed */
5201 		if (*id >= dist->split_start_id)
5202 			continue;
5203 		/* already added ? */
5204 		if (dist->id_map[*id] > 0)
5205 			continue;
5206 
5207 		/* only a subset of base BTF types should be referenced from
5208 		 * split BTF; ensure nothing unexpected is referenced.
5209 		 */
5210 		base_t = btf_type_by_id(dist->pipe.src, *id);
5211 		switch (btf_kind(base_t)) {
5212 		case BTF_KIND_INT:
5213 		case BTF_KIND_FLOAT:
5214 		case BTF_KIND_FWD:
5215 		case BTF_KIND_ARRAY:
5216 		case BTF_KIND_STRUCT:
5217 		case BTF_KIND_UNION:
5218 		case BTF_KIND_TYPEDEF:
5219 		case BTF_KIND_ENUM:
5220 		case BTF_KIND_ENUM64:
5221 		case BTF_KIND_PTR:
5222 		case BTF_KIND_CONST:
5223 		case BTF_KIND_RESTRICT:
5224 		case BTF_KIND_VOLATILE:
5225 		case BTF_KIND_FUNC_PROTO:
5226 		case BTF_KIND_TYPE_TAG:
5227 			dist->id_map[*id] = *id;
5228 			break;
5229 		default:
5230 			pr_warn("unexpected reference to base type[%u] of kind [%u] when creating distilled base BTF.\n",
5231 				*id, btf_kind(base_t));
5232 			return -EINVAL;
5233 		}
5234 		/* If a base type is used, ensure types it refers to are
5235 		 * marked as used also; so for example if we find a PTR to INT
5236 		 * we need both the PTR and INT.
5237 		 *
5238 		 * The only exception is named struct/unions, since distilled
5239 		 * base BTF composite types have no members.
5240 		 */
5241 		if (btf_is_composite(base_t) && base_t->name_off)
5242 			continue;
5243 		err = btf_add_distilled_type_ids(dist, *id);
5244 		if (err)
5245 			return err;
5246 	}
5247 	return 0;
5248 }
5249 
btf_add_distilled_types(struct btf_distill * dist)5250 static int btf_add_distilled_types(struct btf_distill *dist)
5251 {
5252 	bool adding_to_base = dist->pipe.dst->start_id == 1;
5253 	int id = btf__type_cnt(dist->pipe.dst);
5254 	struct btf_type *t;
5255 	int i, err = 0;
5256 
5257 
5258 	/* Add types for each of the required references to either distilled
5259 	 * base or split BTF, depending on type characteristics.
5260 	 */
5261 	for (i = 1; i < dist->split_start_id; i++) {
5262 		const char *name;
5263 		int kind;
5264 
5265 		if (!dist->id_map[i])
5266 			continue;
5267 		t = btf_type_by_id(dist->pipe.src, i);
5268 		kind = btf_kind(t);
5269 		name = btf__name_by_offset(dist->pipe.src, t->name_off);
5270 
5271 		switch (kind) {
5272 		case BTF_KIND_INT:
5273 		case BTF_KIND_FLOAT:
5274 		case BTF_KIND_FWD:
5275 			/* Named int, float, fwd are added to base. */
5276 			if (!adding_to_base)
5277 				continue;
5278 			err = btf_add_type(&dist->pipe, t);
5279 			break;
5280 		case BTF_KIND_STRUCT:
5281 		case BTF_KIND_UNION:
5282 			/* Named struct/union are added to base as 0-vlen
5283 			 * struct/union of same size.  Anonymous struct/unions
5284 			 * are added to split BTF as-is.
5285 			 */
5286 			if (adding_to_base) {
5287 				if (!t->name_off)
5288 					continue;
5289 				err = btf_add_composite(dist->pipe.dst, kind, name, t->size);
5290 			} else {
5291 				if (t->name_off)
5292 					continue;
5293 				err = btf_add_type(&dist->pipe, t);
5294 			}
5295 			break;
5296 		case BTF_KIND_ENUM:
5297 		case BTF_KIND_ENUM64:
5298 			/* Named enum[64]s are added to base as a sized
5299 			 * enum; relocation will match with appropriately-named
5300 			 * and sized enum or enum64.
5301 			 *
5302 			 * Anonymous enums are added to split BTF as-is.
5303 			 */
5304 			if (adding_to_base) {
5305 				if (!t->name_off)
5306 					continue;
5307 				err = btf__add_enum(dist->pipe.dst, name, t->size);
5308 			} else {
5309 				if (t->name_off)
5310 					continue;
5311 				err = btf_add_type(&dist->pipe, t);
5312 			}
5313 			break;
5314 		case BTF_KIND_ARRAY:
5315 		case BTF_KIND_TYPEDEF:
5316 		case BTF_KIND_PTR:
5317 		case BTF_KIND_CONST:
5318 		case BTF_KIND_RESTRICT:
5319 		case BTF_KIND_VOLATILE:
5320 		case BTF_KIND_FUNC_PROTO:
5321 		case BTF_KIND_TYPE_TAG:
5322 			/* All other types are added to split BTF. */
5323 			if (adding_to_base)
5324 				continue;
5325 			err = btf_add_type(&dist->pipe, t);
5326 			break;
5327 		default:
5328 			pr_warn("unexpected kind when adding base type '%s'[%u] of kind [%u] to distilled base BTF.\n",
5329 				name, i, kind);
5330 			return -EINVAL;
5331 
5332 		}
5333 		if (err < 0)
5334 			break;
5335 		dist->id_map[i] = id++;
5336 	}
5337 	return err;
5338 }
5339 
5340 /* Split BTF ids without a mapping will be shifted downwards since distilled
5341  * base BTF is smaller than the original base BTF.  For those that have a
5342  * mapping (either to base or updated split BTF), update the id based on
5343  * that mapping.
5344  */
btf_update_distilled_type_ids(struct btf_distill * dist,__u32 i)5345 static int btf_update_distilled_type_ids(struct btf_distill *dist, __u32 i)
5346 {
5347 	struct btf_type *t = btf_type_by_id(dist->pipe.dst, i);
5348 	struct btf_field_iter it;
5349 	__u32 *id;
5350 	int err;
5351 
5352 	err = btf_field_iter_init(&it, t, BTF_FIELD_ITER_IDS);
5353 	if (err)
5354 		return err;
5355 	while ((id = btf_field_iter_next(&it))) {
5356 		if (dist->id_map[*id])
5357 			*id = dist->id_map[*id];
5358 		else if (*id >= dist->split_start_id)
5359 			*id -= dist->diff_id;
5360 	}
5361 	return 0;
5362 }
5363 
5364 /* Create updated split BTF with distilled base BTF; distilled base BTF
5365  * consists of BTF information required to clarify the types that split
5366  * BTF refers to, omitting unneeded details.  Specifically it will contain
5367  * base types and memberless definitions of named structs, unions and enumerated
5368  * types. Associated reference types like pointers, arrays and anonymous
5369  * structs, unions and enumerated types will be added to split BTF.
5370  * Size is recorded for named struct/unions to help guide matching to the
5371  * target base BTF during later relocation.
5372  *
5373  * The only case where structs, unions or enumerated types are fully represented
5374  * is when they are anonymous; in such cases, the anonymous type is added to
5375  * split BTF in full.
5376  *
5377  * We return newly-created split BTF where the split BTF refers to a newly-created
5378  * distilled base BTF. Both must be freed separately by the caller.
5379  */
btf__distill_base(const struct btf * src_btf,struct btf ** new_base_btf,struct btf ** new_split_btf)5380 int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf,
5381 		      struct btf **new_split_btf)
5382 {
5383 	struct btf *new_base = NULL, *new_split = NULL;
5384 	const struct btf *old_base;
5385 	unsigned int n = btf__type_cnt(src_btf);
5386 	struct btf_distill dist = {};
5387 	struct btf_type *t;
5388 	int i, err = 0;
5389 
5390 	/* src BTF must be split BTF. */
5391 	old_base = btf__base_btf(src_btf);
5392 	if (!new_base_btf || !new_split_btf || !old_base)
5393 		return libbpf_err(-EINVAL);
5394 
5395 	new_base = btf__new_empty();
5396 	if (!new_base)
5397 		return libbpf_err(-ENOMEM);
5398 
5399 	btf__set_endianness(new_base, btf__endianness(src_btf));
5400 
5401 	dist.id_map = calloc(n, sizeof(*dist.id_map));
5402 	if (!dist.id_map) {
5403 		err = -ENOMEM;
5404 		goto done;
5405 	}
5406 	dist.pipe.src = src_btf;
5407 	dist.pipe.dst = new_base;
5408 	dist.pipe.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
5409 	if (IS_ERR(dist.pipe.str_off_map)) {
5410 		err = -ENOMEM;
5411 		goto done;
5412 	}
5413 	dist.split_start_id = btf__type_cnt(old_base);
5414 	dist.split_start_str = old_base->hdr->str_len;
5415 
5416 	/* Pass over src split BTF; generate the list of base BTF type ids it
5417 	 * references; these will constitute our distilled BTF set to be
5418 	 * distributed over base and split BTF as appropriate.
5419 	 */
5420 	for (i = src_btf->start_id; i < n; i++) {
5421 		err = btf_add_distilled_type_ids(&dist, i);
5422 		if (err < 0)
5423 			goto done;
5424 	}
5425 	/* Next add types for each of the required references to base BTF and split BTF
5426 	 * in turn.
5427 	 */
5428 	err = btf_add_distilled_types(&dist);
5429 	if (err < 0)
5430 		goto done;
5431 
5432 	/* Create new split BTF with distilled base BTF as its base; the final
5433 	 * state is split BTF with distilled base BTF that represents enough
5434 	 * about its base references to allow it to be relocated with the base
5435 	 * BTF available.
5436 	 */
5437 	new_split = btf__new_empty_split(new_base);
5438 	if (!new_split) {
5439 		err = -errno;
5440 		goto done;
5441 	}
5442 	dist.pipe.dst = new_split;
5443 	/* First add all split types */
5444 	for (i = src_btf->start_id; i < n; i++) {
5445 		t = btf_type_by_id(src_btf, i);
5446 		err = btf_add_type(&dist.pipe, t);
5447 		if (err < 0)
5448 			goto done;
5449 	}
5450 	/* Now add distilled types to split BTF that are not added to base. */
5451 	err = btf_add_distilled_types(&dist);
5452 	if (err < 0)
5453 		goto done;
5454 
5455 	/* All split BTF ids will be shifted downwards since there are less base
5456 	 * BTF ids in distilled base BTF.
5457 	 */
5458 	dist.diff_id = dist.split_start_id - btf__type_cnt(new_base);
5459 
5460 	n = btf__type_cnt(new_split);
5461 	/* Now update base/split BTF ids. */
5462 	for (i = 1; i < n; i++) {
5463 		err = btf_update_distilled_type_ids(&dist, i);
5464 		if (err < 0)
5465 			break;
5466 	}
5467 done:
5468 	free(dist.id_map);
5469 	hashmap__free(dist.pipe.str_off_map);
5470 	if (err) {
5471 		btf__free(new_split);
5472 		btf__free(new_base);
5473 		return libbpf_err(err);
5474 	}
5475 	*new_base_btf = new_base;
5476 	*new_split_btf = new_split;
5477 
5478 	return 0;
5479 }
5480 
btf_header(const struct btf * btf)5481 const struct btf_header *btf_header(const struct btf *btf)
5482 {
5483 	return btf->hdr;
5484 }
5485 
btf_set_base_btf(struct btf * btf,const struct btf * base_btf)5486 void btf_set_base_btf(struct btf *btf, const struct btf *base_btf)
5487 {
5488 	btf->base_btf = (struct btf *)base_btf;
5489 	btf->start_id = btf__type_cnt(base_btf);
5490 	btf->start_str_off = base_btf->hdr->str_len;
5491 }
5492 
btf__relocate(struct btf * btf,const struct btf * base_btf)5493 int btf__relocate(struct btf *btf, const struct btf *base_btf)
5494 {
5495 	int err = btf_relocate(btf, base_btf, NULL);
5496 
5497 	if (!err)
5498 		btf->owns_base = false;
5499 	return libbpf_err(err);
5500 }
5501