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