1
2
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
29static struct btf_type btf_void;
30
31struct btf {
32
33 void *raw_data;
34
35 void *raw_data_swapped;
36 __u32 raw_size;
37
38 bool swapped_endian;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 struct btf_header *hdr;
78
79 void *types_data;
80 size_t types_data_cap;
81
82
83
84
85
86
87 __u32 *type_offs;
88 size_t type_offs_cap;
89
90
91
92
93 __u32 nr_types;
94
95
96
97 struct btf *base_btf;
98
99
100
101
102 int start_id;
103
104
105
106
107 int start_str_off;
108
109
110
111
112
113 void *strs_data;
114
115 struct strset *strs_set;
116
117 bool strs_deduped;
118
119
120 int fd;
121
122
123 int ptr_sz;
124};
125
126static inline __u64 ptr_to_u64(const void *ptr)
127{
128 return (__u64) (unsigned long) ptr;
129}
130
131
132
133
134
135
136
137
138
139
140
141void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz,
142 size_t cur_cnt, size_t max_cnt, size_t add_cnt)
143{
144 size_t new_cnt;
145 void *new_data;
146
147 if (cur_cnt + add_cnt <= *cap_cnt)
148 return *data + cur_cnt * elem_sz;
149
150
151 if (cur_cnt + add_cnt > max_cnt)
152 return NULL;
153
154 new_cnt = *cap_cnt;
155 new_cnt += new_cnt / 4;
156 if (new_cnt < 16)
157 new_cnt = 16;
158 if (new_cnt > max_cnt)
159 new_cnt = max_cnt;
160 if (new_cnt < cur_cnt + add_cnt)
161 new_cnt = cur_cnt + add_cnt;
162
163 new_data = libbpf_reallocarray(*data, new_cnt, elem_sz);
164 if (!new_data)
165 return NULL;
166
167
168 memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz);
169
170 *data = new_data;
171 *cap_cnt = new_cnt;
172 return new_data + cur_cnt * elem_sz;
173}
174
175
176
177
178int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt)
179{
180 void *p;
181
182 if (need_cnt <= *cap_cnt)
183 return 0;
184
185 p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt);
186 if (!p)
187 return -ENOMEM;
188
189 return 0;
190}
191
192static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt)
193{
194 return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32),
195 btf->nr_types, BTF_MAX_NR_TYPES, add_cnt);
196}
197
198static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off)
199{
200 __u32 *p;
201
202 p = btf_add_type_offs_mem(btf, 1);
203 if (!p)
204 return -ENOMEM;
205
206 *p = type_off;
207 return 0;
208}
209
210static void btf_bswap_hdr(struct btf_header *h)
211{
212 h->magic = bswap_16(h->magic);
213 h->hdr_len = bswap_32(h->hdr_len);
214 h->type_off = bswap_32(h->type_off);
215 h->type_len = bswap_32(h->type_len);
216 h->str_off = bswap_32(h->str_off);
217 h->str_len = bswap_32(h->str_len);
218}
219
220static int btf_parse_hdr(struct btf *btf)
221{
222 struct btf_header *hdr = btf->hdr;
223 __u32 meta_left;
224
225 if (btf->raw_size < sizeof(struct btf_header)) {
226 pr_debug("BTF header not found\n");
227 return -EINVAL;
228 }
229
230 if (hdr->magic == bswap_16(BTF_MAGIC)) {
231 btf->swapped_endian = true;
232 if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) {
233 pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n",
234 bswap_32(hdr->hdr_len));
235 return -ENOTSUP;
236 }
237 btf_bswap_hdr(hdr);
238 } else if (hdr->magic != BTF_MAGIC) {
239 pr_debug("Invalid BTF magic: %x\n", hdr->magic);
240 return -EINVAL;
241 }
242
243 if (btf->raw_size < hdr->hdr_len) {
244 pr_debug("BTF header len %u larger than data size %u\n",
245 hdr->hdr_len, btf->raw_size);
246 return -EINVAL;
247 }
248
249 meta_left = btf->raw_size - hdr->hdr_len;
250 if (meta_left < (long long)hdr->str_off + hdr->str_len) {
251 pr_debug("Invalid BTF total size: %u\n", btf->raw_size);
252 return -EINVAL;
253 }
254
255 if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
256 pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n",
257 hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
258 return -EINVAL;
259 }
260
261 if (hdr->type_off % 4) {
262 pr_debug("BTF type section is not aligned to 4 bytes\n");
263 return -EINVAL;
264 }
265
266 return 0;
267}
268
269static int btf_parse_str_sec(struct btf *btf)
270{
271 const struct btf_header *hdr = btf->hdr;
272 const char *start = btf->strs_data;
273 const char *end = start + btf->hdr->str_len;
274
275 if (btf->base_btf && hdr->str_len == 0)
276 return 0;
277 if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) {
278 pr_debug("Invalid BTF string section\n");
279 return -EINVAL;
280 }
281 if (!btf->base_btf && start[0]) {
282 pr_debug("Invalid BTF string section\n");
283 return -EINVAL;
284 }
285 return 0;
286}
287
288static int btf_type_size(const struct btf_type *t)
289{
290 const int base_size = sizeof(struct btf_type);
291 __u16 vlen = btf_vlen(t);
292
293 switch (btf_kind(t)) {
294 case BTF_KIND_FWD:
295 case BTF_KIND_CONST:
296 case BTF_KIND_VOLATILE:
297 case BTF_KIND_RESTRICT:
298 case BTF_KIND_PTR:
299 case BTF_KIND_TYPEDEF:
300 case BTF_KIND_FUNC:
301 case BTF_KIND_FLOAT:
302 case BTF_KIND_TYPE_TAG:
303 return base_size;
304 case BTF_KIND_INT:
305 return base_size + sizeof(__u32);
306 case BTF_KIND_ENUM:
307 return base_size + vlen * sizeof(struct btf_enum);
308 case BTF_KIND_ARRAY:
309 return base_size + sizeof(struct btf_array);
310 case BTF_KIND_STRUCT:
311 case BTF_KIND_UNION:
312 return base_size + vlen * sizeof(struct btf_member);
313 case BTF_KIND_FUNC_PROTO:
314 return base_size + vlen * sizeof(struct btf_param);
315 case BTF_KIND_VAR:
316 return base_size + sizeof(struct btf_var);
317 case BTF_KIND_DATASEC:
318 return base_size + vlen * sizeof(struct btf_var_secinfo);
319 case BTF_KIND_DECL_TAG:
320 return base_size + sizeof(struct btf_decl_tag);
321 default:
322 pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
323 return -EINVAL;
324 }
325}
326
327static void btf_bswap_type_base(struct btf_type *t)
328{
329 t->name_off = bswap_32(t->name_off);
330 t->info = bswap_32(t->info);
331 t->type = bswap_32(t->type);
332}
333
334static int btf_bswap_type_rest(struct btf_type *t)
335{
336 struct btf_var_secinfo *v;
337 struct btf_member *m;
338 struct btf_array *a;
339 struct btf_param *p;
340 struct btf_enum *e;
341 __u16 vlen = btf_vlen(t);
342 int i;
343
344 switch (btf_kind(t)) {
345 case BTF_KIND_FWD:
346 case BTF_KIND_CONST:
347 case BTF_KIND_VOLATILE:
348 case BTF_KIND_RESTRICT:
349 case BTF_KIND_PTR:
350 case BTF_KIND_TYPEDEF:
351 case BTF_KIND_FUNC:
352 case BTF_KIND_FLOAT:
353 case BTF_KIND_TYPE_TAG:
354 return 0;
355 case BTF_KIND_INT:
356 *(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1));
357 return 0;
358 case BTF_KIND_ENUM:
359 for (i = 0, e = btf_enum(t); i < vlen; i++, e++) {
360 e->name_off = bswap_32(e->name_off);
361 e->val = bswap_32(e->val);
362 }
363 return 0;
364 case BTF_KIND_ARRAY:
365 a = btf_array(t);
366 a->type = bswap_32(a->type);
367 a->index_type = bswap_32(a->index_type);
368 a->nelems = bswap_32(a->nelems);
369 return 0;
370 case BTF_KIND_STRUCT:
371 case BTF_KIND_UNION:
372 for (i = 0, m = btf_members(t); i < vlen; i++, m++) {
373 m->name_off = bswap_32(m->name_off);
374 m->type = bswap_32(m->type);
375 m->offset = bswap_32(m->offset);
376 }
377 return 0;
378 case BTF_KIND_FUNC_PROTO:
379 for (i = 0, p = btf_params(t); i < vlen; i++, p++) {
380 p->name_off = bswap_32(p->name_off);
381 p->type = bswap_32(p->type);
382 }
383 return 0;
384 case BTF_KIND_VAR:
385 btf_var(t)->linkage = bswap_32(btf_var(t)->linkage);
386 return 0;
387 case BTF_KIND_DATASEC:
388 for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) {
389 v->type = bswap_32(v->type);
390 v->offset = bswap_32(v->offset);
391 v->size = bswap_32(v->size);
392 }
393 return 0;
394 case BTF_KIND_DECL_TAG:
395 btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx);
396 return 0;
397 default:
398 pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
399 return -EINVAL;
400 }
401}
402
403static int btf_parse_type_sec(struct btf *btf)
404{
405 struct btf_header *hdr = btf->hdr;
406 void *next_type = btf->types_data;
407 void *end_type = next_type + hdr->type_len;
408 int err, type_size;
409
410 while (next_type + sizeof(struct btf_type) <= end_type) {
411 if (btf->swapped_endian)
412 btf_bswap_type_base(next_type);
413
414 type_size = btf_type_size(next_type);
415 if (type_size < 0)
416 return type_size;
417 if (next_type + type_size > end_type) {
418 pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types);
419 return -EINVAL;
420 }
421
422 if (btf->swapped_endian && btf_bswap_type_rest(next_type))
423 return -EINVAL;
424
425 err = btf_add_type_idx_entry(btf, next_type - btf->types_data);
426 if (err)
427 return err;
428
429 next_type += type_size;
430 btf->nr_types++;
431 }
432
433 if (next_type != end_type) {
434 pr_warn("BTF types data is malformed\n");
435 return -EINVAL;
436 }
437
438 return 0;
439}
440
441__u32 btf__get_nr_types(const struct btf *btf)
442{
443 return btf->start_id + btf->nr_types - 1;
444}
445
446__u32 btf__type_cnt(const struct btf *btf)
447{
448 return btf->start_id + btf->nr_types;
449}
450
451const struct btf *btf__base_btf(const struct btf *btf)
452{
453 return btf->base_btf;
454}
455
456
457struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
458{
459 if (type_id == 0)
460 return &btf_void;
461 if (type_id < btf->start_id)
462 return btf_type_by_id(btf->base_btf, type_id);
463 return btf->types_data + btf->type_offs[type_id - btf->start_id];
464}
465
466const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id)
467{
468 if (type_id >= btf->start_id + btf->nr_types)
469 return errno = EINVAL, NULL;
470 return btf_type_by_id((struct btf *)btf, type_id);
471}
472
473static int determine_ptr_size(const struct btf *btf)
474{
475 const struct btf_type *t;
476 const char *name;
477 int i, n;
478
479 if (btf->base_btf && btf->base_btf->ptr_sz > 0)
480 return btf->base_btf->ptr_sz;
481
482 n = btf__type_cnt(btf);
483 for (i = 1; i < n; i++) {
484 t = btf__type_by_id(btf, i);
485 if (!btf_is_int(t))
486 continue;
487
488 name = btf__name_by_offset(btf, t->name_off);
489 if (!name)
490 continue;
491
492 if (strcmp(name, "long int") == 0 ||
493 strcmp(name, "long unsigned int") == 0) {
494 if (t->size != 4 && t->size != 8)
495 continue;
496 return t->size;
497 }
498 }
499
500 return -1;
501}
502
503static size_t btf_ptr_sz(const struct btf *btf)
504{
505 if (!btf->ptr_sz)
506 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
507 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
508}
509
510
511
512
513
514
515
516
517
518size_t btf__pointer_size(const struct btf *btf)
519{
520 if (!btf->ptr_sz)
521 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
522
523 if (btf->ptr_sz < 0)
524
525 return 0;
526
527 return btf->ptr_sz;
528}
529
530
531
532
533int btf__set_pointer_size(struct btf *btf, size_t ptr_sz)
534{
535 if (ptr_sz != 4 && ptr_sz != 8)
536 return libbpf_err(-EINVAL);
537 btf->ptr_sz = ptr_sz;
538 return 0;
539}
540
541static bool is_host_big_endian(void)
542{
543#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
544 return false;
545#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
546 return true;
547#else
548# error "Unrecognized __BYTE_ORDER__"
549#endif
550}
551
552enum btf_endianness btf__endianness(const struct btf *btf)
553{
554 if (is_host_big_endian())
555 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
556 else
557 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
558}
559
560int btf__set_endianness(struct btf *btf, enum btf_endianness endian)
561{
562 if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN)
563 return libbpf_err(-EINVAL);
564
565 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
566 if (!btf->swapped_endian) {
567 free(btf->raw_data_swapped);
568 btf->raw_data_swapped = NULL;
569 }
570 return 0;
571}
572
573static bool btf_type_is_void(const struct btf_type *t)
574{
575 return t == &btf_void || btf_is_fwd(t);
576}
577
578static bool btf_type_is_void_or_null(const struct btf_type *t)
579{
580 return !t || btf_type_is_void(t);
581}
582
583#define MAX_RESOLVE_DEPTH 32
584
585__s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
586{
587 const struct btf_array *array;
588 const struct btf_type *t;
589 __u32 nelems = 1;
590 __s64 size = -1;
591 int i;
592
593 t = btf__type_by_id(btf, type_id);
594 for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) {
595 switch (btf_kind(t)) {
596 case BTF_KIND_INT:
597 case BTF_KIND_STRUCT:
598 case BTF_KIND_UNION:
599 case BTF_KIND_ENUM:
600 case BTF_KIND_DATASEC:
601 case BTF_KIND_FLOAT:
602 size = t->size;
603 goto done;
604 case BTF_KIND_PTR:
605 size = btf_ptr_sz(btf);
606 goto done;
607 case BTF_KIND_TYPEDEF:
608 case BTF_KIND_VOLATILE:
609 case BTF_KIND_CONST:
610 case BTF_KIND_RESTRICT:
611 case BTF_KIND_VAR:
612 case BTF_KIND_DECL_TAG:
613 case BTF_KIND_TYPE_TAG:
614 type_id = t->type;
615 break;
616 case BTF_KIND_ARRAY:
617 array = btf_array(t);
618 if (nelems && array->nelems > UINT32_MAX / nelems)
619 return libbpf_err(-E2BIG);
620 nelems *= array->nelems;
621 type_id = array->type;
622 break;
623 default:
624 return libbpf_err(-EINVAL);
625 }
626
627 t = btf__type_by_id(btf, type_id);
628 }
629
630done:
631 if (size < 0)
632 return libbpf_err(-EINVAL);
633 if (nelems && size > UINT32_MAX / nelems)
634 return libbpf_err(-E2BIG);
635
636 return nelems * size;
637}
638
639int btf__align_of(const struct btf *btf, __u32 id)
640{
641 const struct btf_type *t = btf__type_by_id(btf, id);
642 __u16 kind = btf_kind(t);
643
644 switch (kind) {
645 case BTF_KIND_INT:
646 case BTF_KIND_ENUM:
647 case BTF_KIND_FLOAT:
648 return min(btf_ptr_sz(btf), (size_t)t->size);
649 case BTF_KIND_PTR:
650 return btf_ptr_sz(btf);
651 case BTF_KIND_TYPEDEF:
652 case BTF_KIND_VOLATILE:
653 case BTF_KIND_CONST:
654 case BTF_KIND_RESTRICT:
655 case BTF_KIND_TYPE_TAG:
656 return btf__align_of(btf, t->type);
657 case BTF_KIND_ARRAY:
658 return btf__align_of(btf, btf_array(t)->type);
659 case BTF_KIND_STRUCT:
660 case BTF_KIND_UNION: {
661 const struct btf_member *m = btf_members(t);
662 __u16 vlen = btf_vlen(t);
663 int i, max_align = 1, align;
664
665 for (i = 0; i < vlen; i++, m++) {
666 align = btf__align_of(btf, m->type);
667 if (align <= 0)
668 return libbpf_err(align);
669 max_align = max(max_align, align);
670 }
671
672 return max_align;
673 }
674 default:
675 pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t));
676 return errno = EINVAL, 0;
677 }
678}
679
680int btf__resolve_type(const struct btf *btf, __u32 type_id)
681{
682 const struct btf_type *t;
683 int depth = 0;
684
685 t = btf__type_by_id(btf, type_id);
686 while (depth < MAX_RESOLVE_DEPTH &&
687 !btf_type_is_void_or_null(t) &&
688 (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) {
689 type_id = t->type;
690 t = btf__type_by_id(btf, type_id);
691 depth++;
692 }
693
694 if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t))
695 return libbpf_err(-EINVAL);
696
697 return type_id;
698}
699
700__s32 btf__find_by_name(const struct btf *btf, const char *type_name)
701{
702 __u32 i, nr_types = btf__type_cnt(btf);
703
704 if (!strcmp(type_name, "void"))
705 return 0;
706
707 for (i = 1; i < nr_types; i++) {
708 const struct btf_type *t = btf__type_by_id(btf, i);
709 const char *name = btf__name_by_offset(btf, t->name_off);
710
711 if (name && !strcmp(type_name, name))
712 return i;
713 }
714
715 return libbpf_err(-ENOENT);
716}
717
718static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id,
719 const char *type_name, __u32 kind)
720{
721 __u32 i, nr_types = btf__type_cnt(btf);
722
723 if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
724 return 0;
725
726 for (i = start_id; i < nr_types; i++) {
727 const struct btf_type *t = btf__type_by_id(btf, i);
728 const char *name;
729
730 if (btf_kind(t) != kind)
731 continue;
732 name = btf__name_by_offset(btf, t->name_off);
733 if (name && !strcmp(type_name, name))
734 return i;
735 }
736
737 return libbpf_err(-ENOENT);
738}
739
740__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
741 __u32 kind)
742{
743 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind);
744}
745
746__s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
747 __u32 kind)
748{
749 return btf_find_by_name_kind(btf, 1, type_name, kind);
750}
751
752static bool btf_is_modifiable(const struct btf *btf)
753{
754 return (void *)btf->hdr != btf->raw_data;
755}
756
757void btf__free(struct btf *btf)
758{
759 if (IS_ERR_OR_NULL(btf))
760 return;
761
762 if (btf->fd >= 0)
763 close(btf->fd);
764
765 if (btf_is_modifiable(btf)) {
766
767
768
769
770
771
772 free(btf->hdr);
773 free(btf->types_data);
774 strset__free(btf->strs_set);
775 }
776 free(btf->raw_data);
777 free(btf->raw_data_swapped);
778 free(btf->type_offs);
779 free(btf);
780}
781
782static struct btf *btf_new_empty(struct btf *base_btf)
783{
784 struct btf *btf;
785
786 btf = calloc(1, sizeof(*btf));
787 if (!btf)
788 return ERR_PTR(-ENOMEM);
789
790 btf->nr_types = 0;
791 btf->start_id = 1;
792 btf->start_str_off = 0;
793 btf->fd = -1;
794 btf->ptr_sz = sizeof(void *);
795 btf->swapped_endian = false;
796
797 if (base_btf) {
798 btf->base_btf = base_btf;
799 btf->start_id = btf__type_cnt(base_btf);
800 btf->start_str_off = base_btf->hdr->str_len;
801 }
802
803
804 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1);
805 btf->raw_data = calloc(1, btf->raw_size);
806 if (!btf->raw_data) {
807 free(btf);
808 return ERR_PTR(-ENOMEM);
809 }
810
811 btf->hdr = btf->raw_data;
812 btf->hdr->hdr_len = sizeof(struct btf_header);
813 btf->hdr->magic = BTF_MAGIC;
814 btf->hdr->version = BTF_VERSION;
815
816 btf->types_data = btf->raw_data + btf->hdr->hdr_len;
817 btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
818 btf->hdr->str_len = base_btf ? 0 : 1;
819
820 return btf;
821}
822
823struct btf *btf__new_empty(void)
824{
825 return libbpf_ptr(btf_new_empty(NULL));
826}
827
828struct btf *btf__new_empty_split(struct btf *base_btf)
829{
830 return libbpf_ptr(btf_new_empty(base_btf));
831}
832
833static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf)
834{
835 struct btf *btf;
836 int err;
837
838 btf = calloc(1, sizeof(struct btf));
839 if (!btf)
840 return ERR_PTR(-ENOMEM);
841
842 btf->nr_types = 0;
843 btf->start_id = 1;
844 btf->start_str_off = 0;
845 btf->fd = -1;
846
847 if (base_btf) {
848 btf->base_btf = base_btf;
849 btf->start_id = btf__type_cnt(base_btf);
850 btf->start_str_off = base_btf->hdr->str_len;
851 }
852
853 btf->raw_data = malloc(size);
854 if (!btf->raw_data) {
855 err = -ENOMEM;
856 goto done;
857 }
858 memcpy(btf->raw_data, data, size);
859 btf->raw_size = size;
860
861 btf->hdr = btf->raw_data;
862 err = btf_parse_hdr(btf);
863 if (err)
864 goto done;
865
866 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
867 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off;
868
869 err = btf_parse_str_sec(btf);
870 err = err ?: btf_parse_type_sec(btf);
871 if (err)
872 goto done;
873
874done:
875 if (err) {
876 btf__free(btf);
877 return ERR_PTR(err);
878 }
879
880 return btf;
881}
882
883struct btf *btf__new(const void *data, __u32 size)
884{
885 return libbpf_ptr(btf_new(data, size, NULL));
886}
887
888static struct btf *btf_parse_elf(const char *path, struct btf *base_btf,
889 struct btf_ext **btf_ext)
890{
891 Elf_Data *btf_data = NULL, *btf_ext_data = NULL;
892 int err = 0, fd = -1, idx = 0;
893 struct btf *btf = NULL;
894 Elf_Scn *scn = NULL;
895 Elf *elf = NULL;
896 GElf_Ehdr ehdr;
897 size_t shstrndx;
898
899 if (elf_version(EV_CURRENT) == EV_NONE) {
900 pr_warn("failed to init libelf for %s\n", path);
901 return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
902 }
903
904 fd = open(path, O_RDONLY | O_CLOEXEC);
905 if (fd < 0) {
906 err = -errno;
907 pr_warn("failed to open %s: %s\n", path, strerror(errno));
908 return ERR_PTR(err);
909 }
910
911 err = -LIBBPF_ERRNO__FORMAT;
912
913 elf = elf_begin(fd, ELF_C_READ, NULL);
914 if (!elf) {
915 pr_warn("failed to open %s as ELF file\n", path);
916 goto done;
917 }
918 if (!gelf_getehdr(elf, &ehdr)) {
919 pr_warn("failed to get EHDR from %s\n", path);
920 goto done;
921 }
922
923 if (elf_getshdrstrndx(elf, &shstrndx)) {
924 pr_warn("failed to get section names section index for %s\n",
925 path);
926 goto done;
927 }
928
929 if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) {
930 pr_warn("failed to get e_shstrndx from %s\n", path);
931 goto done;
932 }
933
934 while ((scn = elf_nextscn(elf, scn)) != NULL) {
935 GElf_Shdr sh;
936 char *name;
937
938 idx++;
939 if (gelf_getshdr(scn, &sh) != &sh) {
940 pr_warn("failed to get section(%d) header from %s\n",
941 idx, path);
942 goto done;
943 }
944 name = elf_strptr(elf, shstrndx, sh.sh_name);
945 if (!name) {
946 pr_warn("failed to get section(%d) name from %s\n",
947 idx, path);
948 goto done;
949 }
950 if (strcmp(name, BTF_ELF_SEC) == 0) {
951 btf_data = elf_getdata(scn, 0);
952 if (!btf_data) {
953 pr_warn("failed to get section(%d, %s) data from %s\n",
954 idx, name, path);
955 goto done;
956 }
957 continue;
958 } else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) {
959 btf_ext_data = elf_getdata(scn, 0);
960 if (!btf_ext_data) {
961 pr_warn("failed to get section(%d, %s) data from %s\n",
962 idx, name, path);
963 goto done;
964 }
965 continue;
966 }
967 }
968
969 err = 0;
970
971 if (!btf_data) {
972 err = -ENOENT;
973 goto done;
974 }
975 btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf);
976 err = libbpf_get_error(btf);
977 if (err)
978 goto done;
979
980 switch (gelf_getclass(elf)) {
981 case ELFCLASS32:
982 btf__set_pointer_size(btf, 4);
983 break;
984 case ELFCLASS64:
985 btf__set_pointer_size(btf, 8);
986 break;
987 default:
988 pr_warn("failed to get ELF class (bitness) for %s\n", path);
989 break;
990 }
991
992 if (btf_ext && btf_ext_data) {
993 *btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size);
994 err = libbpf_get_error(*btf_ext);
995 if (err)
996 goto done;
997 } else if (btf_ext) {
998 *btf_ext = NULL;
999 }
1000done:
1001 if (elf)
1002 elf_end(elf);
1003 close(fd);
1004
1005 if (!err)
1006 return btf;
1007
1008 if (btf_ext)
1009 btf_ext__free(*btf_ext);
1010 btf__free(btf);
1011
1012 return ERR_PTR(err);
1013}
1014
1015struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1016{
1017 return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1018}
1019
1020struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf)
1021{
1022 return libbpf_ptr(btf_parse_elf(path, base_btf, NULL));
1023}
1024
1025static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
1026{
1027 struct btf *btf = NULL;
1028 void *data = NULL;
1029 FILE *f = NULL;
1030 __u16 magic;
1031 int err = 0;
1032 long sz;
1033
1034 f = fopen(path, "rb");
1035 if (!f) {
1036 err = -errno;
1037 goto err_out;
1038 }
1039
1040
1041 if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) {
1042 err = -EIO;
1043 goto err_out;
1044 }
1045 if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) {
1046
1047 err = -EPROTO;
1048 goto err_out;
1049 }
1050
1051
1052 if (fseek(f, 0, SEEK_END)) {
1053 err = -errno;
1054 goto err_out;
1055 }
1056 sz = ftell(f);
1057 if (sz < 0) {
1058 err = -errno;
1059 goto err_out;
1060 }
1061
1062 if (fseek(f, 0, SEEK_SET)) {
1063 err = -errno;
1064 goto err_out;
1065 }
1066
1067
1068 data = malloc(sz);
1069 if (!data) {
1070 err = -ENOMEM;
1071 goto err_out;
1072 }
1073 if (fread(data, 1, sz, f) < sz) {
1074 err = -EIO;
1075 goto err_out;
1076 }
1077
1078
1079 btf = btf_new(data, sz, base_btf);
1080
1081err_out:
1082 free(data);
1083 if (f)
1084 fclose(f);
1085 return err ? ERR_PTR(err) : btf;
1086}
1087
1088struct btf *btf__parse_raw(const char *path)
1089{
1090 return libbpf_ptr(btf_parse_raw(path, NULL));
1091}
1092
1093struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf)
1094{
1095 return libbpf_ptr(btf_parse_raw(path, base_btf));
1096}
1097
1098static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1099{
1100 struct btf *btf;
1101 int err;
1102
1103 if (btf_ext)
1104 *btf_ext = NULL;
1105
1106 btf = btf_parse_raw(path, base_btf);
1107 err = libbpf_get_error(btf);
1108 if (!err)
1109 return btf;
1110 if (err != -EPROTO)
1111 return ERR_PTR(err);
1112 return btf_parse_elf(path, base_btf, btf_ext);
1113}
1114
1115struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1116{
1117 return libbpf_ptr(btf_parse(path, NULL, btf_ext));
1118}
1119
1120struct btf *btf__parse_split(const char *path, struct btf *base_btf)
1121{
1122 return libbpf_ptr(btf_parse(path, base_btf, NULL));
1123}
1124
1125static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1126
1127int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level)
1128{
1129 LIBBPF_OPTS(bpf_btf_load_opts, opts);
1130 __u32 buf_sz = 0, raw_size;
1131 char *buf = NULL, *tmp;
1132 void *raw_data;
1133 int err = 0;
1134
1135 if (btf->fd >= 0)
1136 return libbpf_err(-EEXIST);
1137 if (log_sz && !log_buf)
1138 return libbpf_err(-EINVAL);
1139
1140
1141 raw_data = btf_get_raw_data(btf, &raw_size, false);
1142 if (!raw_data) {
1143 err = -ENOMEM;
1144 goto done;
1145 }
1146 btf->raw_size = raw_size;
1147 btf->raw_data = raw_data;
1148
1149retry_load:
1150
1151
1152
1153
1154
1155
1156 if (log_level) {
1157
1158
1159
1160
1161 if (!log_buf) {
1162 buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2);
1163 tmp = realloc(buf, buf_sz);
1164 if (!tmp) {
1165 err = -ENOMEM;
1166 goto done;
1167 }
1168 buf = tmp;
1169 buf[0] = '\0';
1170 }
1171
1172 opts.log_buf = log_buf ? log_buf : buf;
1173 opts.log_size = log_buf ? log_sz : buf_sz;
1174 opts.log_level = log_level;
1175 }
1176
1177 btf->fd = bpf_btf_load(raw_data, raw_size, &opts);
1178 if (btf->fd < 0) {
1179
1180 if (log_level == 0) {
1181 log_level = 1;
1182 goto retry_load;
1183 }
1184
1185
1186
1187 if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2)
1188 goto retry_load;
1189
1190 err = -errno;
1191 pr_warn("BTF loading error: %d\n", err);
1192
1193 if (!log_buf && buf[0])
1194 pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf);
1195 }
1196
1197done:
1198 free(buf);
1199 return libbpf_err(err);
1200}
1201
1202int btf__load_into_kernel(struct btf *btf)
1203{
1204 return btf_load_into_kernel(btf, NULL, 0, 0);
1205}
1206
1207int btf__load(struct btf *) __attribute__((alias("btf__load_into_kernel")));
1208
1209int btf__fd(const struct btf *btf)
1210{
1211 return btf->fd;
1212}
1213
1214void btf__set_fd(struct btf *btf, int fd)
1215{
1216 btf->fd = fd;
1217}
1218
1219static const void *btf_strs_data(const struct btf *btf)
1220{
1221 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set);
1222}
1223
1224static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian)
1225{
1226 struct btf_header *hdr = btf->hdr;
1227 struct btf_type *t;
1228 void *data, *p;
1229 __u32 data_sz;
1230 int i;
1231
1232 data = swap_endian ? btf->raw_data_swapped : btf->raw_data;
1233 if (data) {
1234 *size = btf->raw_size;
1235 return data;
1236 }
1237
1238 data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len;
1239 data = calloc(1, data_sz);
1240 if (!data)
1241 return NULL;
1242 p = data;
1243
1244 memcpy(p, hdr, hdr->hdr_len);
1245 if (swap_endian)
1246 btf_bswap_hdr(p);
1247 p += hdr->hdr_len;
1248
1249 memcpy(p, btf->types_data, hdr->type_len);
1250 if (swap_endian) {
1251 for (i = 0; i < btf->nr_types; i++) {
1252 t = p + btf->type_offs[i];
1253
1254
1255
1256
1257 if (btf_bswap_type_rest(t))
1258 goto err_out;
1259 btf_bswap_type_base(t);
1260 }
1261 }
1262 p += hdr->type_len;
1263
1264 memcpy(p, btf_strs_data(btf), hdr->str_len);
1265 p += hdr->str_len;
1266
1267 *size = data_sz;
1268 return data;
1269err_out:
1270 free(data);
1271 return NULL;
1272}
1273
1274const void *btf__raw_data(const struct btf *btf_ro, __u32 *size)
1275{
1276 struct btf *btf = (struct btf *)btf_ro;
1277 __u32 data_sz;
1278 void *data;
1279
1280 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian);
1281 if (!data)
1282 return errno = ENOMEM, NULL;
1283
1284 btf->raw_size = data_sz;
1285 if (btf->swapped_endian)
1286 btf->raw_data_swapped = data;
1287 else
1288 btf->raw_data = data;
1289 *size = data_sz;
1290 return data;
1291}
1292
1293__attribute__((alias("btf__raw_data")))
1294const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1295
1296const char *btf__str_by_offset(const struct btf *btf, __u32 offset)
1297{
1298 if (offset < btf->start_str_off)
1299 return btf__str_by_offset(btf->base_btf, offset);
1300 else if (offset - btf->start_str_off < btf->hdr->str_len)
1301 return btf_strs_data(btf) + (offset - btf->start_str_off);
1302 else
1303 return errno = EINVAL, NULL;
1304}
1305
1306const char *btf__name_by_offset(const struct btf *btf, __u32 offset)
1307{
1308 return btf__str_by_offset(btf, offset);
1309}
1310
1311struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf)
1312{
1313 struct bpf_btf_info btf_info;
1314 __u32 len = sizeof(btf_info);
1315 __u32 last_size;
1316 struct btf *btf;
1317 void *ptr;
1318 int err;
1319
1320
1321
1322
1323
1324 last_size = 4096;
1325 ptr = malloc(last_size);
1326 if (!ptr)
1327 return ERR_PTR(-ENOMEM);
1328
1329 memset(&btf_info, 0, sizeof(btf_info));
1330 btf_info.btf = ptr_to_u64(ptr);
1331 btf_info.btf_size = last_size;
1332 err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1333
1334 if (!err && btf_info.btf_size > last_size) {
1335 void *temp_ptr;
1336
1337 last_size = btf_info.btf_size;
1338 temp_ptr = realloc(ptr, last_size);
1339 if (!temp_ptr) {
1340 btf = ERR_PTR(-ENOMEM);
1341 goto exit_free;
1342 }
1343 ptr = temp_ptr;
1344
1345 len = sizeof(btf_info);
1346 memset(&btf_info, 0, sizeof(btf_info));
1347 btf_info.btf = ptr_to_u64(ptr);
1348 btf_info.btf_size = last_size;
1349
1350 err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1351 }
1352
1353 if (err || btf_info.btf_size > last_size) {
1354 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG);
1355 goto exit_free;
1356 }
1357
1358 btf = btf_new(ptr, btf_info.btf_size, base_btf);
1359
1360exit_free:
1361 free(ptr);
1362 return btf;
1363}
1364
1365struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf)
1366{
1367 struct btf *btf;
1368 int btf_fd;
1369
1370 btf_fd = bpf_btf_get_fd_by_id(id);
1371 if (btf_fd < 0)
1372 return libbpf_err_ptr(-errno);
1373
1374 btf = btf_get_from_fd(btf_fd, base_btf);
1375 close(btf_fd);
1376
1377 return libbpf_ptr(btf);
1378}
1379
1380struct btf *btf__load_from_kernel_by_id(__u32 id)
1381{
1382 return btf__load_from_kernel_by_id_split(id, NULL);
1383}
1384
1385int btf__get_from_id(__u32 id, struct btf **btf)
1386{
1387 struct btf *res;
1388 int err;
1389
1390 *btf = NULL;
1391 res = btf__load_from_kernel_by_id(id);
1392 err = libbpf_get_error(res);
1393
1394 if (err)
1395 return libbpf_err(err);
1396
1397 *btf = res;
1398 return 0;
1399}
1400
1401int btf__get_map_kv_tids(const struct btf *btf, const char *map_name,
1402 __u32 expected_key_size, __u32 expected_value_size,
1403 __u32 *key_type_id, __u32 *value_type_id)
1404{
1405 const struct btf_type *container_type;
1406 const struct btf_member *key, *value;
1407 const size_t max_name = 256;
1408 char container_name[max_name];
1409 __s64 key_size, value_size;
1410 __s32 container_id;
1411
1412 if (snprintf(container_name, max_name, "____btf_map_%s", map_name) == max_name) {
1413 pr_warn("map:%s length of '____btf_map_%s' is too long\n",
1414 map_name, map_name);
1415 return libbpf_err(-EINVAL);
1416 }
1417
1418 container_id = btf__find_by_name(btf, container_name);
1419 if (container_id < 0) {
1420 pr_debug("map:%s container_name:%s cannot be found in BTF. Missing BPF_ANNOTATE_KV_PAIR?\n",
1421 map_name, container_name);
1422 return libbpf_err(container_id);
1423 }
1424
1425 container_type = btf__type_by_id(btf, container_id);
1426 if (!container_type) {
1427 pr_warn("map:%s cannot find BTF type for container_id:%u\n",
1428 map_name, container_id);
1429 return libbpf_err(-EINVAL);
1430 }
1431
1432 if (!btf_is_struct(container_type) || btf_vlen(container_type) < 2) {
1433 pr_warn("map:%s container_name:%s is an invalid container struct\n",
1434 map_name, container_name);
1435 return libbpf_err(-EINVAL);
1436 }
1437
1438 key = btf_members(container_type);
1439 value = key + 1;
1440
1441 key_size = btf__resolve_size(btf, key->type);
1442 if (key_size < 0) {
1443 pr_warn("map:%s invalid BTF key_type_size\n", map_name);
1444 return libbpf_err(key_size);
1445 }
1446
1447 if (expected_key_size != key_size) {
1448 pr_warn("map:%s btf_key_type_size:%u != map_def_key_size:%u\n",
1449 map_name, (__u32)key_size, expected_key_size);
1450 return libbpf_err(-EINVAL);
1451 }
1452
1453 value_size = btf__resolve_size(btf, value->type);
1454 if (value_size < 0) {
1455 pr_warn("map:%s invalid BTF value_type_size\n", map_name);
1456 return libbpf_err(value_size);
1457 }
1458
1459 if (expected_value_size != value_size) {
1460 pr_warn("map:%s btf_value_type_size:%u != map_def_value_size:%u\n",
1461 map_name, (__u32)value_size, expected_value_size);
1462 return libbpf_err(-EINVAL);
1463 }
1464
1465 *key_type_id = key->type;
1466 *value_type_id = value->type;
1467
1468 return 0;
1469}
1470
1471static void btf_invalidate_raw_data(struct btf *btf)
1472{
1473 if (btf->raw_data) {
1474 free(btf->raw_data);
1475 btf->raw_data = NULL;
1476 }
1477 if (btf->raw_data_swapped) {
1478 free(btf->raw_data_swapped);
1479 btf->raw_data_swapped = NULL;
1480 }
1481}
1482
1483
1484
1485
1486
1487static int btf_ensure_modifiable(struct btf *btf)
1488{
1489 void *hdr, *types;
1490 struct strset *set = NULL;
1491 int err = -ENOMEM;
1492
1493 if (btf_is_modifiable(btf)) {
1494
1495 btf_invalidate_raw_data(btf);
1496 return 0;
1497 }
1498
1499
1500 hdr = malloc(btf->hdr->hdr_len);
1501 types = malloc(btf->hdr->type_len);
1502 if (!hdr || !types)
1503 goto err_out;
1504
1505 memcpy(hdr, btf->hdr, btf->hdr->hdr_len);
1506 memcpy(types, btf->types_data, btf->hdr->type_len);
1507
1508
1509 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len);
1510 if (IS_ERR(set)) {
1511 err = PTR_ERR(set);
1512 goto err_out;
1513 }
1514
1515
1516 btf->hdr = hdr;
1517 btf->types_data = types;
1518 btf->types_data_cap = btf->hdr->type_len;
1519 btf->strs_data = NULL;
1520 btf->strs_set = set;
1521
1522
1523
1524 if (btf->hdr->str_len == 0)
1525 btf->strs_deduped = true;
1526 if (!btf->base_btf && btf->hdr->str_len == 1)
1527 btf->strs_deduped = true;
1528
1529
1530 btf_invalidate_raw_data(btf);
1531
1532 return 0;
1533
1534err_out:
1535 strset__free(set);
1536 free(hdr);
1537 free(types);
1538 return err;
1539}
1540
1541
1542
1543
1544
1545
1546
1547int btf__find_str(struct btf *btf, const char *s)
1548{
1549 int off;
1550
1551 if (btf->base_btf) {
1552 off = btf__find_str(btf->base_btf, s);
1553 if (off != -ENOENT)
1554 return off;
1555 }
1556
1557
1558 if (btf_ensure_modifiable(btf))
1559 return libbpf_err(-ENOMEM);
1560
1561 off = strset__find_str(btf->strs_set, s);
1562 if (off < 0)
1563 return libbpf_err(off);
1564
1565 return btf->start_str_off + off;
1566}
1567
1568
1569
1570
1571
1572
1573int btf__add_str(struct btf *btf, const char *s)
1574{
1575 int off;
1576
1577 if (btf->base_btf) {
1578 off = btf__find_str(btf->base_btf, s);
1579 if (off != -ENOENT)
1580 return off;
1581 }
1582
1583 if (btf_ensure_modifiable(btf))
1584 return libbpf_err(-ENOMEM);
1585
1586 off = strset__add_str(btf->strs_set, s);
1587 if (off < 0)
1588 return libbpf_err(off);
1589
1590 btf->hdr->str_len = strset__data_size(btf->strs_set);
1591
1592 return btf->start_str_off + off;
1593}
1594
1595static void *btf_add_type_mem(struct btf *btf, size_t add_sz)
1596{
1597 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1,
1598 btf->hdr->type_len, UINT_MAX, add_sz);
1599}
1600
1601static void btf_type_inc_vlen(struct btf_type *t)
1602{
1603 t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
1604}
1605
1606static int btf_commit_type(struct btf *btf, int data_sz)
1607{
1608 int err;
1609
1610 err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
1611 if (err)
1612 return libbpf_err(err);
1613
1614 btf->hdr->type_len += data_sz;
1615 btf->hdr->str_off += data_sz;
1616 btf->nr_types++;
1617 return btf->start_id + btf->nr_types - 1;
1618}
1619
1620struct btf_pipe {
1621 const struct btf *src;
1622 struct btf *dst;
1623 struct hashmap *str_off_map;
1624};
1625
1626static int btf_rewrite_str(__u32 *str_off, void *ctx)
1627{
1628 struct btf_pipe *p = ctx;
1629 void *mapped_off;
1630 int off, err;
1631
1632 if (!*str_off)
1633 return 0;
1634
1635 if (p->str_off_map &&
1636 hashmap__find(p->str_off_map, (void *)(long)*str_off, &mapped_off)) {
1637 *str_off = (__u32)(long)mapped_off;
1638 return 0;
1639 }
1640
1641 off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
1642 if (off < 0)
1643 return off;
1644
1645
1646
1647
1648 if (p->str_off_map) {
1649 err = hashmap__append(p->str_off_map, (void *)(long)*str_off, (void *)(long)off);
1650 if (err)
1651 return err;
1652 }
1653
1654 *str_off = off;
1655 return 0;
1656}
1657
1658int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
1659{
1660 struct btf_pipe p = { .src = src_btf, .dst = btf };
1661 struct btf_type *t;
1662 int sz, err;
1663
1664 sz = btf_type_size(src_type);
1665 if (sz < 0)
1666 return libbpf_err(sz);
1667
1668
1669 if (btf_ensure_modifiable(btf))
1670 return libbpf_err(-ENOMEM);
1671
1672 t = btf_add_type_mem(btf, sz);
1673 if (!t)
1674 return libbpf_err(-ENOMEM);
1675
1676 memcpy(t, src_type, sz);
1677
1678 err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1679 if (err)
1680 return libbpf_err(err);
1681
1682 return btf_commit_type(btf, sz);
1683}
1684
1685static int btf_rewrite_type_ids(__u32 *type_id, void *ctx)
1686{
1687 struct btf *btf = ctx;
1688
1689 if (!*type_id)
1690 return 0;
1691
1692
1693
1694
1695
1696 *type_id += btf->start_id + btf->nr_types - 1;
1697 return 0;
1698}
1699
1700static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx);
1701static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx);
1702
1703int btf__add_btf(struct btf *btf, const struct btf *src_btf)
1704{
1705 struct btf_pipe p = { .src = src_btf, .dst = btf };
1706 int data_sz, sz, cnt, i, err, old_strs_len;
1707 __u32 *off;
1708 void *t;
1709
1710
1711 if (src_btf->base_btf)
1712 return libbpf_err(-ENOTSUP);
1713
1714
1715 if (btf_ensure_modifiable(btf))
1716 return libbpf_err(-ENOMEM);
1717
1718
1719
1720
1721 old_strs_len = btf->hdr->str_len;
1722
1723 data_sz = src_btf->hdr->type_len;
1724 cnt = btf__type_cnt(src_btf) - 1;
1725
1726
1727 t = btf_add_type_mem(btf, data_sz);
1728 if (!t)
1729 return libbpf_err(-ENOMEM);
1730
1731
1732 off = btf_add_type_offs_mem(btf, cnt);
1733 if (!off)
1734 return libbpf_err(-ENOMEM);
1735
1736
1737 p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
1738 if (IS_ERR(p.str_off_map))
1739 return libbpf_err(-ENOMEM);
1740
1741
1742 memcpy(t, src_btf->types_data, data_sz);
1743
1744 for (i = 0; i < cnt; i++) {
1745 sz = btf_type_size(t);
1746 if (sz < 0) {
1747
1748 err = sz;
1749 goto err_out;
1750 }
1751
1752
1753 *off = t - btf->types_data;
1754
1755
1756 err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1757 if (err)
1758 goto err_out;
1759
1760
1761 err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf);
1762 if (err)
1763 goto err_out;
1764
1765
1766 t += sz;
1767 off++;
1768 }
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778 btf->hdr->type_len += data_sz;
1779 btf->hdr->str_off += data_sz;
1780 btf->nr_types += cnt;
1781
1782 hashmap__free(p.str_off_map);
1783
1784
1785 return btf->start_id + btf->nr_types - cnt;
1786err_out:
1787
1788
1789
1790 memset(btf->types_data + btf->hdr->type_len, 0, data_sz);
1791 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len);
1792
1793
1794
1795 btf->hdr->str_len = old_strs_len;
1796
1797 hashmap__free(p.str_off_map);
1798
1799 return libbpf_err(err);
1800}
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
1812{
1813 struct btf_type *t;
1814 int sz, name_off;
1815
1816
1817 if (!name || !name[0])
1818 return libbpf_err(-EINVAL);
1819
1820 if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16)
1821 return libbpf_err(-EINVAL);
1822 if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL))
1823 return libbpf_err(-EINVAL);
1824
1825
1826 if (btf_ensure_modifiable(btf))
1827 return libbpf_err(-ENOMEM);
1828
1829 sz = sizeof(struct btf_type) + sizeof(int);
1830 t = btf_add_type_mem(btf, sz);
1831 if (!t)
1832 return libbpf_err(-ENOMEM);
1833
1834
1835
1836
1837
1838 name_off = btf__add_str(btf, name);
1839 if (name_off < 0)
1840 return name_off;
1841
1842 t->name_off = name_off;
1843 t->info = btf_type_info(BTF_KIND_INT, 0, 0);
1844 t->size = byte_sz;
1845
1846 *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
1847
1848 return btf_commit_type(btf, sz);
1849}
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859int btf__add_float(struct btf *btf, const char *name, size_t byte_sz)
1860{
1861 struct btf_type *t;
1862 int sz, name_off;
1863
1864
1865 if (!name || !name[0])
1866 return libbpf_err(-EINVAL);
1867
1868
1869 if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 &&
1870 byte_sz != 16)
1871 return libbpf_err(-EINVAL);
1872
1873 if (btf_ensure_modifiable(btf))
1874 return libbpf_err(-ENOMEM);
1875
1876 sz = sizeof(struct btf_type);
1877 t = btf_add_type_mem(btf, sz);
1878 if (!t)
1879 return libbpf_err(-ENOMEM);
1880
1881 name_off = btf__add_str(btf, name);
1882 if (name_off < 0)
1883 return name_off;
1884
1885 t->name_off = name_off;
1886 t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
1887 t->size = byte_sz;
1888
1889 return btf_commit_type(btf, sz);
1890}
1891
1892
1893
1894
1895
1896static int validate_type_id(int id)
1897{
1898 if (id < 0 || id > BTF_MAX_NR_TYPES)
1899 return -EINVAL;
1900 return 0;
1901}
1902
1903
1904static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
1905{
1906 struct btf_type *t;
1907 int sz, name_off = 0;
1908
1909 if (validate_type_id(ref_type_id))
1910 return libbpf_err(-EINVAL);
1911
1912 if (btf_ensure_modifiable(btf))
1913 return libbpf_err(-ENOMEM);
1914
1915 sz = sizeof(struct btf_type);
1916 t = btf_add_type_mem(btf, sz);
1917 if (!t)
1918 return libbpf_err(-ENOMEM);
1919
1920 if (name && name[0]) {
1921 name_off = btf__add_str(btf, name);
1922 if (name_off < 0)
1923 return name_off;
1924 }
1925
1926 t->name_off = name_off;
1927 t->info = btf_type_info(kind, 0, 0);
1928 t->type = ref_type_id;
1929
1930 return btf_commit_type(btf, sz);
1931}
1932
1933
1934
1935
1936
1937
1938
1939
1940int btf__add_ptr(struct btf *btf, int ref_type_id)
1941{
1942 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
1943}
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems)
1955{
1956 struct btf_type *t;
1957 struct btf_array *a;
1958 int sz;
1959
1960 if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
1961 return libbpf_err(-EINVAL);
1962
1963 if (btf_ensure_modifiable(btf))
1964 return libbpf_err(-ENOMEM);
1965
1966 sz = sizeof(struct btf_type) + sizeof(struct btf_array);
1967 t = btf_add_type_mem(btf, sz);
1968 if (!t)
1969 return libbpf_err(-ENOMEM);
1970
1971 t->name_off = 0;
1972 t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0);
1973 t->size = 0;
1974
1975 a = btf_array(t);
1976 a->type = elem_type_id;
1977 a->index_type = index_type_id;
1978 a->nelems = nr_elems;
1979
1980 return btf_commit_type(btf, sz);
1981}
1982
1983
1984static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
1985{
1986 struct btf_type *t;
1987 int sz, name_off = 0;
1988
1989 if (btf_ensure_modifiable(btf))
1990 return libbpf_err(-ENOMEM);
1991
1992 sz = sizeof(struct btf_type);
1993 t = btf_add_type_mem(btf, sz);
1994 if (!t)
1995 return libbpf_err(-ENOMEM);
1996
1997 if (name && name[0]) {
1998 name_off = btf__add_str(btf, name);
1999 if (name_off < 0)
2000 return name_off;
2001 }
2002
2003
2004
2005
2006 t->name_off = name_off;
2007 t->info = btf_type_info(kind, 0, 0);
2008 t->size = bytes_sz;
2009
2010 return btf_commit_type(btf, sz);
2011}
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz)
2026{
2027 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz);
2028}
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz)
2044{
2045 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
2046}
2047
2048static struct btf_type *btf_last_type(struct btf *btf)
2049{
2050 return btf_type_by_id(btf, btf__type_cnt(btf) - 1);
2051}
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063int btf__add_field(struct btf *btf, const char *name, int type_id,
2064 __u32 bit_offset, __u32 bit_size)
2065{
2066 struct btf_type *t;
2067 struct btf_member *m;
2068 bool is_bitfield;
2069 int sz, name_off = 0;
2070
2071
2072 if (btf->nr_types == 0)
2073 return libbpf_err(-EINVAL);
2074 t = btf_last_type(btf);
2075 if (!btf_is_composite(t))
2076 return libbpf_err(-EINVAL);
2077
2078 if (validate_type_id(type_id))
2079 return libbpf_err(-EINVAL);
2080
2081 is_bitfield = bit_size || (bit_offset % 8 != 0);
2082 if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff))
2083 return libbpf_err(-EINVAL);
2084
2085
2086 if (btf_is_union(t) && bit_offset)
2087 return libbpf_err(-EINVAL);
2088
2089
2090 if (btf_ensure_modifiable(btf))
2091 return libbpf_err(-ENOMEM);
2092
2093 sz = sizeof(struct btf_member);
2094 m = btf_add_type_mem(btf, sz);
2095 if (!m)
2096 return libbpf_err(-ENOMEM);
2097
2098 if (name && name[0]) {
2099 name_off = btf__add_str(btf, name);
2100 if (name_off < 0)
2101 return name_off;
2102 }
2103
2104 m->name_off = name_off;
2105 m->type = type_id;
2106 m->offset = bit_offset | (bit_size << 24);
2107
2108
2109 t = btf_last_type(btf);
2110
2111 t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
2112
2113 btf->hdr->type_len += sz;
2114 btf->hdr->str_off += sz;
2115 return 0;
2116}
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
2132{
2133 struct btf_type *t;
2134 int sz, name_off = 0;
2135
2136
2137 if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
2138 return libbpf_err(-EINVAL);
2139
2140 if (btf_ensure_modifiable(btf))
2141 return libbpf_err(-ENOMEM);
2142
2143 sz = sizeof(struct btf_type);
2144 t = btf_add_type_mem(btf, sz);
2145 if (!t)
2146 return libbpf_err(-ENOMEM);
2147
2148 if (name && name[0]) {
2149 name_off = btf__add_str(btf, name);
2150 if (name_off < 0)
2151 return name_off;
2152 }
2153
2154
2155 t->name_off = name_off;
2156 t->info = btf_type_info(BTF_KIND_ENUM, 0, 0);
2157 t->size = byte_sz;
2158
2159 return btf_commit_type(btf, sz);
2160}
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170int btf__add_enum_value(struct btf *btf, const char *name, __s64 value)
2171{
2172 struct btf_type *t;
2173 struct btf_enum *v;
2174 int sz, name_off;
2175
2176
2177 if (btf->nr_types == 0)
2178 return libbpf_err(-EINVAL);
2179 t = btf_last_type(btf);
2180 if (!btf_is_enum(t))
2181 return libbpf_err(-EINVAL);
2182
2183
2184 if (!name || !name[0])
2185 return libbpf_err(-EINVAL);
2186 if (value < INT_MIN || value > UINT_MAX)
2187 return libbpf_err(-E2BIG);
2188
2189
2190 if (btf_ensure_modifiable(btf))
2191 return libbpf_err(-ENOMEM);
2192
2193 sz = sizeof(struct btf_enum);
2194 v = btf_add_type_mem(btf, sz);
2195 if (!v)
2196 return libbpf_err(-ENOMEM);
2197
2198 name_off = btf__add_str(btf, name);
2199 if (name_off < 0)
2200 return name_off;
2201
2202 v->name_off = name_off;
2203 v->val = value;
2204
2205
2206 t = btf_last_type(btf);
2207 btf_type_inc_vlen(t);
2208
2209 btf->hdr->type_len += sz;
2210 btf->hdr->str_off += sz;
2211 return 0;
2212}
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
2224{
2225 if (!name || !name[0])
2226 return libbpf_err(-EINVAL);
2227
2228 switch (fwd_kind) {
2229 case BTF_FWD_STRUCT:
2230 case BTF_FWD_UNION: {
2231 struct btf_type *t;
2232 int id;
2233
2234 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
2235 if (id <= 0)
2236 return id;
2237 t = btf_type_by_id(btf, id);
2238 t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION);
2239 return id;
2240 }
2241 case BTF_FWD_ENUM:
2242
2243
2244
2245 return btf__add_enum(btf, name, sizeof(int));
2246 default:
2247 return libbpf_err(-EINVAL);
2248 }
2249}
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
2260{
2261 if (!name || !name[0])
2262 return libbpf_err(-EINVAL);
2263
2264 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
2265}
2266
2267
2268
2269
2270
2271
2272
2273
2274int btf__add_volatile(struct btf *btf, int ref_type_id)
2275{
2276 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
2277}
2278
2279
2280
2281
2282
2283
2284
2285
2286int btf__add_const(struct btf *btf, int ref_type_id)
2287{
2288 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
2289}
2290
2291
2292
2293
2294
2295
2296
2297
2298int btf__add_restrict(struct btf *btf, int ref_type_id)
2299{
2300 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
2301}
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
2312{
2313 if (!value|| !value[0])
2314 return libbpf_err(-EINVAL);
2315
2316 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
2317}
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327int btf__add_func(struct btf *btf, const char *name,
2328 enum btf_func_linkage linkage, int proto_type_id)
2329{
2330 int id;
2331
2332 if (!name || !name[0])
2333 return libbpf_err(-EINVAL);
2334 if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL &&
2335 linkage != BTF_FUNC_EXTERN)
2336 return libbpf_err(-EINVAL);
2337
2338 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
2339 if (id > 0) {
2340 struct btf_type *t = btf_type_by_id(btf, id);
2341
2342 t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0);
2343 }
2344 return libbpf_err(id);
2345}
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359int btf__add_func_proto(struct btf *btf, int ret_type_id)
2360{
2361 struct btf_type *t;
2362 int sz;
2363
2364 if (validate_type_id(ret_type_id))
2365 return libbpf_err(-EINVAL);
2366
2367 if (btf_ensure_modifiable(btf))
2368 return libbpf_err(-ENOMEM);
2369
2370 sz = sizeof(struct btf_type);
2371 t = btf_add_type_mem(btf, sz);
2372 if (!t)
2373 return libbpf_err(-ENOMEM);
2374
2375
2376
2377
2378 t->name_off = 0;
2379 t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
2380 t->type = ret_type_id;
2381
2382 return btf_commit_type(btf, sz);
2383}
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393int btf__add_func_param(struct btf *btf, const char *name, int type_id)
2394{
2395 struct btf_type *t;
2396 struct btf_param *p;
2397 int sz, name_off = 0;
2398
2399 if (validate_type_id(type_id))
2400 return libbpf_err(-EINVAL);
2401
2402
2403 if (btf->nr_types == 0)
2404 return libbpf_err(-EINVAL);
2405 t = btf_last_type(btf);
2406 if (!btf_is_func_proto(t))
2407 return libbpf_err(-EINVAL);
2408
2409
2410 if (btf_ensure_modifiable(btf))
2411 return libbpf_err(-ENOMEM);
2412
2413 sz = sizeof(struct btf_param);
2414 p = btf_add_type_mem(btf, sz);
2415 if (!p)
2416 return libbpf_err(-ENOMEM);
2417
2418 if (name && name[0]) {
2419 name_off = btf__add_str(btf, name);
2420 if (name_off < 0)
2421 return name_off;
2422 }
2423
2424 p->name_off = name_off;
2425 p->type = type_id;
2426
2427
2428 t = btf_last_type(btf);
2429 btf_type_inc_vlen(t);
2430
2431 btf->hdr->type_len += sz;
2432 btf->hdr->str_off += sz;
2433 return 0;
2434}
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id)
2447{
2448 struct btf_type *t;
2449 struct btf_var *v;
2450 int sz, name_off;
2451
2452
2453 if (!name || !name[0])
2454 return libbpf_err(-EINVAL);
2455 if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED &&
2456 linkage != BTF_VAR_GLOBAL_EXTERN)
2457 return libbpf_err(-EINVAL);
2458 if (validate_type_id(type_id))
2459 return libbpf_err(-EINVAL);
2460
2461
2462 if (btf_ensure_modifiable(btf))
2463 return libbpf_err(-ENOMEM);
2464
2465 sz = sizeof(struct btf_type) + sizeof(struct btf_var);
2466 t = btf_add_type_mem(btf, sz);
2467 if (!t)
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 t->name_off = name_off;
2475 t->info = btf_type_info(BTF_KIND_VAR, 0, 0);
2476 t->type = type_id;
2477
2478 v = btf_var(t);
2479 v->linkage = linkage;
2480
2481 return btf_commit_type(btf, sz);
2482}
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
2497{
2498 struct btf_type *t;
2499 int sz, name_off;
2500
2501
2502 if (!name || !name[0])
2503 return libbpf_err(-EINVAL);
2504
2505 if (btf_ensure_modifiable(btf))
2506 return libbpf_err(-ENOMEM);
2507
2508 sz = sizeof(struct btf_type);
2509 t = btf_add_type_mem(btf, sz);
2510 if (!t)
2511 return libbpf_err(-ENOMEM);
2512
2513 name_off = btf__add_str(btf, name);
2514 if (name_off < 0)
2515 return name_off;
2516
2517
2518 t->name_off = name_off;
2519 t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
2520 t->size = byte_sz;
2521
2522 return btf_commit_type(btf, sz);
2523}
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz)
2536{
2537 struct btf_type *t;
2538 struct btf_var_secinfo *v;
2539 int sz;
2540
2541
2542 if (btf->nr_types == 0)
2543 return libbpf_err(-EINVAL);
2544 t = btf_last_type(btf);
2545 if (!btf_is_datasec(t))
2546 return libbpf_err(-EINVAL);
2547
2548 if (validate_type_id(var_type_id))
2549 return libbpf_err(-EINVAL);
2550
2551
2552 if (btf_ensure_modifiable(btf))
2553 return libbpf_err(-ENOMEM);
2554
2555 sz = sizeof(struct btf_var_secinfo);
2556 v = btf_add_type_mem(btf, sz);
2557 if (!v)
2558 return libbpf_err(-ENOMEM);
2559
2560 v->type = var_type_id;
2561 v->offset = offset;
2562 v->size = byte_sz;
2563
2564
2565 t = btf_last_type(btf);
2566 btf_type_inc_vlen(t);
2567
2568 btf->hdr->type_len += sz;
2569 btf->hdr->str_off += sz;
2570 return 0;
2571}
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
2584 int component_idx)
2585{
2586 struct btf_type *t;
2587 int sz, value_off;
2588
2589 if (!value || !value[0] || component_idx < -1)
2590 return libbpf_err(-EINVAL);
2591
2592 if (validate_type_id(ref_type_id))
2593 return libbpf_err(-EINVAL);
2594
2595 if (btf_ensure_modifiable(btf))
2596 return libbpf_err(-ENOMEM);
2597
2598 sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag);
2599 t = btf_add_type_mem(btf, sz);
2600 if (!t)
2601 return libbpf_err(-ENOMEM);
2602
2603 value_off = btf__add_str(btf, value);
2604 if (value_off < 0)
2605 return value_off;
2606
2607 t->name_off = value_off;
2608 t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
2609 t->type = ref_type_id;
2610 btf_decl_tag(t)->component_idx = component_idx;
2611
2612 return btf_commit_type(btf, sz);
2613}
2614
2615struct btf_ext_sec_setup_param {
2616 __u32 off;
2617 __u32 len;
2618 __u32 min_rec_size;
2619 struct btf_ext_info *ext_info;
2620 const char *desc;
2621};
2622
2623static int btf_ext_setup_info(struct btf_ext *btf_ext,
2624 struct btf_ext_sec_setup_param *ext_sec)
2625{
2626 const struct btf_ext_info_sec *sinfo;
2627 struct btf_ext_info *ext_info;
2628 __u32 info_left, record_size;
2629 size_t sec_cnt = 0;
2630
2631 void *info;
2632
2633 if (ext_sec->len == 0)
2634 return 0;
2635
2636 if (ext_sec->off & 0x03) {
2637 pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n",
2638 ext_sec->desc);
2639 return -EINVAL;
2640 }
2641
2642 info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
2643 info_left = ext_sec->len;
2644
2645 if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
2646 pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n",
2647 ext_sec->desc, ext_sec->off, ext_sec->len);
2648 return -EINVAL;
2649 }
2650
2651
2652 if (info_left < sizeof(__u32)) {
2653 pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc);
2654 return -EINVAL;
2655 }
2656
2657
2658 record_size = *(__u32 *)info;
2659 if (record_size < ext_sec->min_rec_size ||
2660 record_size & 0x03) {
2661 pr_debug("%s section in .BTF.ext has invalid record size %u\n",
2662 ext_sec->desc, record_size);
2663 return -EINVAL;
2664 }
2665
2666 sinfo = info + sizeof(__u32);
2667 info_left -= sizeof(__u32);
2668
2669
2670 if (!info_left) {
2671 pr_debug("%s section in .BTF.ext has no records", ext_sec->desc);
2672 return -EINVAL;
2673 }
2674
2675 while (info_left) {
2676 unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec);
2677 __u64 total_record_size;
2678 __u32 num_records;
2679
2680 if (info_left < sec_hdrlen) {
2681 pr_debug("%s section header is not found in .BTF.ext\n",
2682 ext_sec->desc);
2683 return -EINVAL;
2684 }
2685
2686 num_records = sinfo->num_info;
2687 if (num_records == 0) {
2688 pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2689 ext_sec->desc);
2690 return -EINVAL;
2691 }
2692
2693 total_record_size = sec_hdrlen + (__u64)num_records * record_size;
2694 if (info_left < total_record_size) {
2695 pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2696 ext_sec->desc);
2697 return -EINVAL;
2698 }
2699
2700 info_left -= total_record_size;
2701 sinfo = (void *)sinfo + total_record_size;
2702 sec_cnt++;
2703 }
2704
2705 ext_info = ext_sec->ext_info;
2706 ext_info->len = ext_sec->len - sizeof(__u32);
2707 ext_info->rec_size = record_size;
2708 ext_info->info = info + sizeof(__u32);
2709 ext_info->sec_cnt = sec_cnt;
2710
2711 return 0;
2712}
2713
2714static int btf_ext_setup_func_info(struct btf_ext *btf_ext)
2715{
2716 struct btf_ext_sec_setup_param param = {
2717 .off = btf_ext->hdr->func_info_off,
2718 .len = btf_ext->hdr->func_info_len,
2719 .min_rec_size = sizeof(struct bpf_func_info_min),
2720 .ext_info = &btf_ext->func_info,
2721 .desc = "func_info"
2722 };
2723
2724 return btf_ext_setup_info(btf_ext, ¶m);
2725}
2726
2727static int btf_ext_setup_line_info(struct btf_ext *btf_ext)
2728{
2729 struct btf_ext_sec_setup_param param = {
2730 .off = btf_ext->hdr->line_info_off,
2731 .len = btf_ext->hdr->line_info_len,
2732 .min_rec_size = sizeof(struct bpf_line_info_min),
2733 .ext_info = &btf_ext->line_info,
2734 .desc = "line_info",
2735 };
2736
2737 return btf_ext_setup_info(btf_ext, ¶m);
2738}
2739
2740static int btf_ext_setup_core_relos(struct btf_ext *btf_ext)
2741{
2742 struct btf_ext_sec_setup_param param = {
2743 .off = btf_ext->hdr->core_relo_off,
2744 .len = btf_ext->hdr->core_relo_len,
2745 .min_rec_size = sizeof(struct bpf_core_relo),
2746 .ext_info = &btf_ext->core_relo_info,
2747 .desc = "core_relo",
2748 };
2749
2750 return btf_ext_setup_info(btf_ext, ¶m);
2751}
2752
2753static int btf_ext_parse_hdr(__u8 *data, __u32 data_size)
2754{
2755 const struct btf_ext_header *hdr = (struct btf_ext_header *)data;
2756
2757 if (data_size < offsetofend(struct btf_ext_header, hdr_len) ||
2758 data_size < hdr->hdr_len) {
2759 pr_debug("BTF.ext header not found");
2760 return -EINVAL;
2761 }
2762
2763 if (hdr->magic == bswap_16(BTF_MAGIC)) {
2764 pr_warn("BTF.ext in non-native endianness is not supported\n");
2765 return -ENOTSUP;
2766 } else if (hdr->magic != BTF_MAGIC) {
2767 pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic);
2768 return -EINVAL;
2769 }
2770
2771 if (hdr->version != BTF_VERSION) {
2772 pr_debug("Unsupported BTF.ext version:%u\n", hdr->version);
2773 return -ENOTSUP;
2774 }
2775
2776 if (hdr->flags) {
2777 pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags);
2778 return -ENOTSUP;
2779 }
2780
2781 if (data_size == hdr->hdr_len) {
2782 pr_debug("BTF.ext has no data\n");
2783 return -EINVAL;
2784 }
2785
2786 return 0;
2787}
2788
2789void btf_ext__free(struct btf_ext *btf_ext)
2790{
2791 if (IS_ERR_OR_NULL(btf_ext))
2792 return;
2793 free(btf_ext->func_info.sec_idxs);
2794 free(btf_ext->line_info.sec_idxs);
2795 free(btf_ext->core_relo_info.sec_idxs);
2796 free(btf_ext->data);
2797 free(btf_ext);
2798}
2799
2800struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
2801{
2802 struct btf_ext *btf_ext;
2803 int err;
2804
2805 btf_ext = calloc(1, sizeof(struct btf_ext));
2806 if (!btf_ext)
2807 return libbpf_err_ptr(-ENOMEM);
2808
2809 btf_ext->data_size = size;
2810 btf_ext->data = malloc(size);
2811 if (!btf_ext->data) {
2812 err = -ENOMEM;
2813 goto done;
2814 }
2815 memcpy(btf_ext->data, data, size);
2816
2817 err = btf_ext_parse_hdr(btf_ext->data, size);
2818 if (err)
2819 goto done;
2820
2821 if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) {
2822 err = -EINVAL;
2823 goto done;
2824 }
2825
2826 err = btf_ext_setup_func_info(btf_ext);
2827 if (err)
2828 goto done;
2829
2830 err = btf_ext_setup_line_info(btf_ext);
2831 if (err)
2832 goto done;
2833
2834 if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
2835 goto done;
2836
2837 err = btf_ext_setup_core_relos(btf_ext);
2838 if (err)
2839 goto done;
2840
2841done:
2842 if (err) {
2843 btf_ext__free(btf_ext);
2844 return libbpf_err_ptr(err);
2845 }
2846
2847 return btf_ext;
2848}
2849
2850const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size)
2851{
2852 *size = btf_ext->data_size;
2853 return btf_ext->data;
2854}
2855
2856static int btf_ext_reloc_info(const struct btf *btf,
2857 const struct btf_ext_info *ext_info,
2858 const char *sec_name, __u32 insns_cnt,
2859 void **info, __u32 *cnt)
2860{
2861 __u32 sec_hdrlen = sizeof(struct btf_ext_info_sec);
2862 __u32 i, record_size, existing_len, records_len;
2863 struct btf_ext_info_sec *sinfo;
2864 const char *info_sec_name;
2865 __u64 remain_len;
2866 void *data;
2867
2868 record_size = ext_info->rec_size;
2869 sinfo = ext_info->info;
2870 remain_len = ext_info->len;
2871 while (remain_len > 0) {
2872 records_len = sinfo->num_info * record_size;
2873 info_sec_name = btf__name_by_offset(btf, sinfo->sec_name_off);
2874 if (strcmp(info_sec_name, sec_name)) {
2875 remain_len -= sec_hdrlen + records_len;
2876 sinfo = (void *)sinfo + sec_hdrlen + records_len;
2877 continue;
2878 }
2879
2880 existing_len = (*cnt) * record_size;
2881 data = realloc(*info, existing_len + records_len);
2882 if (!data)
2883 return libbpf_err(-ENOMEM);
2884
2885 memcpy(data + existing_len, sinfo->data, records_len);
2886
2887
2888
2889 for (i = 0; i < sinfo->num_info; i++) {
2890 __u32 *insn_off;
2891
2892 insn_off = data + existing_len + (i * record_size);
2893 *insn_off = *insn_off / sizeof(struct bpf_insn) + insns_cnt;
2894 }
2895 *info = data;
2896 *cnt += sinfo->num_info;
2897 return 0;
2898 }
2899
2900 return libbpf_err(-ENOENT);
2901}
2902
2903int btf_ext__reloc_func_info(const struct btf *btf,
2904 const struct btf_ext *btf_ext,
2905 const char *sec_name, __u32 insns_cnt,
2906 void **func_info, __u32 *cnt)
2907{
2908 return btf_ext_reloc_info(btf, &btf_ext->func_info, sec_name,
2909 insns_cnt, func_info, cnt);
2910}
2911
2912int btf_ext__reloc_line_info(const struct btf *btf,
2913 const struct btf_ext *btf_ext,
2914 const char *sec_name, __u32 insns_cnt,
2915 void **line_info, __u32 *cnt)
2916{
2917 return btf_ext_reloc_info(btf, &btf_ext->line_info, sec_name,
2918 insns_cnt, line_info, cnt);
2919}
2920
2921__u32 btf_ext__func_info_rec_size(const struct btf_ext *btf_ext)
2922{
2923 return btf_ext->func_info.rec_size;
2924}
2925
2926__u32 btf_ext__line_info_rec_size(const struct btf_ext *btf_ext)
2927{
2928 return btf_ext->line_info.rec_size;
2929}
2930
2931struct btf_dedup;
2932
2933static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
2934static void btf_dedup_free(struct btf_dedup *d);
2935static int btf_dedup_prep(struct btf_dedup *d);
2936static int btf_dedup_strings(struct btf_dedup *d);
2937static int btf_dedup_prim_types(struct btf_dedup *d);
2938static int btf_dedup_struct_types(struct btf_dedup *d);
2939static int btf_dedup_ref_types(struct btf_dedup *d);
2940static int btf_dedup_compact_types(struct btf_dedup *d);
2941static int btf_dedup_remap_types(struct btf_dedup *d);
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081DEFAULT_VERSION(btf__dedup_v0_6_0, btf__dedup, LIBBPF_0.6.0)
3082int btf__dedup_v0_6_0(struct btf *btf, const struct btf_dedup_opts *opts)
3083{
3084 struct btf_dedup *d;
3085 int err;
3086
3087 if (!OPTS_VALID(opts, btf_dedup_opts))
3088 return libbpf_err(-EINVAL);
3089
3090 d = btf_dedup_new(btf, opts);
3091 if (IS_ERR(d)) {
3092 pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d));
3093 return libbpf_err(-EINVAL);
3094 }
3095
3096 if (btf_ensure_modifiable(btf)) {
3097 err = -ENOMEM;
3098 goto done;
3099 }
3100
3101 err = btf_dedup_prep(d);
3102 if (err) {
3103 pr_debug("btf_dedup_prep failed:%d\n", err);
3104 goto done;
3105 }
3106 err = btf_dedup_strings(d);
3107 if (err < 0) {
3108 pr_debug("btf_dedup_strings failed:%d\n", err);
3109 goto done;
3110 }
3111 err = btf_dedup_prim_types(d);
3112 if (err < 0) {
3113 pr_debug("btf_dedup_prim_types failed:%d\n", err);
3114 goto done;
3115 }
3116 err = btf_dedup_struct_types(d);
3117 if (err < 0) {
3118 pr_debug("btf_dedup_struct_types failed:%d\n", err);
3119 goto done;
3120 }
3121 err = btf_dedup_ref_types(d);
3122 if (err < 0) {
3123 pr_debug("btf_dedup_ref_types failed:%d\n", err);
3124 goto done;
3125 }
3126 err = btf_dedup_compact_types(d);
3127 if (err < 0) {
3128 pr_debug("btf_dedup_compact_types failed:%d\n", err);
3129 goto done;
3130 }
3131 err = btf_dedup_remap_types(d);
3132 if (err < 0) {
3133 pr_debug("btf_dedup_remap_types failed:%d\n", err);
3134 goto done;
3135 }
3136
3137done:
3138 btf_dedup_free(d);
3139 return libbpf_err(err);
3140}
3141
3142COMPAT_VERSION(btf__dedup_deprecated, btf__dedup, LIBBPF_0.0.2)
3143int btf__dedup_deprecated(struct btf *btf, struct btf_ext *btf_ext, const void *unused_opts)
3144{
3145 LIBBPF_OPTS(btf_dedup_opts, opts, .btf_ext = btf_ext);
3146
3147 if (unused_opts) {
3148 pr_warn("please use new version of btf__dedup() that supports options\n");
3149 return libbpf_err(-ENOTSUP);
3150 }
3151
3152 return btf__dedup(btf, &opts);
3153}
3154
3155#define BTF_UNPROCESSED_ID ((__u32)-1)
3156#define BTF_IN_PROGRESS_ID ((__u32)-2)
3157
3158struct btf_dedup {
3159
3160 struct btf *btf;
3161
3162
3163
3164
3165 struct btf_ext *btf_ext;
3166
3167
3168
3169
3170
3171
3172
3173 struct hashmap *dedup_table;
3174
3175 __u32 *map;
3176
3177 __u32 *hypot_map;
3178 __u32 *hypot_list;
3179 size_t hypot_cnt;
3180 size_t hypot_cap;
3181
3182
3183
3184
3185
3186
3187 bool hypot_adjust_canon;
3188
3189 struct btf_dedup_opts opts;
3190
3191 struct strset *strs_set;
3192};
3193
3194static long hash_combine(long h, long value)
3195{
3196 return h * 31 + value;
3197}
3198
3199#define for_each_dedup_cand(d, node, hash) \
3200 hashmap__for_each_key_entry(d->dedup_table, node, (void *)hash)
3201
3202static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id)
3203{
3204 return hashmap__append(d->dedup_table,
3205 (void *)hash, (void *)(long)type_id);
3206}
3207
3208static int btf_dedup_hypot_map_add(struct btf_dedup *d,
3209 __u32 from_id, __u32 to_id)
3210{
3211 if (d->hypot_cnt == d->hypot_cap) {
3212 __u32 *new_list;
3213
3214 d->hypot_cap += max((size_t)16, d->hypot_cap / 2);
3215 new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32));
3216 if (!new_list)
3217 return -ENOMEM;
3218 d->hypot_list = new_list;
3219 }
3220 d->hypot_list[d->hypot_cnt++] = from_id;
3221 d->hypot_map[from_id] = to_id;
3222 return 0;
3223}
3224
3225static void btf_dedup_clear_hypot_map(struct btf_dedup *d)
3226{
3227 int i;
3228
3229 for (i = 0; i < d->hypot_cnt; i++)
3230 d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID;
3231 d->hypot_cnt = 0;
3232 d->hypot_adjust_canon = false;
3233}
3234
3235static void btf_dedup_free(struct btf_dedup *d)
3236{
3237 hashmap__free(d->dedup_table);
3238 d->dedup_table = NULL;
3239
3240 free(d->map);
3241 d->map = NULL;
3242
3243 free(d->hypot_map);
3244 d->hypot_map = NULL;
3245
3246 free(d->hypot_list);
3247 d->hypot_list = NULL;
3248
3249 free(d);
3250}
3251
3252static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx)
3253{
3254 return (size_t)key;
3255}
3256
3257static size_t btf_dedup_collision_hash_fn(const void *key, void *ctx)
3258{
3259 return 0;
3260}
3261
3262static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx)
3263{
3264 return k1 == k2;
3265}
3266
3267static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts)
3268{
3269 struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup));
3270 hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn;
3271 int i, err = 0, type_cnt;
3272
3273 if (!d)
3274 return ERR_PTR(-ENOMEM);
3275
3276 if (OPTS_GET(opts, force_collisions, false))
3277 hash_fn = btf_dedup_collision_hash_fn;
3278
3279 d->btf = btf;
3280 d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3281
3282 d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL);
3283 if (IS_ERR(d->dedup_table)) {
3284 err = PTR_ERR(d->dedup_table);
3285 d->dedup_table = NULL;
3286 goto done;
3287 }
3288
3289 type_cnt = btf__type_cnt(btf);
3290 d->map = malloc(sizeof(__u32) * type_cnt);
3291 if (!d->map) {
3292 err = -ENOMEM;
3293 goto done;
3294 }
3295
3296 d->map[0] = 0;
3297 for (i = 1; i < type_cnt; i++) {
3298 struct btf_type *t = btf_type_by_id(d->btf, i);
3299
3300
3301 if (btf_is_var(t) || btf_is_datasec(t))
3302 d->map[i] = i;
3303 else
3304 d->map[i] = BTF_UNPROCESSED_ID;
3305 }
3306
3307 d->hypot_map = malloc(sizeof(__u32) * type_cnt);
3308 if (!d->hypot_map) {
3309 err = -ENOMEM;
3310 goto done;
3311 }
3312 for (i = 0; i < type_cnt; i++)
3313 d->hypot_map[i] = BTF_UNPROCESSED_ID;
3314
3315done:
3316 if (err) {
3317 btf_dedup_free(d);
3318 return ERR_PTR(err);
3319 }
3320
3321 return d;
3322}
3323
3324
3325
3326
3327
3328static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx)
3329{
3330 int i, r;
3331
3332 for (i = 0; i < d->btf->nr_types; i++) {
3333 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
3334
3335 r = btf_type_visit_str_offs(t, fn, ctx);
3336 if (r)
3337 return r;
3338 }
3339
3340 if (!d->btf_ext)
3341 return 0;
3342
3343 r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
3344 if (r)
3345 return r;
3346
3347 return 0;
3348}
3349
3350static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx)
3351{
3352 struct btf_dedup *d = ctx;
3353 __u32 str_off = *str_off_ptr;
3354 const char *s;
3355 int off, err;
3356
3357
3358 if (str_off == 0 || str_off < d->btf->start_str_off)
3359 return 0;
3360
3361 s = btf__str_by_offset(d->btf, str_off);
3362 if (d->btf->base_btf) {
3363 err = btf__find_str(d->btf->base_btf, s);
3364 if (err >= 0) {
3365 *str_off_ptr = err;
3366 return 0;
3367 }
3368 if (err != -ENOENT)
3369 return err;
3370 }
3371
3372 off = strset__add_str(d->strs_set, s);
3373 if (off < 0)
3374 return off;
3375
3376 *str_off_ptr = d->btf->start_str_off + off;
3377 return 0;
3378}
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391static int btf_dedup_strings(struct btf_dedup *d)
3392{
3393 int err;
3394
3395 if (d->btf->strs_deduped)
3396 return 0;
3397
3398 d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0);
3399 if (IS_ERR(d->strs_set)) {
3400 err = PTR_ERR(d->strs_set);
3401 goto err_out;
3402 }
3403
3404 if (!d->btf->base_btf) {
3405
3406
3407
3408 err = strset__add_str(d->strs_set, "");
3409 if (err < 0)
3410 goto err_out;
3411 }
3412
3413
3414 err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d);
3415 if (err)
3416 goto err_out;
3417
3418
3419 strset__free(d->btf->strs_set);
3420 d->btf->hdr->str_len = strset__data_size(d->strs_set);
3421 d->btf->strs_set = d->strs_set;
3422 d->strs_set = NULL;
3423 d->btf->strs_deduped = true;
3424 return 0;
3425
3426err_out:
3427 strset__free(d->strs_set);
3428 d->strs_set = NULL;
3429
3430 return err;
3431}
3432
3433static long btf_hash_common(struct btf_type *t)
3434{
3435 long h;
3436
3437 h = hash_combine(0, t->name_off);
3438 h = hash_combine(h, t->info);
3439 h = hash_combine(h, t->size);
3440 return h;
3441}
3442
3443static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2)
3444{
3445 return t1->name_off == t2->name_off &&
3446 t1->info == t2->info &&
3447 t1->size == t2->size;
3448}
3449
3450
3451static long btf_hash_int_decl_tag(struct btf_type *t)
3452{
3453 __u32 info = *(__u32 *)(t + 1);
3454 long h;
3455
3456 h = btf_hash_common(t);
3457 h = hash_combine(h, info);
3458 return h;
3459}
3460
3461
3462static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2)
3463{
3464 __u32 info1, info2;
3465
3466 if (!btf_equal_common(t1, t2))
3467 return false;
3468 info1 = *(__u32 *)(t1 + 1);
3469 info2 = *(__u32 *)(t2 + 1);
3470 return info1 == info2;
3471}
3472
3473
3474static long btf_hash_enum(struct btf_type *t)
3475{
3476 long h;
3477
3478
3479 h = hash_combine(0, t->name_off);
3480 h = hash_combine(h, t->info & ~0xffff);
3481 h = hash_combine(h, t->size);
3482 return h;
3483}
3484
3485
3486static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2)
3487{
3488 const struct btf_enum *m1, *m2;
3489 __u16 vlen;
3490 int i;
3491
3492 if (!btf_equal_common(t1, t2))
3493 return false;
3494
3495 vlen = btf_vlen(t1);
3496 m1 = btf_enum(t1);
3497 m2 = btf_enum(t2);
3498 for (i = 0; i < vlen; i++) {
3499 if (m1->name_off != m2->name_off || m1->val != m2->val)
3500 return false;
3501 m1++;
3502 m2++;
3503 }
3504 return true;
3505}
3506
3507static inline bool btf_is_enum_fwd(struct btf_type *t)
3508{
3509 return btf_is_enum(t) && btf_vlen(t) == 0;
3510}
3511
3512static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2)
3513{
3514 if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3515 return btf_equal_enum(t1, t2);
3516
3517 return t1->name_off == t2->name_off &&
3518 (t1->info & ~0xffff) == (t2->info & ~0xffff) &&
3519 t1->size == t2->size;
3520}
3521
3522
3523
3524
3525
3526
3527static long btf_hash_struct(struct btf_type *t)
3528{
3529 const struct btf_member *member = btf_members(t);
3530 __u32 vlen = btf_vlen(t);
3531 long h = btf_hash_common(t);
3532 int i;
3533
3534 for (i = 0; i < vlen; i++) {
3535 h = hash_combine(h, member->name_off);
3536 h = hash_combine(h, member->offset);
3537
3538 member++;
3539 }
3540 return h;
3541}
3542
3543
3544
3545
3546
3547
3548static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2)
3549{
3550 const struct btf_member *m1, *m2;
3551 __u16 vlen;
3552 int i;
3553
3554 if (!btf_equal_common(t1, t2))
3555 return false;
3556
3557 vlen = btf_vlen(t1);
3558 m1 = btf_members(t1);
3559 m2 = btf_members(t2);
3560 for (i = 0; i < vlen; i++) {
3561 if (m1->name_off != m2->name_off || m1->offset != m2->offset)
3562 return false;
3563 m1++;
3564 m2++;
3565 }
3566 return true;
3567}
3568
3569
3570
3571
3572
3573
3574static long btf_hash_array(struct btf_type *t)
3575{
3576 const struct btf_array *info = btf_array(t);
3577 long h = btf_hash_common(t);
3578
3579 h = hash_combine(h, info->type);
3580 h = hash_combine(h, info->index_type);
3581 h = hash_combine(h, info->nelems);
3582 return h;
3583}
3584
3585
3586
3587
3588
3589
3590
3591
3592static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2)
3593{
3594 const struct btf_array *info1, *info2;
3595
3596 if (!btf_equal_common(t1, t2))
3597 return false;
3598
3599 info1 = btf_array(t1);
3600 info2 = btf_array(t2);
3601 return info1->type == info2->type &&
3602 info1->index_type == info2->index_type &&
3603 info1->nelems == info2->nelems;
3604}
3605
3606
3607
3608
3609
3610
3611static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2)
3612{
3613 if (!btf_equal_common(t1, t2))
3614 return false;
3615
3616 return btf_array(t1)->nelems == btf_array(t2)->nelems;
3617}
3618
3619
3620
3621
3622
3623
3624static long btf_hash_fnproto(struct btf_type *t)
3625{
3626 const struct btf_param *member = btf_params(t);
3627 __u16 vlen = btf_vlen(t);
3628 long h = btf_hash_common(t);
3629 int i;
3630
3631 for (i = 0; i < vlen; i++) {
3632 h = hash_combine(h, member->name_off);
3633 h = hash_combine(h, member->type);
3634 member++;
3635 }
3636 return h;
3637}
3638
3639
3640
3641
3642
3643
3644
3645
3646static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2)
3647{
3648 const struct btf_param *m1, *m2;
3649 __u16 vlen;
3650 int i;
3651
3652 if (!btf_equal_common(t1, t2))
3653 return false;
3654
3655 vlen = btf_vlen(t1);
3656 m1 = btf_params(t1);
3657 m2 = btf_params(t2);
3658 for (i = 0; i < vlen; i++) {
3659 if (m1->name_off != m2->name_off || m1->type != m2->type)
3660 return false;
3661 m1++;
3662 m2++;
3663 }
3664 return true;
3665}
3666
3667
3668
3669
3670
3671
3672static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2)
3673{
3674 const struct btf_param *m1, *m2;
3675 __u16 vlen;
3676 int i;
3677
3678
3679 if (t1->name_off != t2->name_off || t1->info != t2->info)
3680 return false;
3681
3682 vlen = btf_vlen(t1);
3683 m1 = btf_params(t1);
3684 m2 = btf_params(t2);
3685 for (i = 0; i < vlen; i++) {
3686 if (m1->name_off != m2->name_off)
3687 return false;
3688 m1++;
3689 m2++;
3690 }
3691 return true;
3692}
3693
3694
3695
3696
3697
3698static int btf_dedup_prep(struct btf_dedup *d)
3699{
3700 struct btf_type *t;
3701 int type_id;
3702 long h;
3703
3704 if (!d->btf->base_btf)
3705 return 0;
3706
3707 for (type_id = 1; type_id < d->btf->start_id; type_id++) {
3708 t = btf_type_by_id(d->btf, type_id);
3709
3710
3711 d->map[type_id] = type_id;
3712
3713 switch (btf_kind(t)) {
3714 case BTF_KIND_VAR:
3715 case BTF_KIND_DATASEC:
3716
3717 continue;
3718 case BTF_KIND_CONST:
3719 case BTF_KIND_VOLATILE:
3720 case BTF_KIND_RESTRICT:
3721 case BTF_KIND_PTR:
3722 case BTF_KIND_FWD:
3723 case BTF_KIND_TYPEDEF:
3724 case BTF_KIND_FUNC:
3725 case BTF_KIND_FLOAT:
3726 case BTF_KIND_TYPE_TAG:
3727 h = btf_hash_common(t);
3728 break;
3729 case BTF_KIND_INT:
3730 case BTF_KIND_DECL_TAG:
3731 h = btf_hash_int_decl_tag(t);
3732 break;
3733 case BTF_KIND_ENUM:
3734 h = btf_hash_enum(t);
3735 break;
3736 case BTF_KIND_STRUCT:
3737 case BTF_KIND_UNION:
3738 h = btf_hash_struct(t);
3739 break;
3740 case BTF_KIND_ARRAY:
3741 h = btf_hash_array(t);
3742 break;
3743 case BTF_KIND_FUNC_PROTO:
3744 h = btf_hash_fnproto(t);
3745 break;
3746 default:
3747 pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id);
3748 return -EINVAL;
3749 }
3750 if (btf_dedup_table_add(d, h, type_id))
3751 return -ENOMEM;
3752 }
3753
3754 return 0;
3755}
3756
3757
3758
3759
3760
3761
3762
3763static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id)
3764{
3765 struct btf_type *t = btf_type_by_id(d->btf, type_id);
3766 struct hashmap_entry *hash_entry;
3767 struct btf_type *cand;
3768
3769 __u32 new_id = type_id;
3770 __u32 cand_id;
3771 long h;
3772
3773 switch (btf_kind(t)) {
3774 case BTF_KIND_CONST:
3775 case BTF_KIND_VOLATILE:
3776 case BTF_KIND_RESTRICT:
3777 case BTF_KIND_PTR:
3778 case BTF_KIND_TYPEDEF:
3779 case BTF_KIND_ARRAY:
3780 case BTF_KIND_STRUCT:
3781 case BTF_KIND_UNION:
3782 case BTF_KIND_FUNC:
3783 case BTF_KIND_FUNC_PROTO:
3784 case BTF_KIND_VAR:
3785 case BTF_KIND_DATASEC:
3786 case BTF_KIND_DECL_TAG:
3787 case BTF_KIND_TYPE_TAG:
3788 return 0;
3789
3790 case BTF_KIND_INT:
3791 h = btf_hash_int_decl_tag(t);
3792 for_each_dedup_cand(d, hash_entry, h) {
3793 cand_id = (__u32)(long)hash_entry->value;
3794 cand = btf_type_by_id(d->btf, cand_id);
3795 if (btf_equal_int_tag(t, cand)) {
3796 new_id = cand_id;
3797 break;
3798 }
3799 }
3800 break;
3801
3802 case BTF_KIND_ENUM:
3803 h = btf_hash_enum(t);
3804 for_each_dedup_cand(d, hash_entry, h) {
3805 cand_id = (__u32)(long)hash_entry->value;
3806 cand = btf_type_by_id(d->btf, cand_id);
3807 if (btf_equal_enum(t, cand)) {
3808 new_id = cand_id;
3809 break;
3810 }
3811 if (btf_compat_enum(t, cand)) {
3812 if (btf_is_enum_fwd(t)) {
3813
3814 new_id = cand_id;
3815 break;
3816 }
3817
3818 d->map[cand_id] = type_id;
3819 }
3820 }
3821 break;
3822
3823 case BTF_KIND_FWD:
3824 case BTF_KIND_FLOAT:
3825 h = btf_hash_common(t);
3826 for_each_dedup_cand(d, hash_entry, h) {
3827 cand_id = (__u32)(long)hash_entry->value;
3828 cand = btf_type_by_id(d->btf, cand_id);
3829 if (btf_equal_common(t, cand)) {
3830 new_id = cand_id;
3831 break;
3832 }
3833 }
3834 break;
3835
3836 default:
3837 return -EINVAL;
3838 }
3839
3840 d->map[type_id] = new_id;
3841 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
3842 return -ENOMEM;
3843
3844 return 0;
3845}
3846
3847static int btf_dedup_prim_types(struct btf_dedup *d)
3848{
3849 int i, err;
3850
3851 for (i = 0; i < d->btf->nr_types; i++) {
3852 err = btf_dedup_prim_type(d, d->btf->start_id + i);
3853 if (err)
3854 return err;
3855 }
3856 return 0;
3857}
3858
3859
3860
3861
3862static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id)
3863{
3864 return d->map[type_id] <= BTF_MAX_NR_TYPES;
3865}
3866
3867
3868
3869
3870
3871
3872static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id)
3873{
3874 while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3875 type_id = d->map[type_id];
3876 return type_id;
3877}
3878
3879
3880
3881
3882
3883static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id)
3884{
3885 __u32 orig_type_id = type_id;
3886
3887 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3888 return type_id;
3889
3890 while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3891 type_id = d->map[type_id];
3892
3893 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3894 return type_id;
3895
3896 return orig_type_id;
3897}
3898
3899
3900static inline __u16 btf_fwd_kind(struct btf_type *t)
3901{
3902 return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT;
3903}
3904
3905
3906static int btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2)
3907{
3908 struct btf_type *t1, *t2;
3909
3910 t1 = btf_type_by_id(d->btf, id1);
3911 t2 = btf_type_by_id(d->btf, id2);
3912 if (!btf_is_array(t1) || !btf_is_array(t2))
3913 return 0;
3914
3915 return btf_equal_array(t1, t2);
3916}
3917
3918
3919static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2)
3920{
3921 const struct btf_member *m1, *m2;
3922 struct btf_type *t1, *t2;
3923 int n, i;
3924
3925 t1 = btf_type_by_id(d->btf, id1);
3926 t2 = btf_type_by_id(d->btf, id2);
3927
3928 if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2))
3929 return false;
3930
3931 if (!btf_shallow_equal_struct(t1, t2))
3932 return false;
3933
3934 m1 = btf_members(t1);
3935 m2 = btf_members(t2);
3936 for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) {
3937 if (m1->type != m2->type)
3938 return false;
3939 }
3940 return true;
3941}
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id,
4037 __u32 canon_id)
4038{
4039 struct btf_type *cand_type;
4040 struct btf_type *canon_type;
4041 __u32 hypot_type_id;
4042 __u16 cand_kind;
4043 __u16 canon_kind;
4044 int i, eq;
4045
4046
4047 if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id))
4048 return 1;
4049
4050 canon_id = resolve_fwd_id(d, canon_id);
4051
4052 hypot_type_id = d->hypot_map[canon_id];
4053 if (hypot_type_id <= BTF_MAX_NR_TYPES) {
4054 if (hypot_type_id == cand_id)
4055 return 1;
4056
4057
4058
4059
4060
4061
4062
4063
4064 if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id))
4065 return 1;
4066
4067
4068
4069
4070
4071
4072
4073 if (btf_dedup_identical_structs(d, hypot_type_id, cand_id))
4074 return 1;
4075 return 0;
4076 }
4077
4078 if (btf_dedup_hypot_map_add(d, canon_id, cand_id))
4079 return -ENOMEM;
4080
4081 cand_type = btf_type_by_id(d->btf, cand_id);
4082 canon_type = btf_type_by_id(d->btf, canon_id);
4083 cand_kind = btf_kind(cand_type);
4084 canon_kind = btf_kind(canon_type);
4085
4086 if (cand_type->name_off != canon_type->name_off)
4087 return 0;
4088
4089
4090 if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD)
4091 && cand_kind != canon_kind) {
4092 __u16 real_kind;
4093 __u16 fwd_kind;
4094
4095 if (cand_kind == BTF_KIND_FWD) {
4096 real_kind = canon_kind;
4097 fwd_kind = btf_fwd_kind(cand_type);
4098 } else {
4099 real_kind = cand_kind;
4100 fwd_kind = btf_fwd_kind(canon_type);
4101
4102 if (fwd_kind == real_kind && canon_id < d->btf->start_id)
4103 d->hypot_adjust_canon = true;
4104 }
4105 return fwd_kind == real_kind;
4106 }
4107
4108 if (cand_kind != canon_kind)
4109 return 0;
4110
4111 switch (cand_kind) {
4112 case BTF_KIND_INT:
4113 return btf_equal_int_tag(cand_type, canon_type);
4114
4115 case BTF_KIND_ENUM:
4116 return btf_compat_enum(cand_type, canon_type);
4117
4118 case BTF_KIND_FWD:
4119 case BTF_KIND_FLOAT:
4120 return btf_equal_common(cand_type, canon_type);
4121
4122 case BTF_KIND_CONST:
4123 case BTF_KIND_VOLATILE:
4124 case BTF_KIND_RESTRICT:
4125 case BTF_KIND_PTR:
4126 case BTF_KIND_TYPEDEF:
4127 case BTF_KIND_FUNC:
4128 case BTF_KIND_TYPE_TAG:
4129 if (cand_type->info != canon_type->info)
4130 return 0;
4131 return btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4132
4133 case BTF_KIND_ARRAY: {
4134 const struct btf_array *cand_arr, *canon_arr;
4135
4136 if (!btf_compat_array(cand_type, canon_type))
4137 return 0;
4138 cand_arr = btf_array(cand_type);
4139 canon_arr = btf_array(canon_type);
4140 eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type);
4141 if (eq <= 0)
4142 return eq;
4143 return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type);
4144 }
4145
4146 case BTF_KIND_STRUCT:
4147 case BTF_KIND_UNION: {
4148 const struct btf_member *cand_m, *canon_m;
4149 __u16 vlen;
4150
4151 if (!btf_shallow_equal_struct(cand_type, canon_type))
4152 return 0;
4153 vlen = btf_vlen(cand_type);
4154 cand_m = btf_members(cand_type);
4155 canon_m = btf_members(canon_type);
4156 for (i = 0; i < vlen; i++) {
4157 eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type);
4158 if (eq <= 0)
4159 return eq;
4160 cand_m++;
4161 canon_m++;
4162 }
4163
4164 return 1;
4165 }
4166
4167 case BTF_KIND_FUNC_PROTO: {
4168 const struct btf_param *cand_p, *canon_p;
4169 __u16 vlen;
4170
4171 if (!btf_compat_fnproto(cand_type, canon_type))
4172 return 0;
4173 eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4174 if (eq <= 0)
4175 return eq;
4176 vlen = btf_vlen(cand_type);
4177 cand_p = btf_params(cand_type);
4178 canon_p = btf_params(canon_type);
4179 for (i = 0; i < vlen; i++) {
4180 eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type);
4181 if (eq <= 0)
4182 return eq;
4183 cand_p++;
4184 canon_p++;
4185 }
4186 return 1;
4187 }
4188
4189 default:
4190 return -EINVAL;
4191 }
4192 return 0;
4193}
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
4222{
4223 __u32 canon_type_id, targ_type_id;
4224 __u16 t_kind, c_kind;
4225 __u32 t_id, c_id;
4226 int i;
4227
4228 for (i = 0; i < d->hypot_cnt; i++) {
4229 canon_type_id = d->hypot_list[i];
4230 targ_type_id = d->hypot_map[canon_type_id];
4231 t_id = resolve_type_id(d, targ_type_id);
4232 c_id = resolve_type_id(d, canon_type_id);
4233 t_kind = btf_kind(btf__type_by_id(d->btf, t_id));
4234 c_kind = btf_kind(btf__type_by_id(d->btf, c_id));
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255 if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD)
4256 d->map[c_id] = t_id;
4257
4258
4259
4260
4261
4262
4263 if (d->hypot_adjust_canon)
4264 continue;
4265
4266 if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
4267 d->map[t_id] = c_id;
4268
4269 if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) &&
4270 c_kind != BTF_KIND_FWD &&
4271 is_type_mapped(d, c_id) &&
4272 !is_type_mapped(d, t_id)) {
4273
4274
4275
4276
4277
4278
4279 d->map[t_id] = c_id;
4280 }
4281 }
4282}
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id)
4307{
4308 struct btf_type *cand_type, *t;
4309 struct hashmap_entry *hash_entry;
4310
4311 __u32 new_id = type_id;
4312 __u16 kind;
4313 long h;
4314
4315
4316 if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4317 return 0;
4318
4319 t = btf_type_by_id(d->btf, type_id);
4320 kind = btf_kind(t);
4321
4322 if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4323 return 0;
4324
4325 h = btf_hash_struct(t);
4326 for_each_dedup_cand(d, hash_entry, h) {
4327 __u32 cand_id = (__u32)(long)hash_entry->value;
4328 int eq;
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340 cand_type = btf_type_by_id(d->btf, cand_id);
4341 if (!btf_shallow_equal_struct(t, cand_type))
4342 continue;
4343
4344 btf_dedup_clear_hypot_map(d);
4345 eq = btf_dedup_is_equiv(d, type_id, cand_id);
4346 if (eq < 0)
4347 return eq;
4348 if (!eq)
4349 continue;
4350 btf_dedup_merge_hypot_map(d);
4351 if (d->hypot_adjust_canon)
4352 continue;
4353 new_id = cand_id;
4354 break;
4355 }
4356
4357 d->map[type_id] = new_id;
4358 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4359 return -ENOMEM;
4360
4361 return 0;
4362}
4363
4364static int btf_dedup_struct_types(struct btf_dedup *d)
4365{
4366 int i, err;
4367
4368 for (i = 0; i < d->btf->nr_types; i++) {
4369 err = btf_dedup_struct_type(d, d->btf->start_id + i);
4370 if (err)
4371 return err;
4372 }
4373 return 0;
4374}
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id)
4401{
4402 struct hashmap_entry *hash_entry;
4403 __u32 new_id = type_id, cand_id;
4404 struct btf_type *t, *cand;
4405
4406 int ref_type_id;
4407 long h;
4408
4409 if (d->map[type_id] == BTF_IN_PROGRESS_ID)
4410 return -ELOOP;
4411 if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4412 return resolve_type_id(d, type_id);
4413
4414 t = btf_type_by_id(d->btf, type_id);
4415 d->map[type_id] = BTF_IN_PROGRESS_ID;
4416
4417 switch (btf_kind(t)) {
4418 case BTF_KIND_CONST:
4419 case BTF_KIND_VOLATILE:
4420 case BTF_KIND_RESTRICT:
4421 case BTF_KIND_PTR:
4422 case BTF_KIND_TYPEDEF:
4423 case BTF_KIND_FUNC:
4424 case BTF_KIND_TYPE_TAG:
4425 ref_type_id = btf_dedup_ref_type(d, t->type);
4426 if (ref_type_id < 0)
4427 return ref_type_id;
4428 t->type = ref_type_id;
4429
4430 h = btf_hash_common(t);
4431 for_each_dedup_cand(d, hash_entry, h) {
4432 cand_id = (__u32)(long)hash_entry->value;
4433 cand = btf_type_by_id(d->btf, cand_id);
4434 if (btf_equal_common(t, cand)) {
4435 new_id = cand_id;
4436 break;
4437 }
4438 }
4439 break;
4440
4441 case BTF_KIND_DECL_TAG:
4442 ref_type_id = btf_dedup_ref_type(d, t->type);
4443 if (ref_type_id < 0)
4444 return ref_type_id;
4445 t->type = ref_type_id;
4446
4447 h = btf_hash_int_decl_tag(t);
4448 for_each_dedup_cand(d, hash_entry, h) {
4449 cand_id = (__u32)(long)hash_entry->value;
4450 cand = btf_type_by_id(d->btf, cand_id);
4451 if (btf_equal_int_tag(t, cand)) {
4452 new_id = cand_id;
4453 break;
4454 }
4455 }
4456 break;
4457
4458 case BTF_KIND_ARRAY: {
4459 struct btf_array *info = btf_array(t);
4460
4461 ref_type_id = btf_dedup_ref_type(d, info->type);
4462 if (ref_type_id < 0)
4463 return ref_type_id;
4464 info->type = ref_type_id;
4465
4466 ref_type_id = btf_dedup_ref_type(d, info->index_type);
4467 if (ref_type_id < 0)
4468 return ref_type_id;
4469 info->index_type = ref_type_id;
4470
4471 h = btf_hash_array(t);
4472 for_each_dedup_cand(d, hash_entry, h) {
4473 cand_id = (__u32)(long)hash_entry->value;
4474 cand = btf_type_by_id(d->btf, cand_id);
4475 if (btf_equal_array(t, cand)) {
4476 new_id = cand_id;
4477 break;
4478 }
4479 }
4480 break;
4481 }
4482
4483 case BTF_KIND_FUNC_PROTO: {
4484 struct btf_param *param;
4485 __u16 vlen;
4486 int i;
4487
4488 ref_type_id = btf_dedup_ref_type(d, t->type);
4489 if (ref_type_id < 0)
4490 return ref_type_id;
4491 t->type = ref_type_id;
4492
4493 vlen = btf_vlen(t);
4494 param = btf_params(t);
4495 for (i = 0; i < vlen; i++) {
4496 ref_type_id = btf_dedup_ref_type(d, param->type);
4497 if (ref_type_id < 0)
4498 return ref_type_id;
4499 param->type = ref_type_id;
4500 param++;
4501 }
4502
4503 h = btf_hash_fnproto(t);
4504 for_each_dedup_cand(d, hash_entry, h) {
4505 cand_id = (__u32)(long)hash_entry->value;
4506 cand = btf_type_by_id(d->btf, cand_id);
4507 if (btf_equal_fnproto(t, cand)) {
4508 new_id = cand_id;
4509 break;
4510 }
4511 }
4512 break;
4513 }
4514
4515 default:
4516 return -EINVAL;
4517 }
4518
4519 d->map[type_id] = new_id;
4520 if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4521 return -ENOMEM;
4522
4523 return new_id;
4524}
4525
4526static int btf_dedup_ref_types(struct btf_dedup *d)
4527{
4528 int i, err;
4529
4530 for (i = 0; i < d->btf->nr_types; i++) {
4531 err = btf_dedup_ref_type(d, d->btf->start_id + i);
4532 if (err < 0)
4533 return err;
4534 }
4535
4536 hashmap__free(d->dedup_table);
4537 d->dedup_table = NULL;
4538 return 0;
4539}
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552static int btf_dedup_compact_types(struct btf_dedup *d)
4553{
4554 __u32 *new_offs;
4555 __u32 next_type_id = d->btf->start_id;
4556 const struct btf_type *t;
4557 void *p;
4558 int i, id, len;
4559
4560
4561 d->hypot_map[0] = 0;
4562
4563 for (id = 1; id < d->btf->start_id; id++)
4564 d->hypot_map[id] = id;
4565 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++)
4566 d->hypot_map[id] = BTF_UNPROCESSED_ID;
4567
4568 p = d->btf->types_data;
4569
4570 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) {
4571 if (d->map[id] != id)
4572 continue;
4573
4574 t = btf__type_by_id(d->btf, id);
4575 len = btf_type_size(t);
4576 if (len < 0)
4577 return len;
4578
4579 memmove(p, t, len);
4580 d->hypot_map[id] = next_type_id;
4581 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data;
4582 p += len;
4583 next_type_id++;
4584 }
4585
4586
4587 d->btf->nr_types = next_type_id - d->btf->start_id;
4588 d->btf->type_offs_cap = d->btf->nr_types;
4589 d->btf->hdr->type_len = p - d->btf->types_data;
4590 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap,
4591 sizeof(*new_offs));
4592 if (d->btf->type_offs_cap && !new_offs)
4593 return -ENOMEM;
4594 d->btf->type_offs = new_offs;
4595 d->btf->hdr->str_off = d->btf->hdr->type_len;
4596 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len;
4597 return 0;
4598}
4599
4600
4601
4602
4603
4604
4605
4606static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx)
4607{
4608 struct btf_dedup *d = ctx;
4609 __u32 resolved_type_id, new_type_id;
4610
4611 resolved_type_id = resolve_type_id(d, *type_id);
4612 new_type_id = d->hypot_map[resolved_type_id];
4613 if (new_type_id > BTF_MAX_NR_TYPES)
4614 return -EINVAL;
4615
4616 *type_id = new_type_id;
4617 return 0;
4618}
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630static int btf_dedup_remap_types(struct btf_dedup *d)
4631{
4632 int i, r;
4633
4634 for (i = 0; i < d->btf->nr_types; i++) {
4635 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
4636
4637 r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d);
4638 if (r)
4639 return r;
4640 }
4641
4642 if (!d->btf_ext)
4643 return 0;
4644
4645 r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
4646 if (r)
4647 return r;
4648
4649 return 0;
4650}
4651
4652
4653
4654
4655
4656struct btf *btf__load_vmlinux_btf(void)
4657{
4658 struct {
4659 const char *path_fmt;
4660 bool raw_btf;
4661 } locations[] = {
4662
4663 { "/sys/kernel/btf/vmlinux", true },
4664
4665 { "/boot/vmlinux-%1$s" },
4666 { "/lib/modules/%1$s/vmlinux-%1$s" },
4667 { "/lib/modules/%1$s/build/vmlinux" },
4668 { "/usr/lib/modules/%1$s/kernel/vmlinux" },
4669 { "/usr/lib/debug/boot/vmlinux-%1$s" },
4670 { "/usr/lib/debug/boot/vmlinux-%1$s.debug" },
4671 { "/usr/lib/debug/lib/modules/%1$s/vmlinux" },
4672 };
4673 char path[PATH_MAX + 1];
4674 struct utsname buf;
4675 struct btf *btf;
4676 int i, err;
4677
4678 uname(&buf);
4679
4680 for (i = 0; i < ARRAY_SIZE(locations); i++) {
4681 snprintf(path, PATH_MAX, locations[i].path_fmt, buf.release);
4682
4683 if (access(path, R_OK))
4684 continue;
4685
4686 if (locations[i].raw_btf)
4687 btf = btf__parse_raw(path);
4688 else
4689 btf = btf__parse_elf(path, NULL);
4690 err = libbpf_get_error(btf);
4691 pr_debug("loading kernel BTF '%s': %d\n", path, err);
4692 if (err)
4693 continue;
4694
4695 return btf;
4696 }
4697
4698 pr_warn("failed to find valid kernel BTF\n");
4699 return libbpf_err_ptr(-ESRCH);
4700}
4701
4702struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
4703
4704struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf)
4705{
4706 char path[80];
4707
4708 snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name);
4709 return btf__parse_split(path, vmlinux_btf);
4710}
4711
4712int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
4713{
4714 int i, n, err;
4715
4716 switch (btf_kind(t)) {
4717 case BTF_KIND_INT:
4718 case BTF_KIND_FLOAT:
4719 case BTF_KIND_ENUM:
4720 return 0;
4721
4722 case BTF_KIND_FWD:
4723 case BTF_KIND_CONST:
4724 case BTF_KIND_VOLATILE:
4725 case BTF_KIND_RESTRICT:
4726 case BTF_KIND_PTR:
4727 case BTF_KIND_TYPEDEF:
4728 case BTF_KIND_FUNC:
4729 case BTF_KIND_VAR:
4730 case BTF_KIND_DECL_TAG:
4731 case BTF_KIND_TYPE_TAG:
4732 return visit(&t->type, ctx);
4733
4734 case BTF_KIND_ARRAY: {
4735 struct btf_array *a = btf_array(t);
4736
4737 err = visit(&a->type, ctx);
4738 err = err ?: visit(&a->index_type, ctx);
4739 return err;
4740 }
4741
4742 case BTF_KIND_STRUCT:
4743 case BTF_KIND_UNION: {
4744 struct btf_member *m = btf_members(t);
4745
4746 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4747 err = visit(&m->type, ctx);
4748 if (err)
4749 return err;
4750 }
4751 return 0;
4752 }
4753
4754 case BTF_KIND_FUNC_PROTO: {
4755 struct btf_param *m = btf_params(t);
4756
4757 err = visit(&t->type, ctx);
4758 if (err)
4759 return err;
4760 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4761 err = visit(&m->type, ctx);
4762 if (err)
4763 return err;
4764 }
4765 return 0;
4766 }
4767
4768 case BTF_KIND_DATASEC: {
4769 struct btf_var_secinfo *m = btf_var_secinfos(t);
4770
4771 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4772 err = visit(&m->type, ctx);
4773 if (err)
4774 return err;
4775 }
4776 return 0;
4777 }
4778
4779 default:
4780 return -EINVAL;
4781 }
4782}
4783
4784int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx)
4785{
4786 int i, n, err;
4787
4788 err = visit(&t->name_off, ctx);
4789 if (err)
4790 return err;
4791
4792 switch (btf_kind(t)) {
4793 case BTF_KIND_STRUCT:
4794 case BTF_KIND_UNION: {
4795 struct btf_member *m = btf_members(t);
4796
4797 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4798 err = visit(&m->name_off, ctx);
4799 if (err)
4800 return err;
4801 }
4802 break;
4803 }
4804 case BTF_KIND_ENUM: {
4805 struct btf_enum *m = btf_enum(t);
4806
4807 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4808 err = visit(&m->name_off, ctx);
4809 if (err)
4810 return err;
4811 }
4812 break;
4813 }
4814 case BTF_KIND_FUNC_PROTO: {
4815 struct btf_param *m = btf_params(t);
4816
4817 for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4818 err = visit(&m->name_off, ctx);
4819 if (err)
4820 return err;
4821 }
4822 break;
4823 }
4824 default:
4825 break;
4826 }
4827
4828 return 0;
4829}
4830
4831int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
4832{
4833 const struct btf_ext_info *seg;
4834 struct btf_ext_info_sec *sec;
4835 int i, err;
4836
4837 seg = &btf_ext->func_info;
4838 for_each_btf_ext_sec(seg, sec) {
4839 struct bpf_func_info_min *rec;
4840
4841 for_each_btf_ext_rec(seg, sec, i, rec) {
4842 err = visit(&rec->type_id, ctx);
4843 if (err < 0)
4844 return err;
4845 }
4846 }
4847
4848 seg = &btf_ext->core_relo_info;
4849 for_each_btf_ext_sec(seg, sec) {
4850 struct bpf_core_relo *rec;
4851
4852 for_each_btf_ext_rec(seg, sec, i, rec) {
4853 err = visit(&rec->type_id, ctx);
4854 if (err < 0)
4855 return err;
4856 }
4857 }
4858
4859 return 0;
4860}
4861
4862int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
4863{
4864 const struct btf_ext_info *seg;
4865 struct btf_ext_info_sec *sec;
4866 int i, err;
4867
4868 seg = &btf_ext->func_info;
4869 for_each_btf_ext_sec(seg, sec) {
4870 err = visit(&sec->sec_name_off, ctx);
4871 if (err)
4872 return err;
4873 }
4874
4875 seg = &btf_ext->line_info;
4876 for_each_btf_ext_sec(seg, sec) {
4877 struct bpf_line_info_min *rec;
4878
4879 err = visit(&sec->sec_name_off, ctx);
4880 if (err)
4881 return err;
4882
4883 for_each_btf_ext_rec(seg, sec, i, rec) {
4884 err = visit(&rec->file_name_off, ctx);
4885 if (err)
4886 return err;
4887 err = visit(&rec->line_off, ctx);
4888 if (err)
4889 return err;
4890 }
4891 }
4892
4893 seg = &btf_ext->core_relo_info;
4894 for_each_btf_ext_sec(seg, sec) {
4895 struct bpf_core_relo *rec;
4896
4897 err = visit(&sec->sec_name_off, ctx);
4898 if (err)
4899 return err;
4900
4901 for_each_btf_ext_rec(seg, sec, i, rec) {
4902 err = visit(&rec->access_str_off, ctx);
4903 if (err)
4904 return err;
4905 }
4906 }
4907
4908 return 0;
4909}
4910