Coverage Report

Created: 2023-11-19 06:03

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