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