linux/kernel/bpf/btf.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (c) 2018 Facebook */
   3
   4#include <uapi/linux/btf.h>
   5#include <uapi/linux/types.h>
   6#include <linux/seq_file.h>
   7#include <linux/compiler.h>
   8#include <linux/ctype.h>
   9#include <linux/errno.h>
  10#include <linux/slab.h>
  11#include <linux/anon_inodes.h>
  12#include <linux/file.h>
  13#include <linux/uaccess.h>
  14#include <linux/kernel.h>
  15#include <linux/idr.h>
  16#include <linux/sort.h>
  17#include <linux/bpf_verifier.h>
  18#include <linux/btf.h>
  19
  20/* BTF (BPF Type Format) is the meta data format which describes
  21 * the data types of BPF program/map.  Hence, it basically focus
  22 * on the C programming language which the modern BPF is primary
  23 * using.
  24 *
  25 * ELF Section:
  26 * ~~~~~~~~~~~
  27 * The BTF data is stored under the ".BTF" ELF section
  28 *
  29 * struct btf_type:
  30 * ~~~~~~~~~~~~~~~
  31 * Each 'struct btf_type' object describes a C data type.
  32 * Depending on the type it is describing, a 'struct btf_type'
  33 * object may be followed by more data.  F.e.
  34 * To describe an array, 'struct btf_type' is followed by
  35 * 'struct btf_array'.
  36 *
  37 * 'struct btf_type' and any extra data following it are
  38 * 4 bytes aligned.
  39 *
  40 * Type section:
  41 * ~~~~~~~~~~~~~
  42 * The BTF type section contains a list of 'struct btf_type' objects.
  43 * Each one describes a C type.  Recall from the above section
  44 * that a 'struct btf_type' object could be immediately followed by extra
  45 * data in order to desribe some particular C types.
  46 *
  47 * type_id:
  48 * ~~~~~~~
  49 * Each btf_type object is identified by a type_id.  The type_id
  50 * is implicitly implied by the location of the btf_type object in
  51 * the BTF type section.  The first one has type_id 1.  The second
  52 * one has type_id 2...etc.  Hence, an earlier btf_type has
  53 * a smaller type_id.
  54 *
  55 * A btf_type object may refer to another btf_type object by using
  56 * type_id (i.e. the "type" in the "struct btf_type").
  57 *
  58 * NOTE that we cannot assume any reference-order.
  59 * A btf_type object can refer to an earlier btf_type object
  60 * but it can also refer to a later btf_type object.
  61 *
  62 * For example, to describe "const void *".  A btf_type
  63 * object describing "const" may refer to another btf_type
  64 * object describing "void *".  This type-reference is done
  65 * by specifying type_id:
  66 *
  67 * [1] CONST (anon) type_id=2
  68 * [2] PTR (anon) type_id=0
  69 *
  70 * The above is the btf_verifier debug log:
  71 *   - Each line started with "[?]" is a btf_type object
  72 *   - [?] is the type_id of the btf_type object.
  73 *   - CONST/PTR is the BTF_KIND_XXX
  74 *   - "(anon)" is the name of the type.  It just
  75 *     happens that CONST and PTR has no name.
  76 *   - type_id=XXX is the 'u32 type' in btf_type
  77 *
  78 * NOTE: "void" has type_id 0
  79 *
  80 * String section:
  81 * ~~~~~~~~~~~~~~
  82 * The BTF string section contains the names used by the type section.
  83 * Each string is referred by an "offset" from the beginning of the
  84 * string section.
  85 *
  86 * Each string is '\0' terminated.
  87 *
  88 * The first character in the string section must be '\0'
  89 * which is used to mean 'anonymous'. Some btf_type may not
  90 * have a name.
  91 */
  92
  93/* BTF verification:
  94 *
  95 * To verify BTF data, two passes are needed.
  96 *
  97 * Pass #1
  98 * ~~~~~~~
  99 * The first pass is to collect all btf_type objects to
 100 * an array: "btf->types".
 101 *
 102 * Depending on the C type that a btf_type is describing,
 103 * a btf_type may be followed by extra data.  We don't know
 104 * how many btf_type is there, and more importantly we don't
 105 * know where each btf_type is located in the type section.
 106 *
 107 * Without knowing the location of each type_id, most verifications
 108 * cannot be done.  e.g. an earlier btf_type may refer to a later
 109 * btf_type (recall the "const void *" above), so we cannot
 110 * check this type-reference in the first pass.
 111 *
 112 * In the first pass, it still does some verifications (e.g.
 113 * checking the name is a valid offset to the string section).
 114 *
 115 * Pass #2
 116 * ~~~~~~~
 117 * The main focus is to resolve a btf_type that is referring
 118 * to another type.
 119 *
 120 * We have to ensure the referring type:
 121 * 1) does exist in the BTF (i.e. in btf->types[])
 122 * 2) does not cause a loop:
 123 *      struct A {
 124 *              struct B b;
 125 *      };
 126 *
 127 *      struct B {
 128 *              struct A a;
 129 *      };
 130 *
 131 * btf_type_needs_resolve() decides if a btf_type needs
 132 * to be resolved.
 133 *
 134 * The needs_resolve type implements the "resolve()" ops which
 135 * essentially does a DFS and detects backedge.
 136 *
 137 * During resolve (or DFS), different C types have different
 138 * "RESOLVED" conditions.
 139 *
 140 * When resolving a BTF_KIND_STRUCT, we need to resolve all its
 141 * members because a member is always referring to another
 142 * type.  A struct's member can be treated as "RESOLVED" if
 143 * it is referring to a BTF_KIND_PTR.  Otherwise, the
 144 * following valid C struct would be rejected:
 145 *
 146 *      struct A {
 147 *              int m;
 148 *              struct A *a;
 149 *      };
 150 *
 151 * When resolving a BTF_KIND_PTR, it needs to keep resolving if
 152 * it is referring to another BTF_KIND_PTR.  Otherwise, we cannot
 153 * detect a pointer loop, e.g.:
 154 * BTF_KIND_CONST -> BTF_KIND_PTR -> BTF_KIND_CONST -> BTF_KIND_PTR +
 155 *                        ^                                         |
 156 *                        +-----------------------------------------+
 157 *
 158 */
 159
 160#define BITS_PER_U128 (sizeof(u64) * BITS_PER_BYTE * 2)
 161#define BITS_PER_BYTE_MASK (BITS_PER_BYTE - 1)
 162#define BITS_PER_BYTE_MASKED(bits) ((bits) & BITS_PER_BYTE_MASK)
 163#define BITS_ROUNDDOWN_BYTES(bits) ((bits) >> 3)
 164#define BITS_ROUNDUP_BYTES(bits) \
 165        (BITS_ROUNDDOWN_BYTES(bits) + !!BITS_PER_BYTE_MASKED(bits))
 166
 167#define BTF_INFO_MASK 0x8f00ffff
 168#define BTF_INT_MASK 0x0fffffff
 169#define BTF_TYPE_ID_VALID(type_id) ((type_id) <= BTF_MAX_TYPE)
 170#define BTF_STR_OFFSET_VALID(name_off) ((name_off) <= BTF_MAX_NAME_OFFSET)
 171
 172/* 16MB for 64k structs and each has 16 members and
 173 * a few MB spaces for the string section.
 174 * The hard limit is S32_MAX.
 175 */
 176#define BTF_MAX_SIZE (16 * 1024 * 1024)
 177
 178#define for_each_member(i, struct_type, member)                 \
 179        for (i = 0, member = btf_type_member(struct_type);      \
 180             i < btf_type_vlen(struct_type);                    \
 181             i++, member++)
 182
 183#define for_each_member_from(i, from, struct_type, member)              \
 184        for (i = from, member = btf_type_member(struct_type) + from;    \
 185             i < btf_type_vlen(struct_type);                            \
 186             i++, member++)
 187
 188#define for_each_vsi(i, struct_type, member)                    \
 189        for (i = 0, member = btf_type_var_secinfo(struct_type); \
 190             i < btf_type_vlen(struct_type);                    \
 191             i++, member++)
 192
 193#define for_each_vsi_from(i, from, struct_type, member)                         \
 194        for (i = from, member = btf_type_var_secinfo(struct_type) + from;       \
 195             i < btf_type_vlen(struct_type);                                    \
 196             i++, member++)
 197
 198DEFINE_IDR(btf_idr);
 199DEFINE_SPINLOCK(btf_idr_lock);
 200
 201struct btf {
 202        void *data;
 203        struct btf_type **types;
 204        u32 *resolved_ids;
 205        u32 *resolved_sizes;
 206        const char *strings;
 207        void *nohdr_data;
 208        struct btf_header hdr;
 209        u32 nr_types;
 210        u32 types_size;
 211        u32 data_size;
 212        refcount_t refcnt;
 213        u32 id;
 214        struct rcu_head rcu;
 215};
 216
 217enum verifier_phase {
 218        CHECK_META,
 219        CHECK_TYPE,
 220};
 221
 222struct resolve_vertex {
 223        const struct btf_type *t;
 224        u32 type_id;
 225        u16 next_member;
 226};
 227
 228enum visit_state {
 229        NOT_VISITED,
 230        VISITED,
 231        RESOLVED,
 232};
 233
 234enum resolve_mode {
 235        RESOLVE_TBD,    /* To Be Determined */
 236        RESOLVE_PTR,    /* Resolving for Pointer */
 237        RESOLVE_STRUCT_OR_ARRAY,        /* Resolving for struct/union
 238                                         * or array
 239                                         */
 240};
 241
 242#define MAX_RESOLVE_DEPTH 32
 243
 244struct btf_sec_info {
 245        u32 off;
 246        u32 len;
 247};
 248
 249struct btf_verifier_env {
 250        struct btf *btf;
 251        u8 *visit_states;
 252        struct resolve_vertex stack[MAX_RESOLVE_DEPTH];
 253        struct bpf_verifier_log log;
 254        u32 log_type_id;
 255        u32 top_stack;
 256        enum verifier_phase phase;
 257        enum resolve_mode resolve_mode;
 258};
 259
 260static const char * const btf_kind_str[NR_BTF_KINDS] = {
 261        [BTF_KIND_UNKN]         = "UNKNOWN",
 262        [BTF_KIND_INT]          = "INT",
 263        [BTF_KIND_PTR]          = "PTR",
 264        [BTF_KIND_ARRAY]        = "ARRAY",
 265        [BTF_KIND_STRUCT]       = "STRUCT",
 266        [BTF_KIND_UNION]        = "UNION",
 267        [BTF_KIND_ENUM]         = "ENUM",
 268        [BTF_KIND_FWD]          = "FWD",
 269        [BTF_KIND_TYPEDEF]      = "TYPEDEF",
 270        [BTF_KIND_VOLATILE]     = "VOLATILE",
 271        [BTF_KIND_CONST]        = "CONST",
 272        [BTF_KIND_RESTRICT]     = "RESTRICT",
 273        [BTF_KIND_FUNC]         = "FUNC",
 274        [BTF_KIND_FUNC_PROTO]   = "FUNC_PROTO",
 275        [BTF_KIND_VAR]          = "VAR",
 276        [BTF_KIND_DATASEC]      = "DATASEC",
 277};
 278
 279struct btf_kind_operations {
 280        s32 (*check_meta)(struct btf_verifier_env *env,
 281                          const struct btf_type *t,
 282                          u32 meta_left);
 283        int (*resolve)(struct btf_verifier_env *env,
 284                       const struct resolve_vertex *v);
 285        int (*check_member)(struct btf_verifier_env *env,
 286                            const struct btf_type *struct_type,
 287                            const struct btf_member *member,
 288                            const struct btf_type *member_type);
 289        int (*check_kflag_member)(struct btf_verifier_env *env,
 290                                  const struct btf_type *struct_type,
 291                                  const struct btf_member *member,
 292                                  const struct btf_type *member_type);
 293        void (*log_details)(struct btf_verifier_env *env,
 294                            const struct btf_type *t);
 295        void (*seq_show)(const struct btf *btf, const struct btf_type *t,
 296                         u32 type_id, void *data, u8 bits_offsets,
 297                         struct seq_file *m);
 298};
 299
 300static const struct btf_kind_operations * const kind_ops[NR_BTF_KINDS];
 301static struct btf_type btf_void;
 302
 303static int btf_resolve(struct btf_verifier_env *env,
 304                       const struct btf_type *t, u32 type_id);
 305
 306static bool btf_type_is_modifier(const struct btf_type *t)
 307{
 308        /* Some of them is not strictly a C modifier
 309         * but they are grouped into the same bucket
 310         * for BTF concern:
 311         *   A type (t) that refers to another
 312         *   type through t->type AND its size cannot
 313         *   be determined without following the t->type.
 314         *
 315         * ptr does not fall into this bucket
 316         * because its size is always sizeof(void *).
 317         */
 318        switch (BTF_INFO_KIND(t->info)) {
 319        case BTF_KIND_TYPEDEF:
 320        case BTF_KIND_VOLATILE:
 321        case BTF_KIND_CONST:
 322        case BTF_KIND_RESTRICT:
 323                return true;
 324        }
 325
 326        return false;
 327}
 328
 329bool btf_type_is_void(const struct btf_type *t)
 330{
 331        return t == &btf_void;
 332}
 333
 334static bool btf_type_is_fwd(const struct btf_type *t)
 335{
 336        return BTF_INFO_KIND(t->info) == BTF_KIND_FWD;
 337}
 338
 339static bool btf_type_is_func(const struct btf_type *t)
 340{
 341        return BTF_INFO_KIND(t->info) == BTF_KIND_FUNC;
 342}
 343
 344static bool btf_type_is_func_proto(const struct btf_type *t)
 345{
 346        return BTF_INFO_KIND(t->info) == BTF_KIND_FUNC_PROTO;
 347}
 348
 349static bool btf_type_nosize(const struct btf_type *t)
 350{
 351        return btf_type_is_void(t) || btf_type_is_fwd(t) ||
 352               btf_type_is_func(t) || btf_type_is_func_proto(t);
 353}
 354
 355static bool btf_type_nosize_or_null(const struct btf_type *t)
 356{
 357        return !t || btf_type_nosize(t);
 358}
 359
 360/* union is only a special case of struct:
 361 * all its offsetof(member) == 0
 362 */
 363static bool btf_type_is_struct(const struct btf_type *t)
 364{
 365        u8 kind = BTF_INFO_KIND(t->info);
 366
 367        return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION;
 368}
 369
 370static bool __btf_type_is_struct(const struct btf_type *t)
 371{
 372        return BTF_INFO_KIND(t->info) == BTF_KIND_STRUCT;
 373}
 374
 375static bool btf_type_is_array(const struct btf_type *t)
 376{
 377        return BTF_INFO_KIND(t->info) == BTF_KIND_ARRAY;
 378}
 379
 380static bool btf_type_is_ptr(const struct btf_type *t)
 381{
 382        return BTF_INFO_KIND(t->info) == BTF_KIND_PTR;
 383}
 384
 385static bool btf_type_is_int(const struct btf_type *t)
 386{
 387        return BTF_INFO_KIND(t->info) == BTF_KIND_INT;
 388}
 389
 390static bool btf_type_is_var(const struct btf_type *t)
 391{
 392        return BTF_INFO_KIND(t->info) == BTF_KIND_VAR;
 393}
 394
 395static bool btf_type_is_datasec(const struct btf_type *t)
 396{
 397        return BTF_INFO_KIND(t->info) == BTF_KIND_DATASEC;
 398}
 399
 400/* Types that act only as a source, not sink or intermediate
 401 * type when resolving.
 402 */
 403static bool btf_type_is_resolve_source_only(const struct btf_type *t)
 404{
 405        return btf_type_is_var(t) ||
 406               btf_type_is_datasec(t);
 407}
 408
 409/* What types need to be resolved?
 410 *
 411 * btf_type_is_modifier() is an obvious one.
 412 *
 413 * btf_type_is_struct() because its member refers to
 414 * another type (through member->type).
 415 *
 416 * btf_type_is_var() because the variable refers to
 417 * another type. btf_type_is_datasec() holds multiple
 418 * btf_type_is_var() types that need resolving.
 419 *
 420 * btf_type_is_array() because its element (array->type)
 421 * refers to another type.  Array can be thought of a
 422 * special case of struct while array just has the same
 423 * member-type repeated by array->nelems of times.
 424 */
 425static bool btf_type_needs_resolve(const struct btf_type *t)
 426{
 427        return btf_type_is_modifier(t) ||
 428               btf_type_is_ptr(t) ||
 429               btf_type_is_struct(t) ||
 430               btf_type_is_array(t) ||
 431               btf_type_is_var(t) ||
 432               btf_type_is_datasec(t);
 433}
 434
 435/* t->size can be used */
 436static bool btf_type_has_size(const struct btf_type *t)
 437{
 438        switch (BTF_INFO_KIND(t->info)) {
 439        case BTF_KIND_INT:
 440        case BTF_KIND_STRUCT:
 441        case BTF_KIND_UNION:
 442        case BTF_KIND_ENUM:
 443        case BTF_KIND_DATASEC:
 444                return true;
 445        }
 446
 447        return false;
 448}
 449
 450static const char *btf_int_encoding_str(u8 encoding)
 451{
 452        if (encoding == 0)
 453                return "(none)";
 454        else if (encoding == BTF_INT_SIGNED)
 455                return "SIGNED";
 456        else if (encoding == BTF_INT_CHAR)
 457                return "CHAR";
 458        else if (encoding == BTF_INT_BOOL)
 459                return "BOOL";
 460        else
 461                return "UNKN";
 462}
 463
 464static u16 btf_type_vlen(const struct btf_type *t)
 465{
 466        return BTF_INFO_VLEN(t->info);
 467}
 468
 469static bool btf_type_kflag(const struct btf_type *t)
 470{
 471        return BTF_INFO_KFLAG(t->info);
 472}
 473
 474static u32 btf_member_bit_offset(const struct btf_type *struct_type,
 475                             const struct btf_member *member)
 476{
 477        return btf_type_kflag(struct_type) ? BTF_MEMBER_BIT_OFFSET(member->offset)
 478                                           : member->offset;
 479}
 480
 481static u32 btf_member_bitfield_size(const struct btf_type *struct_type,
 482                                    const struct btf_member *member)
 483{
 484        return btf_type_kflag(struct_type) ? BTF_MEMBER_BITFIELD_SIZE(member->offset)
 485                                           : 0;
 486}
 487
 488static u32 btf_type_int(const struct btf_type *t)
 489{
 490        return *(u32 *)(t + 1);
 491}
 492
 493static const struct btf_array *btf_type_array(const struct btf_type *t)
 494{
 495        return (const struct btf_array *)(t + 1);
 496}
 497
 498static const struct btf_member *btf_type_member(const struct btf_type *t)
 499{
 500        return (const struct btf_member *)(t + 1);
 501}
 502
 503static const struct btf_enum *btf_type_enum(const struct btf_type *t)
 504{
 505        return (const struct btf_enum *)(t + 1);
 506}
 507
 508static const struct btf_var *btf_type_var(const struct btf_type *t)
 509{
 510        return (const struct btf_var *)(t + 1);
 511}
 512
 513static const struct btf_var_secinfo *btf_type_var_secinfo(const struct btf_type *t)
 514{
 515        return (const struct btf_var_secinfo *)(t + 1);
 516}
 517
 518static const struct btf_kind_operations *btf_type_ops(const struct btf_type *t)
 519{
 520        return kind_ops[BTF_INFO_KIND(t->info)];
 521}
 522
 523static bool btf_name_offset_valid(const struct btf *btf, u32 offset)
 524{
 525        return BTF_STR_OFFSET_VALID(offset) &&
 526                offset < btf->hdr.str_len;
 527}
 528
 529static bool __btf_name_char_ok(char c, bool first, bool dot_ok)
 530{
 531        if ((first ? !isalpha(c) :
 532                     !isalnum(c)) &&
 533            c != '_' &&
 534            ((c == '.' && !dot_ok) ||
 535              c != '.'))
 536                return false;
 537        return true;
 538}
 539
 540static bool __btf_name_valid(const struct btf *btf, u32 offset, bool dot_ok)
 541{
 542        /* offset must be valid */
 543        const char *src = &btf->strings[offset];
 544        const char *src_limit;
 545
 546        if (!__btf_name_char_ok(*src, true, dot_ok))
 547                return false;
 548
 549        /* set a limit on identifier length */
 550        src_limit = src + KSYM_NAME_LEN;
 551        src++;
 552        while (*src && src < src_limit) {
 553                if (!__btf_name_char_ok(*src, false, dot_ok))
 554                        return false;
 555                src++;
 556        }
 557
 558        return !*src;
 559}
 560
 561/* Only C-style identifier is permitted. This can be relaxed if
 562 * necessary.
 563 */
 564static bool btf_name_valid_identifier(const struct btf *btf, u32 offset)
 565{
 566        return __btf_name_valid(btf, offset, false);
 567}
 568
 569static bool btf_name_valid_section(const struct btf *btf, u32 offset)
 570{
 571        return __btf_name_valid(btf, offset, true);
 572}
 573
 574static const char *__btf_name_by_offset(const struct btf *btf, u32 offset)
 575{
 576        if (!offset)
 577                return "(anon)";
 578        else if (offset < btf->hdr.str_len)
 579                return &btf->strings[offset];
 580        else
 581                return "(invalid-name-offset)";
 582}
 583
 584const char *btf_name_by_offset(const struct btf *btf, u32 offset)
 585{
 586        if (offset < btf->hdr.str_len)
 587                return &btf->strings[offset];
 588
 589        return NULL;
 590}
 591
 592const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id)
 593{
 594        if (type_id > btf->nr_types)
 595                return NULL;
 596
 597        return btf->types[type_id];
 598}
 599
 600/*
 601 * Regular int is not a bit field and it must be either
 602 * u8/u16/u32/u64 or __int128.
 603 */
 604static bool btf_type_int_is_regular(const struct btf_type *t)
 605{
 606        u8 nr_bits, nr_bytes;
 607        u32 int_data;
 608
 609        int_data = btf_type_int(t);
 610        nr_bits = BTF_INT_BITS(int_data);
 611        nr_bytes = BITS_ROUNDUP_BYTES(nr_bits);
 612        if (BITS_PER_BYTE_MASKED(nr_bits) ||
 613            BTF_INT_OFFSET(int_data) ||
 614            (nr_bytes != sizeof(u8) && nr_bytes != sizeof(u16) &&
 615             nr_bytes != sizeof(u32) && nr_bytes != sizeof(u64) &&
 616             nr_bytes != (2 * sizeof(u64)))) {
 617                return false;
 618        }
 619
 620        return true;
 621}
 622
 623/*
 624 * Check that given struct member is a regular int with expected
 625 * offset and size.
 626 */
 627bool btf_member_is_reg_int(const struct btf *btf, const struct btf_type *s,
 628                           const struct btf_member *m,
 629                           u32 expected_offset, u32 expected_size)
 630{
 631        const struct btf_type *t;
 632        u32 id, int_data;
 633        u8 nr_bits;
 634
 635        id = m->type;
 636        t = btf_type_id_size(btf, &id, NULL);
 637        if (!t || !btf_type_is_int(t))
 638                return false;
 639
 640        int_data = btf_type_int(t);
 641        nr_bits = BTF_INT_BITS(int_data);
 642        if (btf_type_kflag(s)) {
 643                u32 bitfield_size = BTF_MEMBER_BITFIELD_SIZE(m->offset);
 644                u32 bit_offset = BTF_MEMBER_BIT_OFFSET(m->offset);
 645
 646                /* if kflag set, int should be a regular int and
 647                 * bit offset should be at byte boundary.
 648                 */
 649                return !bitfield_size &&
 650                       BITS_ROUNDUP_BYTES(bit_offset) == expected_offset &&
 651                       BITS_ROUNDUP_BYTES(nr_bits) == expected_size;
 652        }
 653
 654        if (BTF_INT_OFFSET(int_data) ||
 655            BITS_PER_BYTE_MASKED(m->offset) ||
 656            BITS_ROUNDUP_BYTES(m->offset) != expected_offset ||
 657            BITS_PER_BYTE_MASKED(nr_bits) ||
 658            BITS_ROUNDUP_BYTES(nr_bits) != expected_size)
 659                return false;
 660
 661        return true;
 662}
 663
 664__printf(2, 3) static void __btf_verifier_log(struct bpf_verifier_log *log,
 665                                              const char *fmt, ...)
 666{
 667        va_list args;
 668
 669        va_start(args, fmt);
 670        bpf_verifier_vlog(log, fmt, args);
 671        va_end(args);
 672}
 673
 674__printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env,
 675                                            const char *fmt, ...)
 676{
 677        struct bpf_verifier_log *log = &env->log;
 678        va_list args;
 679
 680        if (!bpf_verifier_log_needed(log))
 681                return;
 682
 683        va_start(args, fmt);
 684        bpf_verifier_vlog(log, fmt, args);
 685        va_end(args);
 686}
 687
 688__printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env,
 689                                                   const struct btf_type *t,
 690                                                   bool log_details,
 691                                                   const char *fmt, ...)
 692{
 693        struct bpf_verifier_log *log = &env->log;
 694        u8 kind = BTF_INFO_KIND(t->info);
 695        struct btf *btf = env->btf;
 696        va_list args;
 697
 698        if (!bpf_verifier_log_needed(log))
 699                return;
 700
 701        __btf_verifier_log(log, "[%u] %s %s%s",
 702                           env->log_type_id,
 703                           btf_kind_str[kind],
 704                           __btf_name_by_offset(btf, t->name_off),
 705                           log_details ? " " : "");
 706
 707        if (log_details)
 708                btf_type_ops(t)->log_details(env, t);
 709
 710        if (fmt && *fmt) {
 711                __btf_verifier_log(log, " ");
 712                va_start(args, fmt);
 713                bpf_verifier_vlog(log, fmt, args);
 714                va_end(args);
 715        }
 716
 717        __btf_verifier_log(log, "\n");
 718}
 719
 720#define btf_verifier_log_type(env, t, ...) \
 721        __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
 722#define btf_verifier_log_basic(env, t, ...) \
 723        __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
 724
 725__printf(4, 5)
 726static void btf_verifier_log_member(struct btf_verifier_env *env,
 727                                    const struct btf_type *struct_type,
 728                                    const struct btf_member *member,
 729                                    const char *fmt, ...)
 730{
 731        struct bpf_verifier_log *log = &env->log;
 732        struct btf *btf = env->btf;
 733        va_list args;
 734
 735        if (!bpf_verifier_log_needed(log))
 736                return;
 737
 738        /* The CHECK_META phase already did a btf dump.
 739         *
 740         * If member is logged again, it must hit an error in
 741         * parsing this member.  It is useful to print out which
 742         * struct this member belongs to.
 743         */
 744        if (env->phase != CHECK_META)
 745                btf_verifier_log_type(env, struct_type, NULL);
 746
 747        if (btf_type_kflag(struct_type))
 748                __btf_verifier_log(log,
 749                                   "\t%s type_id=%u bitfield_size=%u bits_offset=%u",
 750                                   __btf_name_by_offset(btf, member->name_off),
 751                                   member->type,
 752                                   BTF_MEMBER_BITFIELD_SIZE(member->offset),
 753                                   BTF_MEMBER_BIT_OFFSET(member->offset));
 754        else
 755                __btf_verifier_log(log, "\t%s type_id=%u bits_offset=%u",
 756                                   __btf_name_by_offset(btf, member->name_off),
 757                                   member->type, member->offset);
 758
 759        if (fmt && *fmt) {
 760                __btf_verifier_log(log, " ");
 761                va_start(args, fmt);
 762                bpf_verifier_vlog(log, fmt, args);
 763                va_end(args);
 764        }
 765
 766        __btf_verifier_log(log, "\n");
 767}
 768
 769__printf(4, 5)
 770static void btf_verifier_log_vsi(struct btf_verifier_env *env,
 771                                 const struct btf_type *datasec_type,
 772                                 const struct btf_var_secinfo *vsi,
 773                                 const char *fmt, ...)
 774{
 775        struct bpf_verifier_log *log = &env->log;
 776        va_list args;
 777
 778        if (!bpf_verifier_log_needed(log))
 779                return;
 780        if (env->phase != CHECK_META)
 781                btf_verifier_log_type(env, datasec_type, NULL);
 782
 783        __btf_verifier_log(log, "\t type_id=%u offset=%u size=%u",
 784                           vsi->type, vsi->offset, vsi->size);
 785        if (fmt && *fmt) {
 786                __btf_verifier_log(log, " ");
 787                va_start(args, fmt);
 788                bpf_verifier_vlog(log, fmt, args);
 789                va_end(args);
 790        }
 791
 792        __btf_verifier_log(log, "\n");
 793}
 794
 795static void btf_verifier_log_hdr(struct btf_verifier_env *env,
 796                                 u32 btf_data_size)
 797{
 798        struct bpf_verifier_log *log = &env->log;
 799        const struct btf *btf = env->btf;
 800        const struct btf_header *hdr;
 801
 802        if (!bpf_verifier_log_needed(log))
 803                return;
 804
 805        hdr = &btf->hdr;
 806        __btf_verifier_log(log, "magic: 0x%x\n", hdr->magic);
 807        __btf_verifier_log(log, "version: %u\n", hdr->version);
 808        __btf_verifier_log(log, "flags: 0x%x\n", hdr->flags);
 809        __btf_verifier_log(log, "hdr_len: %u\n", hdr->hdr_len);
 810        __btf_verifier_log(log, "type_off: %u\n", hdr->type_off);
 811        __btf_verifier_log(log, "type_len: %u\n", hdr->type_len);
 812        __btf_verifier_log(log, "str_off: %u\n", hdr->str_off);
 813        __btf_verifier_log(log, "str_len: %u\n", hdr->str_len);
 814        __btf_verifier_log(log, "btf_total_size: %u\n", btf_data_size);
 815}
 816
 817static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t)
 818{
 819        struct btf *btf = env->btf;
 820
 821        /* < 2 because +1 for btf_void which is always in btf->types[0].
 822         * btf_void is not accounted in btf->nr_types because btf_void
 823         * does not come from the BTF file.
 824         */
 825        if (btf->types_size - btf->nr_types < 2) {
 826                /* Expand 'types' array */
 827
 828                struct btf_type **new_types;
 829                u32 expand_by, new_size;
 830
 831                if (btf->types_size == BTF_MAX_TYPE) {
 832                        btf_verifier_log(env, "Exceeded max num of types");
 833                        return -E2BIG;
 834                }
 835
 836                expand_by = max_t(u32, btf->types_size >> 2, 16);
 837                new_size = min_t(u32, BTF_MAX_TYPE,
 838                                 btf->types_size + expand_by);
 839
 840                new_types = kvcalloc(new_size, sizeof(*new_types),
 841                                     GFP_KERNEL | __GFP_NOWARN);
 842                if (!new_types)
 843                        return -ENOMEM;
 844
 845                if (btf->nr_types == 0)
 846                        new_types[0] = &btf_void;
 847                else
 848                        memcpy(new_types, btf->types,
 849                               sizeof(*btf->types) * (btf->nr_types + 1));
 850
 851                kvfree(btf->types);
 852                btf->types = new_types;
 853                btf->types_size = new_size;
 854        }
 855
 856        btf->types[++(btf->nr_types)] = t;
 857
 858        return 0;
 859}
 860
 861static int btf_alloc_id(struct btf *btf)
 862{
 863        int id;
 864
 865        idr_preload(GFP_KERNEL);
 866        spin_lock_bh(&btf_idr_lock);
 867        id = idr_alloc_cyclic(&btf_idr, btf, 1, INT_MAX, GFP_ATOMIC);
 868        if (id > 0)
 869                btf->id = id;
 870        spin_unlock_bh(&btf_idr_lock);
 871        idr_preload_end();
 872
 873        if (WARN_ON_ONCE(!id))
 874                return -ENOSPC;
 875
 876        return id > 0 ? 0 : id;
 877}
 878
 879static void btf_free_id(struct btf *btf)
 880{
 881        unsigned long flags;
 882
 883        /*
 884         * In map-in-map, calling map_delete_elem() on outer
 885         * map will call bpf_map_put on the inner map.
 886         * It will then eventually call btf_free_id()
 887         * on the inner map.  Some of the map_delete_elem()
 888         * implementation may have irq disabled, so
 889         * we need to use the _irqsave() version instead
 890         * of the _bh() version.
 891         */
 892        spin_lock_irqsave(&btf_idr_lock, flags);
 893        idr_remove(&btf_idr, btf->id);
 894        spin_unlock_irqrestore(&btf_idr_lock, flags);
 895}
 896
 897static void btf_free(struct btf *btf)
 898{
 899        kvfree(btf->types);
 900        kvfree(btf->resolved_sizes);
 901        kvfree(btf->resolved_ids);
 902        kvfree(btf->data);
 903        kfree(btf);
 904}
 905
 906static void btf_free_rcu(struct rcu_head *rcu)
 907{
 908        struct btf *btf = container_of(rcu, struct btf, rcu);
 909
 910        btf_free(btf);
 911}
 912
 913void btf_put(struct btf *btf)
 914{
 915        if (btf && refcount_dec_and_test(&btf->refcnt)) {
 916                btf_free_id(btf);
 917                call_rcu(&btf->rcu, btf_free_rcu);
 918        }
 919}
 920
 921static int env_resolve_init(struct btf_verifier_env *env)
 922{
 923        struct btf *btf = env->btf;
 924        u32 nr_types = btf->nr_types;
 925        u32 *resolved_sizes = NULL;
 926        u32 *resolved_ids = NULL;
 927        u8 *visit_states = NULL;
 928
 929        /* +1 for btf_void */
 930        resolved_sizes = kvcalloc(nr_types + 1, sizeof(*resolved_sizes),
 931                                  GFP_KERNEL | __GFP_NOWARN);
 932        if (!resolved_sizes)
 933                goto nomem;
 934
 935        resolved_ids = kvcalloc(nr_types + 1, sizeof(*resolved_ids),
 936                                GFP_KERNEL | __GFP_NOWARN);
 937        if (!resolved_ids)
 938                goto nomem;
 939
 940        visit_states = kvcalloc(nr_types + 1, sizeof(*visit_states),
 941                                GFP_KERNEL | __GFP_NOWARN);
 942        if (!visit_states)
 943                goto nomem;
 944
 945        btf->resolved_sizes = resolved_sizes;
 946        btf->resolved_ids = resolved_ids;
 947        env->visit_states = visit_states;
 948
 949        return 0;
 950
 951nomem:
 952        kvfree(resolved_sizes);
 953        kvfree(resolved_ids);
 954        kvfree(visit_states);
 955        return -ENOMEM;
 956}
 957
 958static void btf_verifier_env_free(struct btf_verifier_env *env)
 959{
 960        kvfree(env->visit_states);
 961        kfree(env);
 962}
 963
 964static bool env_type_is_resolve_sink(const struct btf_verifier_env *env,
 965                                     const struct btf_type *next_type)
 966{
 967        switch (env->resolve_mode) {
 968        case RESOLVE_TBD:
 969                /* int, enum or void is a sink */
 970                return !btf_type_needs_resolve(next_type);
 971        case RESOLVE_PTR:
 972                /* int, enum, void, struct, array, func or func_proto is a sink
 973                 * for ptr
 974                 */
 975                return !btf_type_is_modifier(next_type) &&
 976                        !btf_type_is_ptr(next_type);
 977        case RESOLVE_STRUCT_OR_ARRAY:
 978                /* int, enum, void, ptr, func or func_proto is a sink
 979                 * for struct and array
 980                 */
 981                return !btf_type_is_modifier(next_type) &&
 982                        !btf_type_is_array(next_type) &&
 983                        !btf_type_is_struct(next_type);
 984        default:
 985                BUG();
 986        }
 987}
 988
 989static bool env_type_is_resolved(const struct btf_verifier_env *env,
 990                                 u32 type_id)
 991{
 992        return env->visit_states[type_id] == RESOLVED;
 993}
 994
 995static int env_stack_push(struct btf_verifier_env *env,
 996                          const struct btf_type *t, u32 type_id)
 997{
 998        struct resolve_vertex *v;
 999
1000        if (env->top_stack == MAX_RESOLVE_DEPTH)
1001                return -E2BIG;
1002
1003        if (env->visit_states[type_id] != NOT_VISITED)
1004                return -EEXIST;
1005
1006        env->visit_states[type_id] = VISITED;
1007
1008        v = &env->stack[env->top_stack++];
1009        v->t = t;
1010        v->type_id = type_id;
1011        v->next_member = 0;
1012
1013        if (env->resolve_mode == RESOLVE_TBD) {
1014                if (btf_type_is_ptr(t))
1015                        env->resolve_mode = RESOLVE_PTR;
1016                else if (btf_type_is_struct(t) || btf_type_is_array(t))
1017                        env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY;
1018        }
1019
1020        return 0;
1021}
1022
1023static void env_stack_set_next_member(struct btf_verifier_env *env,
1024                                      u16 next_member)
1025{
1026        env->stack[env->top_stack - 1].next_member = next_member;
1027}
1028
1029static void env_stack_pop_resolved(struct btf_verifier_env *env,
1030                                   u32 resolved_type_id,
1031                                   u32 resolved_size)
1032{
1033        u32 type_id = env->stack[--(env->top_stack)].type_id;
1034        struct btf *btf = env->btf;
1035
1036        btf->resolved_sizes[type_id] = resolved_size;
1037        btf->resolved_ids[type_id] = resolved_type_id;
1038        env->visit_states[type_id] = RESOLVED;
1039}
1040
1041static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env)
1042{
1043        return env->top_stack ? &env->stack[env->top_stack - 1] : NULL;
1044}
1045
1046/* The input param "type_id" must point to a needs_resolve type */
1047static const struct btf_type *btf_type_id_resolve(const struct btf *btf,
1048                                                  u32 *type_id)
1049{
1050        *type_id = btf->resolved_ids[*type_id];
1051        return btf_type_by_id(btf, *type_id);
1052}
1053
1054const struct btf_type *btf_type_id_size(const struct btf *btf,
1055                                        u32 *type_id, u32 *ret_size)
1056{
1057        const struct btf_type *size_type;
1058        u32 size_type_id = *type_id;
1059        u32 size = 0;
1060
1061        size_type = btf_type_by_id(btf, size_type_id);
1062        if (btf_type_nosize_or_null(size_type))
1063                return NULL;
1064
1065        if (btf_type_has_size(size_type)) {
1066                size = size_type->size;
1067        } else if (btf_type_is_array(size_type)) {
1068                size = btf->resolved_sizes[size_type_id];
1069        } else if (btf_type_is_ptr(size_type)) {
1070                size = sizeof(void *);
1071        } else {
1072                if (WARN_ON_ONCE(!btf_type_is_modifier(size_type) &&
1073                                 !btf_type_is_var(size_type)))
1074                        return NULL;
1075
1076                size_type_id = btf->resolved_ids[size_type_id];
1077                size_type = btf_type_by_id(btf, size_type_id);
1078                if (btf_type_nosize_or_null(size_type))
1079                        return NULL;
1080                else if (btf_type_has_size(size_type))
1081                        size = size_type->size;
1082                else if (btf_type_is_array(size_type))
1083                        size = btf->resolved_sizes[size_type_id];
1084                else if (btf_type_is_ptr(size_type))
1085                        size = sizeof(void *);
1086                else
1087                        return NULL;
1088        }
1089
1090        *type_id = size_type_id;
1091        if (ret_size)
1092                *ret_size = size;
1093
1094        return size_type;
1095}
1096
1097static int btf_df_check_member(struct btf_verifier_env *env,
1098                               const struct btf_type *struct_type,
1099                               const struct btf_member *member,
1100                               const struct btf_type *member_type)
1101{
1102        btf_verifier_log_basic(env, struct_type,
1103                               "Unsupported check_member");
1104        return -EINVAL;
1105}
1106
1107static int btf_df_check_kflag_member(struct btf_verifier_env *env,
1108                                     const struct btf_type *struct_type,
1109                                     const struct btf_member *member,
1110                                     const struct btf_type *member_type)
1111{
1112        btf_verifier_log_basic(env, struct_type,
1113                               "Unsupported check_kflag_member");
1114        return -EINVAL;
1115}
1116
1117/* Used for ptr, array and struct/union type members.
1118 * int, enum and modifier types have their specific callback functions.
1119 */
1120static int btf_generic_check_kflag_member(struct btf_verifier_env *env,
1121                                          const struct btf_type *struct_type,
1122                                          const struct btf_member *member,
1123                                          const struct btf_type *member_type)
1124{
1125        if (BTF_MEMBER_BITFIELD_SIZE(member->offset)) {
1126                btf_verifier_log_member(env, struct_type, member,
1127                                        "Invalid member bitfield_size");
1128                return -EINVAL;
1129        }
1130
1131        /* bitfield size is 0, so member->offset represents bit offset only.
1132         * It is safe to call non kflag check_member variants.
1133         */
1134        return btf_type_ops(member_type)->check_member(env, struct_type,
1135                                                       member,
1136                                                       member_type);
1137}
1138
1139static int btf_df_resolve(struct btf_verifier_env *env,
1140                          const struct resolve_vertex *v)
1141{
1142        btf_verifier_log_basic(env, v->t, "Unsupported resolve");
1143        return -EINVAL;
1144}
1145
1146static void btf_df_seq_show(const struct btf *btf, const struct btf_type *t,
1147                            u32 type_id, void *data, u8 bits_offsets,
1148                            struct seq_file *m)
1149{
1150        seq_printf(m, "<unsupported kind:%u>", BTF_INFO_KIND(t->info));
1151}
1152
1153static int btf_int_check_member(struct btf_verifier_env *env,
1154                                const struct btf_type *struct_type,
1155                                const struct btf_member *member,
1156                                const struct btf_type *member_type)
1157{
1158        u32 int_data = btf_type_int(member_type);
1159        u32 struct_bits_off = member->offset;
1160        u32 struct_size = struct_type->size;
1161        u32 nr_copy_bits;
1162        u32 bytes_offset;
1163
1164        if (U32_MAX - struct_bits_off < BTF_INT_OFFSET(int_data)) {
1165                btf_verifier_log_member(env, struct_type, member,
1166                                        "bits_offset exceeds U32_MAX");
1167                return -EINVAL;
1168        }
1169
1170        struct_bits_off += BTF_INT_OFFSET(int_data);
1171        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
1172        nr_copy_bits = BTF_INT_BITS(int_data) +
1173                BITS_PER_BYTE_MASKED(struct_bits_off);
1174
1175        if (nr_copy_bits > BITS_PER_U128) {
1176                btf_verifier_log_member(env, struct_type, member,
1177                                        "nr_copy_bits exceeds 128");
1178                return -EINVAL;
1179        }
1180
1181        if (struct_size < bytes_offset ||
1182            struct_size - bytes_offset < BITS_ROUNDUP_BYTES(nr_copy_bits)) {
1183                btf_verifier_log_member(env, struct_type, member,
1184                                        "Member exceeds struct_size");
1185                return -EINVAL;
1186        }
1187
1188        return 0;
1189}
1190
1191static int btf_int_check_kflag_member(struct btf_verifier_env *env,
1192                                      const struct btf_type *struct_type,
1193                                      const struct btf_member *member,
1194                                      const struct btf_type *member_type)
1195{
1196        u32 struct_bits_off, nr_bits, nr_int_data_bits, bytes_offset;
1197        u32 int_data = btf_type_int(member_type);
1198        u32 struct_size = struct_type->size;
1199        u32 nr_copy_bits;
1200
1201        /* a regular int type is required for the kflag int member */
1202        if (!btf_type_int_is_regular(member_type)) {
1203                btf_verifier_log_member(env, struct_type, member,
1204                                        "Invalid member base type");
1205                return -EINVAL;
1206        }
1207
1208        /* check sanity of bitfield size */
1209        nr_bits = BTF_MEMBER_BITFIELD_SIZE(member->offset);
1210        struct_bits_off = BTF_MEMBER_BIT_OFFSET(member->offset);
1211        nr_int_data_bits = BTF_INT_BITS(int_data);
1212        if (!nr_bits) {
1213                /* Not a bitfield member, member offset must be at byte
1214                 * boundary.
1215                 */
1216                if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
1217                        btf_verifier_log_member(env, struct_type, member,
1218                                                "Invalid member offset");
1219                        return -EINVAL;
1220                }
1221
1222                nr_bits = nr_int_data_bits;
1223        } else if (nr_bits > nr_int_data_bits) {
1224                btf_verifier_log_member(env, struct_type, member,
1225                                        "Invalid member bitfield_size");
1226                return -EINVAL;
1227        }
1228
1229        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
1230        nr_copy_bits = nr_bits + BITS_PER_BYTE_MASKED(struct_bits_off);
1231        if (nr_copy_bits > BITS_PER_U128) {
1232                btf_verifier_log_member(env, struct_type, member,
1233                                        "nr_copy_bits exceeds 128");
1234                return -EINVAL;
1235        }
1236
1237        if (struct_size < bytes_offset ||
1238            struct_size - bytes_offset < BITS_ROUNDUP_BYTES(nr_copy_bits)) {
1239                btf_verifier_log_member(env, struct_type, member,
1240                                        "Member exceeds struct_size");
1241                return -EINVAL;
1242        }
1243
1244        return 0;
1245}
1246
1247static s32 btf_int_check_meta(struct btf_verifier_env *env,
1248                              const struct btf_type *t,
1249                              u32 meta_left)
1250{
1251        u32 int_data, nr_bits, meta_needed = sizeof(int_data);
1252        u16 encoding;
1253
1254        if (meta_left < meta_needed) {
1255                btf_verifier_log_basic(env, t,
1256                                       "meta_left:%u meta_needed:%u",
1257                                       meta_left, meta_needed);
1258                return -EINVAL;
1259        }
1260
1261        if (btf_type_vlen(t)) {
1262                btf_verifier_log_type(env, t, "vlen != 0");
1263                return -EINVAL;
1264        }
1265
1266        if (btf_type_kflag(t)) {
1267                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
1268                return -EINVAL;
1269        }
1270
1271        int_data = btf_type_int(t);
1272        if (int_data & ~BTF_INT_MASK) {
1273                btf_verifier_log_basic(env, t, "Invalid int_data:%x",
1274                                       int_data);
1275                return -EINVAL;
1276        }
1277
1278        nr_bits = BTF_INT_BITS(int_data) + BTF_INT_OFFSET(int_data);
1279
1280        if (nr_bits > BITS_PER_U128) {
1281                btf_verifier_log_type(env, t, "nr_bits exceeds %zu",
1282                                      BITS_PER_U128);
1283                return -EINVAL;
1284        }
1285
1286        if (BITS_ROUNDUP_BYTES(nr_bits) > t->size) {
1287                btf_verifier_log_type(env, t, "nr_bits exceeds type_size");
1288                return -EINVAL;
1289        }
1290
1291        /*
1292         * Only one of the encoding bits is allowed and it
1293         * should be sufficient for the pretty print purpose (i.e. decoding).
1294         * Multiple bits can be allowed later if it is found
1295         * to be insufficient.
1296         */
1297        encoding = BTF_INT_ENCODING(int_data);
1298        if (encoding &&
1299            encoding != BTF_INT_SIGNED &&
1300            encoding != BTF_INT_CHAR &&
1301            encoding != BTF_INT_BOOL) {
1302                btf_verifier_log_type(env, t, "Unsupported encoding");
1303                return -ENOTSUPP;
1304        }
1305
1306        btf_verifier_log_type(env, t, NULL);
1307
1308        return meta_needed;
1309}
1310
1311static void btf_int_log(struct btf_verifier_env *env,
1312                        const struct btf_type *t)
1313{
1314        int int_data = btf_type_int(t);
1315
1316        btf_verifier_log(env,
1317                         "size=%u bits_offset=%u nr_bits=%u encoding=%s",
1318                         t->size, BTF_INT_OFFSET(int_data),
1319                         BTF_INT_BITS(int_data),
1320                         btf_int_encoding_str(BTF_INT_ENCODING(int_data)));
1321}
1322
1323static void btf_int128_print(struct seq_file *m, void *data)
1324{
1325        /* data points to a __int128 number.
1326         * Suppose
1327         *     int128_num = *(__int128 *)data;
1328         * The below formulas shows what upper_num and lower_num represents:
1329         *     upper_num = int128_num >> 64;
1330         *     lower_num = int128_num & 0xffffffffFFFFFFFFULL;
1331         */
1332        u64 upper_num, lower_num;
1333
1334#ifdef __BIG_ENDIAN_BITFIELD
1335        upper_num = *(u64 *)data;
1336        lower_num = *(u64 *)(data + 8);
1337#else
1338        upper_num = *(u64 *)(data + 8);
1339        lower_num = *(u64 *)data;
1340#endif
1341        if (upper_num == 0)
1342                seq_printf(m, "0x%llx", lower_num);
1343        else
1344                seq_printf(m, "0x%llx%016llx", upper_num, lower_num);
1345}
1346
1347static void btf_int128_shift(u64 *print_num, u16 left_shift_bits,
1348                             u16 right_shift_bits)
1349{
1350        u64 upper_num, lower_num;
1351
1352#ifdef __BIG_ENDIAN_BITFIELD
1353        upper_num = print_num[0];
1354        lower_num = print_num[1];
1355#else
1356        upper_num = print_num[1];
1357        lower_num = print_num[0];
1358#endif
1359
1360        /* shake out un-needed bits by shift/or operations */
1361        if (left_shift_bits >= 64) {
1362                upper_num = lower_num << (left_shift_bits - 64);
1363                lower_num = 0;
1364        } else {
1365                upper_num = (upper_num << left_shift_bits) |
1366                            (lower_num >> (64 - left_shift_bits));
1367                lower_num = lower_num << left_shift_bits;
1368        }
1369
1370        if (right_shift_bits >= 64) {
1371                lower_num = upper_num >> (right_shift_bits - 64);
1372                upper_num = 0;
1373        } else {
1374                lower_num = (lower_num >> right_shift_bits) |
1375                            (upper_num << (64 - right_shift_bits));
1376                upper_num = upper_num >> right_shift_bits;
1377        }
1378
1379#ifdef __BIG_ENDIAN_BITFIELD
1380        print_num[0] = upper_num;
1381        print_num[1] = lower_num;
1382#else
1383        print_num[0] = lower_num;
1384        print_num[1] = upper_num;
1385#endif
1386}
1387
1388static void btf_bitfield_seq_show(void *data, u8 bits_offset,
1389                                  u8 nr_bits, struct seq_file *m)
1390{
1391        u16 left_shift_bits, right_shift_bits;
1392        u8 nr_copy_bytes;
1393        u8 nr_copy_bits;
1394        u64 print_num[2] = {};
1395
1396        nr_copy_bits = nr_bits + bits_offset;
1397        nr_copy_bytes = BITS_ROUNDUP_BYTES(nr_copy_bits);
1398
1399        memcpy(print_num, data, nr_copy_bytes);
1400
1401#ifdef __BIG_ENDIAN_BITFIELD
1402        left_shift_bits = bits_offset;
1403#else
1404        left_shift_bits = BITS_PER_U128 - nr_copy_bits;
1405#endif
1406        right_shift_bits = BITS_PER_U128 - nr_bits;
1407
1408        btf_int128_shift(print_num, left_shift_bits, right_shift_bits);
1409        btf_int128_print(m, print_num);
1410}
1411
1412
1413static void btf_int_bits_seq_show(const struct btf *btf,
1414                                  const struct btf_type *t,
1415                                  void *data, u8 bits_offset,
1416                                  struct seq_file *m)
1417{
1418        u32 int_data = btf_type_int(t);
1419        u8 nr_bits = BTF_INT_BITS(int_data);
1420        u8 total_bits_offset;
1421
1422        /*
1423         * bits_offset is at most 7.
1424         * BTF_INT_OFFSET() cannot exceed 128 bits.
1425         */
1426        total_bits_offset = bits_offset + BTF_INT_OFFSET(int_data);
1427        data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
1428        bits_offset = BITS_PER_BYTE_MASKED(total_bits_offset);
1429        btf_bitfield_seq_show(data, bits_offset, nr_bits, m);
1430}
1431
1432static void btf_int_seq_show(const struct btf *btf, const struct btf_type *t,
1433                             u32 type_id, void *data, u8 bits_offset,
1434                             struct seq_file *m)
1435{
1436        u32 int_data = btf_type_int(t);
1437        u8 encoding = BTF_INT_ENCODING(int_data);
1438        bool sign = encoding & BTF_INT_SIGNED;
1439        u8 nr_bits = BTF_INT_BITS(int_data);
1440
1441        if (bits_offset || BTF_INT_OFFSET(int_data) ||
1442            BITS_PER_BYTE_MASKED(nr_bits)) {
1443                btf_int_bits_seq_show(btf, t, data, bits_offset, m);
1444                return;
1445        }
1446
1447        switch (nr_bits) {
1448        case 128:
1449                btf_int128_print(m, data);
1450                break;
1451        case 64:
1452                if (sign)
1453                        seq_printf(m, "%lld", *(s64 *)data);
1454                else
1455                        seq_printf(m, "%llu", *(u64 *)data);
1456                break;
1457        case 32:
1458                if (sign)
1459                        seq_printf(m, "%d", *(s32 *)data);
1460                else
1461                        seq_printf(m, "%u", *(u32 *)data);
1462                break;
1463        case 16:
1464                if (sign)
1465                        seq_printf(m, "%d", *(s16 *)data);
1466                else
1467                        seq_printf(m, "%u", *(u16 *)data);
1468                break;
1469        case 8:
1470                if (sign)
1471                        seq_printf(m, "%d", *(s8 *)data);
1472                else
1473                        seq_printf(m, "%u", *(u8 *)data);
1474                break;
1475        default:
1476                btf_int_bits_seq_show(btf, t, data, bits_offset, m);
1477        }
1478}
1479
1480static const struct btf_kind_operations int_ops = {
1481        .check_meta = btf_int_check_meta,
1482        .resolve = btf_df_resolve,
1483        .check_member = btf_int_check_member,
1484        .check_kflag_member = btf_int_check_kflag_member,
1485        .log_details = btf_int_log,
1486        .seq_show = btf_int_seq_show,
1487};
1488
1489static int btf_modifier_check_member(struct btf_verifier_env *env,
1490                                     const struct btf_type *struct_type,
1491                                     const struct btf_member *member,
1492                                     const struct btf_type *member_type)
1493{
1494        const struct btf_type *resolved_type;
1495        u32 resolved_type_id = member->type;
1496        struct btf_member resolved_member;
1497        struct btf *btf = env->btf;
1498
1499        resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL);
1500        if (!resolved_type) {
1501                btf_verifier_log_member(env, struct_type, member,
1502                                        "Invalid member");
1503                return -EINVAL;
1504        }
1505
1506        resolved_member = *member;
1507        resolved_member.type = resolved_type_id;
1508
1509        return btf_type_ops(resolved_type)->check_member(env, struct_type,
1510                                                         &resolved_member,
1511                                                         resolved_type);
1512}
1513
1514static int btf_modifier_check_kflag_member(struct btf_verifier_env *env,
1515                                           const struct btf_type *struct_type,
1516                                           const struct btf_member *member,
1517                                           const struct btf_type *member_type)
1518{
1519        const struct btf_type *resolved_type;
1520        u32 resolved_type_id = member->type;
1521        struct btf_member resolved_member;
1522        struct btf *btf = env->btf;
1523
1524        resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL);
1525        if (!resolved_type) {
1526                btf_verifier_log_member(env, struct_type, member,
1527                                        "Invalid member");
1528                return -EINVAL;
1529        }
1530
1531        resolved_member = *member;
1532        resolved_member.type = resolved_type_id;
1533
1534        return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type,
1535                                                               &resolved_member,
1536                                                               resolved_type);
1537}
1538
1539static int btf_ptr_check_member(struct btf_verifier_env *env,
1540                                const struct btf_type *struct_type,
1541                                const struct btf_member *member,
1542                                const struct btf_type *member_type)
1543{
1544        u32 struct_size, struct_bits_off, bytes_offset;
1545
1546        struct_size = struct_type->size;
1547        struct_bits_off = member->offset;
1548        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
1549
1550        if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
1551                btf_verifier_log_member(env, struct_type, member,
1552                                        "Member is not byte aligned");
1553                return -EINVAL;
1554        }
1555
1556        if (struct_size - bytes_offset < sizeof(void *)) {
1557                btf_verifier_log_member(env, struct_type, member,
1558                                        "Member exceeds struct_size");
1559                return -EINVAL;
1560        }
1561
1562        return 0;
1563}
1564
1565static int btf_ref_type_check_meta(struct btf_verifier_env *env,
1566                                   const struct btf_type *t,
1567                                   u32 meta_left)
1568{
1569        if (btf_type_vlen(t)) {
1570                btf_verifier_log_type(env, t, "vlen != 0");
1571                return -EINVAL;
1572        }
1573
1574        if (btf_type_kflag(t)) {
1575                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
1576                return -EINVAL;
1577        }
1578
1579        if (!BTF_TYPE_ID_VALID(t->type)) {
1580                btf_verifier_log_type(env, t, "Invalid type_id");
1581                return -EINVAL;
1582        }
1583
1584        /* typedef type must have a valid name, and other ref types,
1585         * volatile, const, restrict, should have a null name.
1586         */
1587        if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF) {
1588                if (!t->name_off ||
1589                    !btf_name_valid_identifier(env->btf, t->name_off)) {
1590                        btf_verifier_log_type(env, t, "Invalid name");
1591                        return -EINVAL;
1592                }
1593        } else {
1594                if (t->name_off) {
1595                        btf_verifier_log_type(env, t, "Invalid name");
1596                        return -EINVAL;
1597                }
1598        }
1599
1600        btf_verifier_log_type(env, t, NULL);
1601
1602        return 0;
1603}
1604
1605static int btf_modifier_resolve(struct btf_verifier_env *env,
1606                                const struct resolve_vertex *v)
1607{
1608        const struct btf_type *t = v->t;
1609        const struct btf_type *next_type;
1610        u32 next_type_id = t->type;
1611        struct btf *btf = env->btf;
1612
1613        next_type = btf_type_by_id(btf, next_type_id);
1614        if (!next_type || btf_type_is_resolve_source_only(next_type)) {
1615                btf_verifier_log_type(env, v->t, "Invalid type_id");
1616                return -EINVAL;
1617        }
1618
1619        if (!env_type_is_resolve_sink(env, next_type) &&
1620            !env_type_is_resolved(env, next_type_id))
1621                return env_stack_push(env, next_type, next_type_id);
1622
1623        /* Figure out the resolved next_type_id with size.
1624         * They will be stored in the current modifier's
1625         * resolved_ids and resolved_sizes such that it can
1626         * save us a few type-following when we use it later (e.g. in
1627         * pretty print).
1628         */
1629        if (!btf_type_id_size(btf, &next_type_id, NULL)) {
1630                if (env_type_is_resolved(env, next_type_id))
1631                        next_type = btf_type_id_resolve(btf, &next_type_id);
1632
1633                /* "typedef void new_void", "const void"...etc */
1634                if (!btf_type_is_void(next_type) &&
1635                    !btf_type_is_fwd(next_type) &&
1636                    !btf_type_is_func_proto(next_type)) {
1637                        btf_verifier_log_type(env, v->t, "Invalid type_id");
1638                        return -EINVAL;
1639                }
1640        }
1641
1642        env_stack_pop_resolved(env, next_type_id, 0);
1643
1644        return 0;
1645}
1646
1647static int btf_var_resolve(struct btf_verifier_env *env,
1648                           const struct resolve_vertex *v)
1649{
1650        const struct btf_type *next_type;
1651        const struct btf_type *t = v->t;
1652        u32 next_type_id = t->type;
1653        struct btf *btf = env->btf;
1654
1655        next_type = btf_type_by_id(btf, next_type_id);
1656        if (!next_type || btf_type_is_resolve_source_only(next_type)) {
1657                btf_verifier_log_type(env, v->t, "Invalid type_id");
1658                return -EINVAL;
1659        }
1660
1661        if (!env_type_is_resolve_sink(env, next_type) &&
1662            !env_type_is_resolved(env, next_type_id))
1663                return env_stack_push(env, next_type, next_type_id);
1664
1665        if (btf_type_is_modifier(next_type)) {
1666                const struct btf_type *resolved_type;
1667                u32 resolved_type_id;
1668
1669                resolved_type_id = next_type_id;
1670                resolved_type = btf_type_id_resolve(btf, &resolved_type_id);
1671
1672                if (btf_type_is_ptr(resolved_type) &&
1673                    !env_type_is_resolve_sink(env, resolved_type) &&
1674                    !env_type_is_resolved(env, resolved_type_id))
1675                        return env_stack_push(env, resolved_type,
1676                                              resolved_type_id);
1677        }
1678
1679        /* We must resolve to something concrete at this point, no
1680         * forward types or similar that would resolve to size of
1681         * zero is allowed.
1682         */
1683        if (!btf_type_id_size(btf, &next_type_id, NULL)) {
1684                btf_verifier_log_type(env, v->t, "Invalid type_id");
1685                return -EINVAL;
1686        }
1687
1688        env_stack_pop_resolved(env, next_type_id, 0);
1689
1690        return 0;
1691}
1692
1693static int btf_ptr_resolve(struct btf_verifier_env *env,
1694                           const struct resolve_vertex *v)
1695{
1696        const struct btf_type *next_type;
1697        const struct btf_type *t = v->t;
1698        u32 next_type_id = t->type;
1699        struct btf *btf = env->btf;
1700
1701        next_type = btf_type_by_id(btf, next_type_id);
1702        if (!next_type || btf_type_is_resolve_source_only(next_type)) {
1703                btf_verifier_log_type(env, v->t, "Invalid type_id");
1704                return -EINVAL;
1705        }
1706
1707        if (!env_type_is_resolve_sink(env, next_type) &&
1708            !env_type_is_resolved(env, next_type_id))
1709                return env_stack_push(env, next_type, next_type_id);
1710
1711        /* If the modifier was RESOLVED during RESOLVE_STRUCT_OR_ARRAY,
1712         * the modifier may have stopped resolving when it was resolved
1713         * to a ptr (last-resolved-ptr).
1714         *
1715         * We now need to continue from the last-resolved-ptr to
1716         * ensure the last-resolved-ptr will not referring back to
1717         * the currenct ptr (t).
1718         */
1719        if (btf_type_is_modifier(next_type)) {
1720                const struct btf_type *resolved_type;
1721                u32 resolved_type_id;
1722
1723                resolved_type_id = next_type_id;
1724                resolved_type = btf_type_id_resolve(btf, &resolved_type_id);
1725
1726                if (btf_type_is_ptr(resolved_type) &&
1727                    !env_type_is_resolve_sink(env, resolved_type) &&
1728                    !env_type_is_resolved(env, resolved_type_id))
1729                        return env_stack_push(env, resolved_type,
1730                                              resolved_type_id);
1731        }
1732
1733        if (!btf_type_id_size(btf, &next_type_id, NULL)) {
1734                if (env_type_is_resolved(env, next_type_id))
1735                        next_type = btf_type_id_resolve(btf, &next_type_id);
1736
1737                if (!btf_type_is_void(next_type) &&
1738                    !btf_type_is_fwd(next_type) &&
1739                    !btf_type_is_func_proto(next_type)) {
1740                        btf_verifier_log_type(env, v->t, "Invalid type_id");
1741                        return -EINVAL;
1742                }
1743        }
1744
1745        env_stack_pop_resolved(env, next_type_id, 0);
1746
1747        return 0;
1748}
1749
1750static void btf_modifier_seq_show(const struct btf *btf,
1751                                  const struct btf_type *t,
1752                                  u32 type_id, void *data,
1753                                  u8 bits_offset, struct seq_file *m)
1754{
1755        t = btf_type_id_resolve(btf, &type_id);
1756
1757        btf_type_ops(t)->seq_show(btf, t, type_id, data, bits_offset, m);
1758}
1759
1760static void btf_var_seq_show(const struct btf *btf, const struct btf_type *t,
1761                             u32 type_id, void *data, u8 bits_offset,
1762                             struct seq_file *m)
1763{
1764        t = btf_type_id_resolve(btf, &type_id);
1765
1766        btf_type_ops(t)->seq_show(btf, t, type_id, data, bits_offset, m);
1767}
1768
1769static void btf_ptr_seq_show(const struct btf *btf, const struct btf_type *t,
1770                             u32 type_id, void *data, u8 bits_offset,
1771                             struct seq_file *m)
1772{
1773        /* It is a hashed value */
1774        seq_printf(m, "%p", *(void **)data);
1775}
1776
1777static void btf_ref_type_log(struct btf_verifier_env *env,
1778                             const struct btf_type *t)
1779{
1780        btf_verifier_log(env, "type_id=%u", t->type);
1781}
1782
1783static struct btf_kind_operations modifier_ops = {
1784        .check_meta = btf_ref_type_check_meta,
1785        .resolve = btf_modifier_resolve,
1786        .check_member = btf_modifier_check_member,
1787        .check_kflag_member = btf_modifier_check_kflag_member,
1788        .log_details = btf_ref_type_log,
1789        .seq_show = btf_modifier_seq_show,
1790};
1791
1792static struct btf_kind_operations ptr_ops = {
1793        .check_meta = btf_ref_type_check_meta,
1794        .resolve = btf_ptr_resolve,
1795        .check_member = btf_ptr_check_member,
1796        .check_kflag_member = btf_generic_check_kflag_member,
1797        .log_details = btf_ref_type_log,
1798        .seq_show = btf_ptr_seq_show,
1799};
1800
1801static s32 btf_fwd_check_meta(struct btf_verifier_env *env,
1802                              const struct btf_type *t,
1803                              u32 meta_left)
1804{
1805        if (btf_type_vlen(t)) {
1806                btf_verifier_log_type(env, t, "vlen != 0");
1807                return -EINVAL;
1808        }
1809
1810        if (t->type) {
1811                btf_verifier_log_type(env, t, "type != 0");
1812                return -EINVAL;
1813        }
1814
1815        /* fwd type must have a valid name */
1816        if (!t->name_off ||
1817            !btf_name_valid_identifier(env->btf, t->name_off)) {
1818                btf_verifier_log_type(env, t, "Invalid name");
1819                return -EINVAL;
1820        }
1821
1822        btf_verifier_log_type(env, t, NULL);
1823
1824        return 0;
1825}
1826
1827static void btf_fwd_type_log(struct btf_verifier_env *env,
1828                             const struct btf_type *t)
1829{
1830        btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct");
1831}
1832
1833static struct btf_kind_operations fwd_ops = {
1834        .check_meta = btf_fwd_check_meta,
1835        .resolve = btf_df_resolve,
1836        .check_member = btf_df_check_member,
1837        .check_kflag_member = btf_df_check_kflag_member,
1838        .log_details = btf_fwd_type_log,
1839        .seq_show = btf_df_seq_show,
1840};
1841
1842static int btf_array_check_member(struct btf_verifier_env *env,
1843                                  const struct btf_type *struct_type,
1844                                  const struct btf_member *member,
1845                                  const struct btf_type *member_type)
1846{
1847        u32 struct_bits_off = member->offset;
1848        u32 struct_size, bytes_offset;
1849        u32 array_type_id, array_size;
1850        struct btf *btf = env->btf;
1851
1852        if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
1853                btf_verifier_log_member(env, struct_type, member,
1854                                        "Member is not byte aligned");
1855                return -EINVAL;
1856        }
1857
1858        array_type_id = member->type;
1859        btf_type_id_size(btf, &array_type_id, &array_size);
1860        struct_size = struct_type->size;
1861        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
1862        if (struct_size - bytes_offset < array_size) {
1863                btf_verifier_log_member(env, struct_type, member,
1864                                        "Member exceeds struct_size");
1865                return -EINVAL;
1866        }
1867
1868        return 0;
1869}
1870
1871static s32 btf_array_check_meta(struct btf_verifier_env *env,
1872                                const struct btf_type *t,
1873                                u32 meta_left)
1874{
1875        const struct btf_array *array = btf_type_array(t);
1876        u32 meta_needed = sizeof(*array);
1877
1878        if (meta_left < meta_needed) {
1879                btf_verifier_log_basic(env, t,
1880                                       "meta_left:%u meta_needed:%u",
1881                                       meta_left, meta_needed);
1882                return -EINVAL;
1883        }
1884
1885        /* array type should not have a name */
1886        if (t->name_off) {
1887                btf_verifier_log_type(env, t, "Invalid name");
1888                return -EINVAL;
1889        }
1890
1891        if (btf_type_vlen(t)) {
1892                btf_verifier_log_type(env, t, "vlen != 0");
1893                return -EINVAL;
1894        }
1895
1896        if (btf_type_kflag(t)) {
1897                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
1898                return -EINVAL;
1899        }
1900
1901        if (t->size) {
1902                btf_verifier_log_type(env, t, "size != 0");
1903                return -EINVAL;
1904        }
1905
1906        /* Array elem type and index type cannot be in type void,
1907         * so !array->type and !array->index_type are not allowed.
1908         */
1909        if (!array->type || !BTF_TYPE_ID_VALID(array->type)) {
1910                btf_verifier_log_type(env, t, "Invalid elem");
1911                return -EINVAL;
1912        }
1913
1914        if (!array->index_type || !BTF_TYPE_ID_VALID(array->index_type)) {
1915                btf_verifier_log_type(env, t, "Invalid index");
1916                return -EINVAL;
1917        }
1918
1919        btf_verifier_log_type(env, t, NULL);
1920
1921        return meta_needed;
1922}
1923
1924static int btf_array_resolve(struct btf_verifier_env *env,
1925                             const struct resolve_vertex *v)
1926{
1927        const struct btf_array *array = btf_type_array(v->t);
1928        const struct btf_type *elem_type, *index_type;
1929        u32 elem_type_id, index_type_id;
1930        struct btf *btf = env->btf;
1931        u32 elem_size;
1932
1933        /* Check array->index_type */
1934        index_type_id = array->index_type;
1935        index_type = btf_type_by_id(btf, index_type_id);
1936        if (btf_type_nosize_or_null(index_type) ||
1937            btf_type_is_resolve_source_only(index_type)) {
1938                btf_verifier_log_type(env, v->t, "Invalid index");
1939                return -EINVAL;
1940        }
1941
1942        if (!env_type_is_resolve_sink(env, index_type) &&
1943            !env_type_is_resolved(env, index_type_id))
1944                return env_stack_push(env, index_type, index_type_id);
1945
1946        index_type = btf_type_id_size(btf, &index_type_id, NULL);
1947        if (!index_type || !btf_type_is_int(index_type) ||
1948            !btf_type_int_is_regular(index_type)) {
1949                btf_verifier_log_type(env, v->t, "Invalid index");
1950                return -EINVAL;
1951        }
1952
1953        /* Check array->type */
1954        elem_type_id = array->type;
1955        elem_type = btf_type_by_id(btf, elem_type_id);
1956        if (btf_type_nosize_or_null(elem_type) ||
1957            btf_type_is_resolve_source_only(elem_type)) {
1958                btf_verifier_log_type(env, v->t,
1959                                      "Invalid elem");
1960                return -EINVAL;
1961        }
1962
1963        if (!env_type_is_resolve_sink(env, elem_type) &&
1964            !env_type_is_resolved(env, elem_type_id))
1965                return env_stack_push(env, elem_type, elem_type_id);
1966
1967        elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size);
1968        if (!elem_type) {
1969                btf_verifier_log_type(env, v->t, "Invalid elem");
1970                return -EINVAL;
1971        }
1972
1973        if (btf_type_is_int(elem_type) && !btf_type_int_is_regular(elem_type)) {
1974                btf_verifier_log_type(env, v->t, "Invalid array of int");
1975                return -EINVAL;
1976        }
1977
1978        if (array->nelems && elem_size > U32_MAX / array->nelems) {
1979                btf_verifier_log_type(env, v->t,
1980                                      "Array size overflows U32_MAX");
1981                return -EINVAL;
1982        }
1983
1984        env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems);
1985
1986        return 0;
1987}
1988
1989static void btf_array_log(struct btf_verifier_env *env,
1990                          const struct btf_type *t)
1991{
1992        const struct btf_array *array = btf_type_array(t);
1993
1994        btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u",
1995                         array->type, array->index_type, array->nelems);
1996}
1997
1998static void btf_array_seq_show(const struct btf *btf, const struct btf_type *t,
1999                               u32 type_id, void *data, u8 bits_offset,
2000                               struct seq_file *m)
2001{
2002        const struct btf_array *array = btf_type_array(t);
2003        const struct btf_kind_operations *elem_ops;
2004        const struct btf_type *elem_type;
2005        u32 i, elem_size, elem_type_id;
2006
2007        elem_type_id = array->type;
2008        elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size);
2009        elem_ops = btf_type_ops(elem_type);
2010        seq_puts(m, "[");
2011        for (i = 0; i < array->nelems; i++) {
2012                if (i)
2013                        seq_puts(m, ",");
2014
2015                elem_ops->seq_show(btf, elem_type, elem_type_id, data,
2016                                   bits_offset, m);
2017                data += elem_size;
2018        }
2019        seq_puts(m, "]");
2020}
2021
2022static struct btf_kind_operations array_ops = {
2023        .check_meta = btf_array_check_meta,
2024        .resolve = btf_array_resolve,
2025        .check_member = btf_array_check_member,
2026        .check_kflag_member = btf_generic_check_kflag_member,
2027        .log_details = btf_array_log,
2028        .seq_show = btf_array_seq_show,
2029};
2030
2031static int btf_struct_check_member(struct btf_verifier_env *env,
2032                                   const struct btf_type *struct_type,
2033                                   const struct btf_member *member,
2034                                   const struct btf_type *member_type)
2035{
2036        u32 struct_bits_off = member->offset;
2037        u32 struct_size, bytes_offset;
2038
2039        if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2040                btf_verifier_log_member(env, struct_type, member,
2041                                        "Member is not byte aligned");
2042                return -EINVAL;
2043        }
2044
2045        struct_size = struct_type->size;
2046        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2047        if (struct_size - bytes_offset < member_type->size) {
2048                btf_verifier_log_member(env, struct_type, member,
2049                                        "Member exceeds struct_size");
2050                return -EINVAL;
2051        }
2052
2053        return 0;
2054}
2055
2056static s32 btf_struct_check_meta(struct btf_verifier_env *env,
2057                                 const struct btf_type *t,
2058                                 u32 meta_left)
2059{
2060        bool is_union = BTF_INFO_KIND(t->info) == BTF_KIND_UNION;
2061        const struct btf_member *member;
2062        u32 meta_needed, last_offset;
2063        struct btf *btf = env->btf;
2064        u32 struct_size = t->size;
2065        u32 offset;
2066        u16 i;
2067
2068        meta_needed = btf_type_vlen(t) * sizeof(*member);
2069        if (meta_left < meta_needed) {
2070                btf_verifier_log_basic(env, t,
2071                                       "meta_left:%u meta_needed:%u",
2072                                       meta_left, meta_needed);
2073                return -EINVAL;
2074        }
2075
2076        /* struct type either no name or a valid one */
2077        if (t->name_off &&
2078            !btf_name_valid_identifier(env->btf, t->name_off)) {
2079                btf_verifier_log_type(env, t, "Invalid name");
2080                return -EINVAL;
2081        }
2082
2083        btf_verifier_log_type(env, t, NULL);
2084
2085        last_offset = 0;
2086        for_each_member(i, t, member) {
2087                if (!btf_name_offset_valid(btf, member->name_off)) {
2088                        btf_verifier_log_member(env, t, member,
2089                                                "Invalid member name_offset:%u",
2090                                                member->name_off);
2091                        return -EINVAL;
2092                }
2093
2094                /* struct member either no name or a valid one */
2095                if (member->name_off &&
2096                    !btf_name_valid_identifier(btf, member->name_off)) {
2097                        btf_verifier_log_member(env, t, member, "Invalid name");
2098                        return -EINVAL;
2099                }
2100                /* A member cannot be in type void */
2101                if (!member->type || !BTF_TYPE_ID_VALID(member->type)) {
2102                        btf_verifier_log_member(env, t, member,
2103                                                "Invalid type_id");
2104                        return -EINVAL;
2105                }
2106
2107                offset = btf_member_bit_offset(t, member);
2108                if (is_union && offset) {
2109                        btf_verifier_log_member(env, t, member,
2110                                                "Invalid member bits_offset");
2111                        return -EINVAL;
2112                }
2113
2114                /*
2115                 * ">" instead of ">=" because the last member could be
2116                 * "char a[0];"
2117                 */
2118                if (last_offset > offset) {
2119                        btf_verifier_log_member(env, t, member,
2120                                                "Invalid member bits_offset");
2121                        return -EINVAL;
2122                }
2123
2124                if (BITS_ROUNDUP_BYTES(offset) > struct_size) {
2125                        btf_verifier_log_member(env, t, member,
2126                                                "Member bits_offset exceeds its struct size");
2127                        return -EINVAL;
2128                }
2129
2130                btf_verifier_log_member(env, t, member, NULL);
2131                last_offset = offset;
2132        }
2133
2134        return meta_needed;
2135}
2136
2137static int btf_struct_resolve(struct btf_verifier_env *env,
2138                              const struct resolve_vertex *v)
2139{
2140        const struct btf_member *member;
2141        int err;
2142        u16 i;
2143
2144        /* Before continue resolving the next_member,
2145         * ensure the last member is indeed resolved to a
2146         * type with size info.
2147         */
2148        if (v->next_member) {
2149                const struct btf_type *last_member_type;
2150                const struct btf_member *last_member;
2151                u16 last_member_type_id;
2152
2153                last_member = btf_type_member(v->t) + v->next_member - 1;
2154                last_member_type_id = last_member->type;
2155                if (WARN_ON_ONCE(!env_type_is_resolved(env,
2156                                                       last_member_type_id)))
2157                        return -EINVAL;
2158
2159                last_member_type = btf_type_by_id(env->btf,
2160                                                  last_member_type_id);
2161                if (btf_type_kflag(v->t))
2162                        err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t,
2163                                                                last_member,
2164                                                                last_member_type);
2165                else
2166                        err = btf_type_ops(last_member_type)->check_member(env, v->t,
2167                                                                last_member,
2168                                                                last_member_type);
2169                if (err)
2170                        return err;
2171        }
2172
2173        for_each_member_from(i, v->next_member, v->t, member) {
2174                u32 member_type_id = member->type;
2175                const struct btf_type *member_type = btf_type_by_id(env->btf,
2176                                                                member_type_id);
2177
2178                if (btf_type_nosize_or_null(member_type) ||
2179                    btf_type_is_resolve_source_only(member_type)) {
2180                        btf_verifier_log_member(env, v->t, member,
2181                                                "Invalid member");
2182                        return -EINVAL;
2183                }
2184
2185                if (!env_type_is_resolve_sink(env, member_type) &&
2186                    !env_type_is_resolved(env, member_type_id)) {
2187                        env_stack_set_next_member(env, i + 1);
2188                        return env_stack_push(env, member_type, member_type_id);
2189                }
2190
2191                if (btf_type_kflag(v->t))
2192                        err = btf_type_ops(member_type)->check_kflag_member(env, v->t,
2193                                                                            member,
2194                                                                            member_type);
2195                else
2196                        err = btf_type_ops(member_type)->check_member(env, v->t,
2197                                                                      member,
2198                                                                      member_type);
2199                if (err)
2200                        return err;
2201        }
2202
2203        env_stack_pop_resolved(env, 0, 0);
2204
2205        return 0;
2206}
2207
2208static void btf_struct_log(struct btf_verifier_env *env,
2209                           const struct btf_type *t)
2210{
2211        btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
2212}
2213
2214/* find 'struct bpf_spin_lock' in map value.
2215 * return >= 0 offset if found
2216 * and < 0 in case of error
2217 */
2218int btf_find_spin_lock(const struct btf *btf, const struct btf_type *t)
2219{
2220        const struct btf_member *member;
2221        u32 i, off = -ENOENT;
2222
2223        if (!__btf_type_is_struct(t))
2224                return -EINVAL;
2225
2226        for_each_member(i, t, member) {
2227                const struct btf_type *member_type = btf_type_by_id(btf,
2228                                                                    member->type);
2229                if (!__btf_type_is_struct(member_type))
2230                        continue;
2231                if (member_type->size != sizeof(struct bpf_spin_lock))
2232                        continue;
2233                if (strcmp(__btf_name_by_offset(btf, member_type->name_off),
2234                           "bpf_spin_lock"))
2235                        continue;
2236                if (off != -ENOENT)
2237                        /* only one 'struct bpf_spin_lock' is allowed */
2238                        return -E2BIG;
2239                off = btf_member_bit_offset(t, member);
2240                if (off % 8)
2241                        /* valid C code cannot generate such BTF */
2242                        return -EINVAL;
2243                off /= 8;
2244                if (off % __alignof__(struct bpf_spin_lock))
2245                        /* valid struct bpf_spin_lock will be 4 byte aligned */
2246                        return -EINVAL;
2247        }
2248        return off;
2249}
2250
2251static void btf_struct_seq_show(const struct btf *btf, const struct btf_type *t,
2252                                u32 type_id, void *data, u8 bits_offset,
2253                                struct seq_file *m)
2254{
2255        const char *seq = BTF_INFO_KIND(t->info) == BTF_KIND_UNION ? "|" : ",";
2256        const struct btf_member *member;
2257        u32 i;
2258
2259        seq_puts(m, "{");
2260        for_each_member(i, t, member) {
2261                const struct btf_type *member_type = btf_type_by_id(btf,
2262                                                                member->type);
2263                const struct btf_kind_operations *ops;
2264                u32 member_offset, bitfield_size;
2265                u32 bytes_offset;
2266                u8 bits8_offset;
2267
2268                if (i)
2269                        seq_puts(m, seq);
2270
2271                member_offset = btf_member_bit_offset(t, member);
2272                bitfield_size = btf_member_bitfield_size(t, member);
2273                bytes_offset = BITS_ROUNDDOWN_BYTES(member_offset);
2274                bits8_offset = BITS_PER_BYTE_MASKED(member_offset);
2275                if (bitfield_size) {
2276                        btf_bitfield_seq_show(data + bytes_offset, bits8_offset,
2277                                              bitfield_size, m);
2278                } else {
2279                        ops = btf_type_ops(member_type);
2280                        ops->seq_show(btf, member_type, member->type,
2281                                      data + bytes_offset, bits8_offset, m);
2282                }
2283        }
2284        seq_puts(m, "}");
2285}
2286
2287static struct btf_kind_operations struct_ops = {
2288        .check_meta = btf_struct_check_meta,
2289        .resolve = btf_struct_resolve,
2290        .check_member = btf_struct_check_member,
2291        .check_kflag_member = btf_generic_check_kflag_member,
2292        .log_details = btf_struct_log,
2293        .seq_show = btf_struct_seq_show,
2294};
2295
2296static int btf_enum_check_member(struct btf_verifier_env *env,
2297                                 const struct btf_type *struct_type,
2298                                 const struct btf_member *member,
2299                                 const struct btf_type *member_type)
2300{
2301        u32 struct_bits_off = member->offset;
2302        u32 struct_size, bytes_offset;
2303
2304        if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2305                btf_verifier_log_member(env, struct_type, member,
2306                                        "Member is not byte aligned");
2307                return -EINVAL;
2308        }
2309
2310        struct_size = struct_type->size;
2311        bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2312        if (struct_size - bytes_offset < sizeof(int)) {
2313                btf_verifier_log_member(env, struct_type, member,
2314                                        "Member exceeds struct_size");
2315                return -EINVAL;
2316        }
2317
2318        return 0;
2319}
2320
2321static int btf_enum_check_kflag_member(struct btf_verifier_env *env,
2322                                       const struct btf_type *struct_type,
2323                                       const struct btf_member *member,
2324                                       const struct btf_type *member_type)
2325{
2326        u32 struct_bits_off, nr_bits, bytes_end, struct_size;
2327        u32 int_bitsize = sizeof(int) * BITS_PER_BYTE;
2328
2329        struct_bits_off = BTF_MEMBER_BIT_OFFSET(member->offset);
2330        nr_bits = BTF_MEMBER_BITFIELD_SIZE(member->offset);
2331        if (!nr_bits) {
2332                if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2333                        btf_verifier_log_member(env, struct_type, member,
2334                                                "Member is not byte aligned");
2335                        return -EINVAL;
2336                }
2337
2338                nr_bits = int_bitsize;
2339        } else if (nr_bits > int_bitsize) {
2340                btf_verifier_log_member(env, struct_type, member,
2341                                        "Invalid member bitfield_size");
2342                return -EINVAL;
2343        }
2344
2345        struct_size = struct_type->size;
2346        bytes_end = BITS_ROUNDUP_BYTES(struct_bits_off + nr_bits);
2347        if (struct_size < bytes_end) {
2348                btf_verifier_log_member(env, struct_type, member,
2349                                        "Member exceeds struct_size");
2350                return -EINVAL;
2351        }
2352
2353        return 0;
2354}
2355
2356static s32 btf_enum_check_meta(struct btf_verifier_env *env,
2357                               const struct btf_type *t,
2358                               u32 meta_left)
2359{
2360        const struct btf_enum *enums = btf_type_enum(t);
2361        struct btf *btf = env->btf;
2362        u16 i, nr_enums;
2363        u32 meta_needed;
2364
2365        nr_enums = btf_type_vlen(t);
2366        meta_needed = nr_enums * sizeof(*enums);
2367
2368        if (meta_left < meta_needed) {
2369                btf_verifier_log_basic(env, t,
2370                                       "meta_left:%u meta_needed:%u",
2371                                       meta_left, meta_needed);
2372                return -EINVAL;
2373        }
2374
2375        if (btf_type_kflag(t)) {
2376                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2377                return -EINVAL;
2378        }
2379
2380        if (t->size > 8 || !is_power_of_2(t->size)) {
2381                btf_verifier_log_type(env, t, "Unexpected size");
2382                return -EINVAL;
2383        }
2384
2385        /* enum type either no name or a valid one */
2386        if (t->name_off &&
2387            !btf_name_valid_identifier(env->btf, t->name_off)) {
2388                btf_verifier_log_type(env, t, "Invalid name");
2389                return -EINVAL;
2390        }
2391
2392        btf_verifier_log_type(env, t, NULL);
2393
2394        for (i = 0; i < nr_enums; i++) {
2395                if (!btf_name_offset_valid(btf, enums[i].name_off)) {
2396                        btf_verifier_log(env, "\tInvalid name_offset:%u",
2397                                         enums[i].name_off);
2398                        return -EINVAL;
2399                }
2400
2401                /* enum member must have a valid name */
2402                if (!enums[i].name_off ||
2403                    !btf_name_valid_identifier(btf, enums[i].name_off)) {
2404                        btf_verifier_log_type(env, t, "Invalid name");
2405                        return -EINVAL;
2406                }
2407
2408
2409                btf_verifier_log(env, "\t%s val=%d\n",
2410                                 __btf_name_by_offset(btf, enums[i].name_off),
2411                                 enums[i].val);
2412        }
2413
2414        return meta_needed;
2415}
2416
2417static void btf_enum_log(struct btf_verifier_env *env,
2418                         const struct btf_type *t)
2419{
2420        btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
2421}
2422
2423static void btf_enum_seq_show(const struct btf *btf, const struct btf_type *t,
2424                              u32 type_id, void *data, u8 bits_offset,
2425                              struct seq_file *m)
2426{
2427        const struct btf_enum *enums = btf_type_enum(t);
2428        u32 i, nr_enums = btf_type_vlen(t);
2429        int v = *(int *)data;
2430
2431        for (i = 0; i < nr_enums; i++) {
2432                if (v == enums[i].val) {
2433                        seq_printf(m, "%s",
2434                                   __btf_name_by_offset(btf,
2435                                                        enums[i].name_off));
2436                        return;
2437                }
2438        }
2439
2440        seq_printf(m, "%d", v);
2441}
2442
2443static struct btf_kind_operations enum_ops = {
2444        .check_meta = btf_enum_check_meta,
2445        .resolve = btf_df_resolve,
2446        .check_member = btf_enum_check_member,
2447        .check_kflag_member = btf_enum_check_kflag_member,
2448        .log_details = btf_enum_log,
2449        .seq_show = btf_enum_seq_show,
2450};
2451
2452static s32 btf_func_proto_check_meta(struct btf_verifier_env *env,
2453                                     const struct btf_type *t,
2454                                     u32 meta_left)
2455{
2456        u32 meta_needed = btf_type_vlen(t) * sizeof(struct btf_param);
2457
2458        if (meta_left < meta_needed) {
2459                btf_verifier_log_basic(env, t,
2460                                       "meta_left:%u meta_needed:%u",
2461                                       meta_left, meta_needed);
2462                return -EINVAL;
2463        }
2464
2465        if (t->name_off) {
2466                btf_verifier_log_type(env, t, "Invalid name");
2467                return -EINVAL;
2468        }
2469
2470        if (btf_type_kflag(t)) {
2471                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2472                return -EINVAL;
2473        }
2474
2475        btf_verifier_log_type(env, t, NULL);
2476
2477        return meta_needed;
2478}
2479
2480static void btf_func_proto_log(struct btf_verifier_env *env,
2481                               const struct btf_type *t)
2482{
2483        const struct btf_param *args = (const struct btf_param *)(t + 1);
2484        u16 nr_args = btf_type_vlen(t), i;
2485
2486        btf_verifier_log(env, "return=%u args=(", t->type);
2487        if (!nr_args) {
2488                btf_verifier_log(env, "void");
2489                goto done;
2490        }
2491
2492        if (nr_args == 1 && !args[0].type) {
2493                /* Only one vararg */
2494                btf_verifier_log(env, "vararg");
2495                goto done;
2496        }
2497
2498        btf_verifier_log(env, "%u %s", args[0].type,
2499                         __btf_name_by_offset(env->btf,
2500                                              args[0].name_off));
2501        for (i = 1; i < nr_args - 1; i++)
2502                btf_verifier_log(env, ", %u %s", args[i].type,
2503                                 __btf_name_by_offset(env->btf,
2504                                                      args[i].name_off));
2505
2506        if (nr_args > 1) {
2507                const struct btf_param *last_arg = &args[nr_args - 1];
2508
2509                if (last_arg->type)
2510                        btf_verifier_log(env, ", %u %s", last_arg->type,
2511                                         __btf_name_by_offset(env->btf,
2512                                                              last_arg->name_off));
2513                else
2514                        btf_verifier_log(env, ", vararg");
2515        }
2516
2517done:
2518        btf_verifier_log(env, ")");
2519}
2520
2521static struct btf_kind_operations func_proto_ops = {
2522        .check_meta = btf_func_proto_check_meta,
2523        .resolve = btf_df_resolve,
2524        /*
2525         * BTF_KIND_FUNC_PROTO cannot be directly referred by
2526         * a struct's member.
2527         *
2528         * It should be a funciton pointer instead.
2529         * (i.e. struct's member -> BTF_KIND_PTR -> BTF_KIND_FUNC_PROTO)
2530         *
2531         * Hence, there is no btf_func_check_member().
2532         */
2533        .check_member = btf_df_check_member,
2534        .check_kflag_member = btf_df_check_kflag_member,
2535        .log_details = btf_func_proto_log,
2536        .seq_show = btf_df_seq_show,
2537};
2538
2539static s32 btf_func_check_meta(struct btf_verifier_env *env,
2540                               const struct btf_type *t,
2541                               u32 meta_left)
2542{
2543        if (!t->name_off ||
2544            !btf_name_valid_identifier(env->btf, t->name_off)) {
2545                btf_verifier_log_type(env, t, "Invalid name");
2546                return -EINVAL;
2547        }
2548
2549        if (btf_type_vlen(t)) {
2550                btf_verifier_log_type(env, t, "vlen != 0");
2551                return -EINVAL;
2552        }
2553
2554        if (btf_type_kflag(t)) {
2555                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2556                return -EINVAL;
2557        }
2558
2559        btf_verifier_log_type(env, t, NULL);
2560
2561        return 0;
2562}
2563
2564static struct btf_kind_operations func_ops = {
2565        .check_meta = btf_func_check_meta,
2566        .resolve = btf_df_resolve,
2567        .check_member = btf_df_check_member,
2568        .check_kflag_member = btf_df_check_kflag_member,
2569        .log_details = btf_ref_type_log,
2570        .seq_show = btf_df_seq_show,
2571};
2572
2573static s32 btf_var_check_meta(struct btf_verifier_env *env,
2574                              const struct btf_type *t,
2575                              u32 meta_left)
2576{
2577        const struct btf_var *var;
2578        u32 meta_needed = sizeof(*var);
2579
2580        if (meta_left < meta_needed) {
2581                btf_verifier_log_basic(env, t,
2582                                       "meta_left:%u meta_needed:%u",
2583                                       meta_left, meta_needed);
2584                return -EINVAL;
2585        }
2586
2587        if (btf_type_vlen(t)) {
2588                btf_verifier_log_type(env, t, "vlen != 0");
2589                return -EINVAL;
2590        }
2591
2592        if (btf_type_kflag(t)) {
2593                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2594                return -EINVAL;
2595        }
2596
2597        if (!t->name_off ||
2598            !__btf_name_valid(env->btf, t->name_off, true)) {
2599                btf_verifier_log_type(env, t, "Invalid name");
2600                return -EINVAL;
2601        }
2602
2603        /* A var cannot be in type void */
2604        if (!t->type || !BTF_TYPE_ID_VALID(t->type)) {
2605                btf_verifier_log_type(env, t, "Invalid type_id");
2606                return -EINVAL;
2607        }
2608
2609        var = btf_type_var(t);
2610        if (var->linkage != BTF_VAR_STATIC &&
2611            var->linkage != BTF_VAR_GLOBAL_ALLOCATED) {
2612                btf_verifier_log_type(env, t, "Linkage not supported");
2613                return -EINVAL;
2614        }
2615
2616        btf_verifier_log_type(env, t, NULL);
2617
2618        return meta_needed;
2619}
2620
2621static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t)
2622{
2623        const struct btf_var *var = btf_type_var(t);
2624
2625        btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage);
2626}
2627
2628static const struct btf_kind_operations var_ops = {
2629        .check_meta             = btf_var_check_meta,
2630        .resolve                = btf_var_resolve,
2631        .check_member           = btf_df_check_member,
2632        .check_kflag_member     = btf_df_check_kflag_member,
2633        .log_details            = btf_var_log,
2634        .seq_show               = btf_var_seq_show,
2635};
2636
2637static s32 btf_datasec_check_meta(struct btf_verifier_env *env,
2638                                  const struct btf_type *t,
2639                                  u32 meta_left)
2640{
2641        const struct btf_var_secinfo *vsi;
2642        u64 last_vsi_end_off = 0, sum = 0;
2643        u32 i, meta_needed;
2644
2645        meta_needed = btf_type_vlen(t) * sizeof(*vsi);
2646        if (meta_left < meta_needed) {
2647                btf_verifier_log_basic(env, t,
2648                                       "meta_left:%u meta_needed:%u",
2649                                       meta_left, meta_needed);
2650                return -EINVAL;
2651        }
2652
2653        if (!btf_type_vlen(t)) {
2654                btf_verifier_log_type(env, t, "vlen == 0");
2655                return -EINVAL;
2656        }
2657
2658        if (!t->size) {
2659                btf_verifier_log_type(env, t, "size == 0");
2660                return -EINVAL;
2661        }
2662
2663        if (btf_type_kflag(t)) {
2664                btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2665                return -EINVAL;
2666        }
2667
2668        if (!t->name_off ||
2669            !btf_name_valid_section(env->btf, t->name_off)) {
2670                btf_verifier_log_type(env, t, "Invalid name");
2671                return -EINVAL;
2672        }
2673
2674        btf_verifier_log_type(env, t, NULL);
2675
2676        for_each_vsi(i, t, vsi) {
2677                /* A var cannot be in type void */
2678                if (!vsi->type || !BTF_TYPE_ID_VALID(vsi->type)) {
2679                        btf_verifier_log_vsi(env, t, vsi,
2680                                             "Invalid type_id");
2681                        return -EINVAL;
2682                }
2683
2684                if (vsi->offset < last_vsi_end_off || vsi->offset >= t->size) {
2685                        btf_verifier_log_vsi(env, t, vsi,
2686                                             "Invalid offset");
2687                        return -EINVAL;
2688                }
2689
2690                if (!vsi->size || vsi->size > t->size) {
2691                        btf_verifier_log_vsi(env, t, vsi,
2692                                             "Invalid size");
2693                        return -EINVAL;
2694                }
2695
2696                last_vsi_end_off = vsi->offset + vsi->size;
2697                if (last_vsi_end_off > t->size) {
2698                        btf_verifier_log_vsi(env, t, vsi,
2699                                             "Invalid offset+size");
2700                        return -EINVAL;
2701                }
2702
2703                btf_verifier_log_vsi(env, t, vsi, NULL);
2704                sum += vsi->size;
2705        }
2706
2707        if (t->size < sum) {
2708                btf_verifier_log_type(env, t, "Invalid btf_info size");
2709                return -EINVAL;
2710        }
2711
2712        return meta_needed;
2713}
2714
2715static int btf_datasec_resolve(struct btf_verifier_env *env,
2716                               const struct resolve_vertex *v)
2717{
2718        const struct btf_var_secinfo *vsi;
2719        struct btf *btf = env->btf;
2720        u16 i;
2721
2722        for_each_vsi_from(i, v->next_member, v->t, vsi) {
2723                u32 var_type_id = vsi->type, type_id, type_size = 0;
2724                const struct btf_type *var_type = btf_type_by_id(env->btf,
2725                                                                 var_type_id);
2726                if (!var_type || !btf_type_is_var(var_type)) {
2727                        btf_verifier_log_vsi(env, v->t, vsi,
2728                                             "Not a VAR kind member");
2729                        return -EINVAL;
2730                }
2731
2732                if (!env_type_is_resolve_sink(env, var_type) &&
2733                    !env_type_is_resolved(env, var_type_id)) {
2734                        env_stack_set_next_member(env, i + 1);
2735                        return env_stack_push(env, var_type, var_type_id);
2736                }
2737
2738                type_id = var_type->type;
2739                if (!btf_type_id_size(btf, &type_id, &type_size)) {
2740                        btf_verifier_log_vsi(env, v->t, vsi, "Invalid type");
2741                        return -EINVAL;
2742                }
2743
2744                if (vsi->size < type_size) {
2745                        btf_verifier_log_vsi(env, v->t, vsi, "Invalid size");
2746                        return -EINVAL;
2747                }
2748        }
2749
2750        env_stack_pop_resolved(env, 0, 0);
2751        return 0;
2752}
2753
2754static void btf_datasec_log(struct btf_verifier_env *env,
2755                            const struct btf_type *t)
2756{
2757        btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
2758}
2759
2760static void btf_datasec_seq_show(const struct btf *btf,
2761                                 const struct btf_type *t, u32 type_id,
2762                                 void *data, u8 bits_offset,
2763                                 struct seq_file *m)
2764{
2765        const struct btf_var_secinfo *vsi;
2766        const struct btf_type *var;
2767        u32 i;
2768
2769        seq_printf(m, "section (\"%s\") = {", __btf_name_by_offset(btf, t->name_off));
2770        for_each_vsi(i, t, vsi) {
2771                var = btf_type_by_id(btf, vsi->type);
2772                if (i)
2773                        seq_puts(m, ",");
2774                btf_type_ops(var)->seq_show(btf, var, vsi->type,
2775                                            data + vsi->offset, bits_offset, m);
2776        }
2777        seq_puts(m, "}");
2778}
2779
2780static const struct btf_kind_operations datasec_ops = {
2781        .check_meta             = btf_datasec_check_meta,
2782        .resolve                = btf_datasec_resolve,
2783        .check_member           = btf_df_check_member,
2784        .check_kflag_member     = btf_df_check_kflag_member,
2785        .log_details            = btf_datasec_log,
2786        .seq_show               = btf_datasec_seq_show,
2787};
2788
2789static int btf_func_proto_check(struct btf_verifier_env *env,
2790                                const struct btf_type *t)
2791{
2792        const struct btf_type *ret_type;
2793        const struct btf_param *args;
2794        const struct btf *btf;
2795        u16 nr_args, i;
2796        int err;
2797
2798        btf = env->btf;
2799        args = (const struct btf_param *)(t + 1);
2800        nr_args = btf_type_vlen(t);
2801
2802        /* Check func return type which could be "void" (t->type == 0) */
2803        if (t->type) {
2804                u32 ret_type_id = t->type;
2805
2806                ret_type = btf_type_by_id(btf, ret_type_id);
2807                if (!ret_type) {
2808                        btf_verifier_log_type(env, t, "Invalid return type");
2809                        return -EINVAL;
2810                }
2811
2812                if (btf_type_needs_resolve(ret_type) &&
2813                    !env_type_is_resolved(env, ret_type_id)) {
2814                        err = btf_resolve(env, ret_type, ret_type_id);
2815                        if (err)
2816                                return err;
2817                }
2818
2819                /* Ensure the return type is a type that has a size */
2820                if (!btf_type_id_size(btf, &ret_type_id, NULL)) {
2821                        btf_verifier_log_type(env, t, "Invalid return type");
2822                        return -EINVAL;
2823                }
2824        }
2825
2826        if (!nr_args)
2827                return 0;
2828
2829        /* Last func arg type_id could be 0 if it is a vararg */
2830        if (!args[nr_args - 1].type) {
2831                if (args[nr_args - 1].name_off) {
2832                        btf_verifier_log_type(env, t, "Invalid arg#%u",
2833                                              nr_args);
2834                        return -EINVAL;
2835                }
2836                nr_args--;
2837        }
2838
2839        err = 0;
2840        for (i = 0; i < nr_args; i++) {
2841                const struct btf_type *arg_type;
2842                u32 arg_type_id;
2843
2844                arg_type_id = args[i].type;
2845                arg_type = btf_type_by_id(btf, arg_type_id);
2846                if (!arg_type) {
2847                        btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
2848                        err = -EINVAL;
2849                        break;
2850                }
2851
2852                if (args[i].name_off &&
2853                    (!btf_name_offset_valid(btf, args[i].name_off) ||
2854                     !btf_name_valid_identifier(btf, args[i].name_off))) {
2855                        btf_verifier_log_type(env, t,
2856                                              "Invalid arg#%u", i + 1);
2857                        err = -EINVAL;
2858                        break;
2859                }
2860
2861                if (btf_type_needs_resolve(arg_type) &&
2862                    !env_type_is_resolved(env, arg_type_id)) {
2863                        err = btf_resolve(env, arg_type, arg_type_id);
2864                        if (err)
2865                                break;
2866                }
2867
2868                if (!btf_type_id_size(btf, &arg_type_id, NULL)) {
2869                        btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
2870                        err = -EINVAL;
2871                        break;
2872                }
2873        }
2874
2875        return err;
2876}
2877
2878static int btf_func_check(struct btf_verifier_env *env,
2879                          const struct btf_type *t)
2880{
2881        const struct btf_type *proto_type;
2882        const struct btf_param *args;
2883        const struct btf *btf;
2884        u16 nr_args, i;
2885
2886        btf = env->btf;
2887        proto_type = btf_type_by_id(btf, t->type);
2888
2889        if (!proto_type || !btf_type_is_func_proto(proto_type)) {
2890                btf_verifier_log_type(env, t, "Invalid type_id");
2891                return -EINVAL;
2892        }
2893
2894        args = (const struct btf_param *)(proto_type + 1);
2895        nr_args = btf_type_vlen(proto_type);
2896        for (i = 0; i < nr_args; i++) {
2897                if (!args[i].name_off && args[i].type) {
2898                        btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
2899                        return -EINVAL;
2900                }
2901        }
2902
2903        return 0;
2904}
2905
2906static const struct btf_kind_operations * const kind_ops[NR_BTF_KINDS] = {
2907        [BTF_KIND_INT] = &int_ops,
2908        [BTF_KIND_PTR] = &ptr_ops,
2909        [BTF_KIND_ARRAY] = &array_ops,
2910        [BTF_KIND_STRUCT] = &struct_ops,
2911        [BTF_KIND_UNION] = &struct_ops,
2912        [BTF_KIND_ENUM] = &enum_ops,
2913        [BTF_KIND_FWD] = &fwd_ops,
2914        [BTF_KIND_TYPEDEF] = &modifier_ops,
2915        [BTF_KIND_VOLATILE] = &modifier_ops,
2916        [BTF_KIND_CONST] = &modifier_ops,
2917        [BTF_KIND_RESTRICT] = &modifier_ops,
2918        [BTF_KIND_FUNC] = &func_ops,
2919        [BTF_KIND_FUNC_PROTO] = &func_proto_ops,
2920        [BTF_KIND_VAR] = &var_ops,
2921        [BTF_KIND_DATASEC] = &datasec_ops,
2922};
2923
2924static s32 btf_check_meta(struct btf_verifier_env *env,
2925                          const struct btf_type *t,
2926                          u32 meta_left)
2927{
2928        u32 saved_meta_left = meta_left;
2929        s32 var_meta_size;
2930
2931        if (meta_left < sizeof(*t)) {
2932                btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu",
2933                                 env->log_type_id, meta_left, sizeof(*t));
2934                return -EINVAL;
2935        }
2936        meta_left -= sizeof(*t);
2937
2938        if (t->info & ~BTF_INFO_MASK) {
2939                btf_verifier_log(env, "[%u] Invalid btf_info:%x",
2940                                 env->log_type_id, t->info);
2941                return -EINVAL;
2942        }
2943
2944        if (BTF_INFO_KIND(t->info) > BTF_KIND_MAX ||
2945            BTF_INFO_KIND(t->info) == BTF_KIND_UNKN) {
2946                btf_verifier_log(env, "[%u] Invalid kind:%u",
2947                                 env->log_type_id, BTF_INFO_KIND(t->info));
2948                return -EINVAL;
2949        }
2950
2951        if (!btf_name_offset_valid(env->btf, t->name_off)) {
2952                btf_verifier_log(env, "[%u] Invalid name_offset:%u",
2953                                 env->log_type_id, t->name_off);
2954                return -EINVAL;
2955        }
2956
2957        var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left);
2958        if (var_meta_size < 0)
2959                return var_meta_size;
2960
2961        meta_left -= var_meta_size;
2962
2963        return saved_meta_left - meta_left;
2964}
2965
2966static int btf_check_all_metas(struct btf_verifier_env *env)
2967{
2968        struct btf *btf = env->btf;
2969        struct btf_header *hdr;
2970        void *cur, *end;
2971
2972        hdr = &btf->hdr;
2973        cur = btf->nohdr_data + hdr->type_off;
2974        end = cur + hdr->type_len;
2975
2976        env->log_type_id = 1;
2977        while (cur < end) {
2978                struct btf_type *t = cur;
2979                s32 meta_size;
2980
2981                meta_size = btf_check_meta(env, t, end - cur);
2982                if (meta_size < 0)
2983                        return meta_size;
2984
2985                btf_add_type(env, t);
2986                cur += meta_size;
2987                env->log_type_id++;
2988        }
2989
2990        return 0;
2991}
2992
2993static bool btf_resolve_valid(struct btf_verifier_env *env,
2994                              const struct btf_type *t,
2995                              u32 type_id)
2996{
2997        struct btf *btf = env->btf;
2998
2999        if (!env_type_is_resolved(env, type_id))
3000                return false;
3001
3002        if (btf_type_is_struct(t) || btf_type_is_datasec(t))
3003                return !btf->resolved_ids[type_id] &&
3004                       !btf->resolved_sizes[type_id];
3005
3006        if (btf_type_is_modifier(t) || btf_type_is_ptr(t) ||
3007            btf_type_is_var(t)) {
3008                t = btf_type_id_resolve(btf, &type_id);
3009                return t &&
3010                       !btf_type_is_modifier(t) &&
3011                       !btf_type_is_var(t) &&
3012                       !btf_type_is_datasec(t);
3013        }
3014
3015        if (btf_type_is_array(t)) {
3016                const struct btf_array *array = btf_type_array(t);
3017                const struct btf_type *elem_type;
3018                u32 elem_type_id = array->type;
3019                u32 elem_size;
3020
3021                elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size);
3022                return elem_type && !btf_type_is_modifier(elem_type) &&
3023                        (array->nelems * elem_size ==
3024                         btf->resolved_sizes[type_id]);
3025        }
3026
3027        return false;
3028}
3029
3030static int btf_resolve(struct btf_verifier_env *env,
3031                       const struct btf_type *t, u32 type_id)
3032{
3033        u32 save_log_type_id = env->log_type_id;
3034        const struct resolve_vertex *v;
3035        int err = 0;
3036
3037        env->resolve_mode = RESOLVE_TBD;
3038        env_stack_push(env, t, type_id);
3039        while (!err && (v = env_stack_peak(env))) {
3040                env->log_type_id = v->type_id;
3041                err = btf_type_ops(v->t)->resolve(env, v);
3042        }
3043
3044        env->log_type_id = type_id;
3045        if (err == -E2BIG) {
3046                btf_verifier_log_type(env, t,
3047                                      "Exceeded max resolving depth:%u",
3048                                      MAX_RESOLVE_DEPTH);
3049        } else if (err == -EEXIST) {
3050                btf_verifier_log_type(env, t, "Loop detected");
3051        }
3052
3053        /* Final sanity check */
3054        if (!err && !btf_resolve_valid(env, t, type_id)) {
3055                btf_verifier_log_type(env, t, "Invalid resolve state");
3056                err = -EINVAL;
3057        }
3058
3059        env->log_type_id = save_log_type_id;
3060        return err;
3061}
3062
3063static int btf_check_all_types(struct btf_verifier_env *env)
3064{
3065        struct btf *btf = env->btf;
3066        u32 type_id;
3067        int err;
3068
3069        err = env_resolve_init(env);
3070        if (err)
3071                return err;
3072
3073        env->phase++;
3074        for (type_id = 1; type_id <= btf->nr_types; type_id++) {
3075                const struct btf_type *t = btf_type_by_id(btf, type_id);
3076
3077                env->log_type_id = type_id;
3078                if (btf_type_needs_resolve(t) &&
3079                    !env_type_is_resolved(env, type_id)) {
3080                        err = btf_resolve(env, t, type_id);
3081                        if (err)
3082                                return err;
3083                }
3084
3085                if (btf_type_is_func_proto(t)) {
3086                        err = btf_func_proto_check(env, t);
3087                        if (err)
3088                                return err;
3089                }
3090
3091                if (btf_type_is_func(t)) {
3092                        err = btf_func_check(env, t);
3093                        if (err)
3094                                return err;
3095                }
3096        }
3097
3098        return 0;
3099}
3100
3101static int btf_parse_type_sec(struct btf_verifier_env *env)
3102{
3103        const struct btf_header *hdr = &env->btf->hdr;
3104        int err;
3105
3106        /* Type section must align to 4 bytes */
3107        if (hdr->type_off & (sizeof(u32) - 1)) {
3108                btf_verifier_log(env, "Unaligned type_off");
3109                return -EINVAL;
3110        }
3111
3112        if (!hdr->type_len) {
3113                btf_verifier_log(env, "No type found");
3114                return -EINVAL;
3115        }
3116
3117        err = btf_check_all_metas(env);
3118        if (err)
3119                return err;
3120
3121        return btf_check_all_types(env);
3122}
3123
3124static int btf_parse_str_sec(struct btf_verifier_env *env)
3125{
3126        const struct btf_header *hdr;
3127        struct btf *btf = env->btf;
3128        const char *start, *end;
3129
3130        hdr = &btf->hdr;
3131        start = btf->nohdr_data + hdr->str_off;
3132        end = start + hdr->str_len;
3133
3134        if (end != btf->data + btf->data_size) {
3135                btf_verifier_log(env, "String section is not at the end");
3136                return -EINVAL;
3137        }
3138
3139        if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_NAME_OFFSET ||
3140            start[0] || end[-1]) {
3141                btf_verifier_log(env, "Invalid string section");
3142                return -EINVAL;
3143        }
3144
3145        btf->strings = start;
3146
3147        return 0;
3148}
3149
3150static const size_t btf_sec_info_offset[] = {
3151        offsetof(struct btf_header, type_off),
3152        offsetof(struct btf_header, str_off),
3153};
3154
3155static int btf_sec_info_cmp(const void *a, const void *b)
3156{
3157        const struct btf_sec_info *x = a;
3158        const struct btf_sec_info *y = b;
3159
3160        return (int)(x->off - y->off) ? : (int)(x->len - y->len);
3161}
3162
3163static int btf_check_sec_info(struct btf_verifier_env *env,
3164                              u32 btf_data_size)
3165{
3166        struct btf_sec_info secs[ARRAY_SIZE(btf_sec_info_offset)];
3167        u32 total, expected_total, i;
3168        const struct btf_header *hdr;
3169        const struct btf *btf;
3170
3171        btf = env->btf;
3172        hdr = &btf->hdr;
3173
3174        /* Populate the secs from hdr */
3175        for (i = 0; i < ARRAY_SIZE(btf_sec_info_offset); i++)
3176                secs[i] = *(struct btf_sec_info *)((void *)hdr +
3177                                                   btf_sec_info_offset[i]);
3178
3179        sort(secs, ARRAY_SIZE(btf_sec_info_offset),
3180             sizeof(struct btf_sec_info), btf_sec_info_cmp, NULL);
3181
3182        /* Check for gaps and overlap among sections */
3183        total = 0;
3184        expected_total = btf_data_size - hdr->hdr_len;
3185        for (i = 0; i < ARRAY_SIZE(btf_sec_info_offset); i++) {
3186                if (expected_total < secs[i].off) {
3187                        btf_verifier_log(env, "Invalid section offset");
3188                        return -EINVAL;
3189                }
3190                if (total < secs[i].off) {
3191                        /* gap */
3192                        btf_verifier_log(env, "Unsupported section found");
3193                        return -EINVAL;
3194                }
3195                if (total > secs[i].off) {
3196                        btf_verifier_log(env, "Section overlap found");
3197                        return -EINVAL;
3198                }
3199                if (expected_total - total < secs[i].len) {
3200                        btf_verifier_log(env,
3201                                         "Total section length too long");
3202                        return -EINVAL;
3203                }
3204                total += secs[i].len;
3205        }
3206
3207        /* There is data other than hdr and known sections */
3208        if (expected_total != total) {
3209                btf_verifier_log(env, "Unsupported section found");
3210                return -EINVAL;
3211        }
3212
3213        return 0;
3214}
3215
3216static int btf_parse_hdr(struct btf_verifier_env *env)
3217{
3218        u32 hdr_len, hdr_copy, btf_data_size;
3219        const struct btf_header *hdr;
3220        struct btf *btf;
3221        int err;
3222
3223        btf = env->btf;
3224        btf_data_size = btf->data_size;
3225
3226        if (btf_data_size <
3227            offsetof(struct btf_header, hdr_len) + sizeof(hdr->hdr_len)) {
3228                btf_verifier_log(env, "hdr_len not found");
3229                return -EINVAL;
3230        }
3231
3232        hdr = btf->data;
3233        hdr_len = hdr->hdr_len;
3234        if (btf_data_size < hdr_len) {
3235                btf_verifier_log(env, "btf_header not found");
3236                return -EINVAL;
3237        }
3238
3239        /* Ensure the unsupported header fields are zero */
3240        if (hdr_len > sizeof(btf->hdr)) {
3241                u8 *expected_zero = btf->data + sizeof(btf->hdr);
3242                u8 *end = btf->data + hdr_len;
3243
3244                for (; expected_zero < end; expected_zero++) {
3245                        if (*expected_zero) {
3246                                btf_verifier_log(env, "Unsupported btf_header");
3247                                return -E2BIG;
3248                        }
3249                }
3250        }
3251
3252        hdr_copy = min_t(u32, hdr_len, sizeof(btf->hdr));
3253        memcpy(&btf->hdr, btf->data, hdr_copy);
3254
3255        hdr = &btf->hdr;
3256
3257        btf_verifier_log_hdr(env, btf_data_size);
3258
3259        if (hdr->magic != BTF_MAGIC) {
3260                btf_verifier_log(env, "Invalid magic");
3261                return -EINVAL;
3262        }
3263
3264        if (hdr->version != BTF_VERSION) {
3265                btf_verifier_log(env, "Unsupported version");
3266                return -ENOTSUPP;
3267        }
3268
3269        if (hdr->flags) {
3270                btf_verifier_log(env, "Unsupported flags");
3271                return -ENOTSUPP;
3272        }
3273
3274        if (btf_data_size == hdr->hdr_len) {
3275                btf_verifier_log(env, "No data");
3276                return -EINVAL;
3277        }
3278
3279        err = btf_check_sec_info(env, btf_data_size);
3280        if (err)
3281                return err;
3282
3283        return 0;
3284}
3285
3286static struct btf *btf_parse(void __user *btf_data, u32 btf_data_size,
3287                             u32 log_level, char __user *log_ubuf, u32 log_size)
3288{
3289        struct btf_verifier_env *env = NULL;
3290        struct bpf_verifier_log *log;
3291        struct btf *btf = NULL;
3292        u8 *data;
3293        int err;
3294
3295        if (btf_data_size > BTF_MAX_SIZE)
3296                return ERR_PTR(-E2BIG);
3297
3298        env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
3299        if (!env)
3300                return ERR_PTR(-ENOMEM);
3301
3302        log = &env->log;
3303        if (log_level || log_ubuf || log_size) {
3304                /* user requested verbose verifier output
3305                 * and supplied buffer to store the verification trace
3306                 */
3307                log->level = log_level;
3308                log->ubuf = log_ubuf;
3309                log->len_total = log_size;
3310
3311                /* log attributes have to be sane */
3312                if (log->len_total < 128 || log->len_total > UINT_MAX >> 8 ||
3313                    !log->level || !log->ubuf) {
3314                        err = -EINVAL;
3315                        goto errout;
3316                }
3317        }
3318
3319        btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN);
3320        if (!btf) {
3321                err = -ENOMEM;
3322                goto errout;
3323        }
3324        env->btf = btf;
3325
3326        data = kvmalloc(btf_data_size, GFP_KERNEL | __GFP_NOWARN);
3327        if (!data) {
3328                err = -ENOMEM;
3329                goto errout;
3330        }
3331
3332        btf->data = data;
3333        btf->data_size = btf_data_size;
3334
3335        if (copy_from_user(data, btf_data, btf_data_size)) {
3336                err = -EFAULT;
3337                goto errout;
3338        }
3339
3340        err = btf_parse_hdr(env);
3341        if (err)
3342                goto errout;
3343
3344        btf->nohdr_data = btf->data + btf->hdr.hdr_len;
3345
3346        err = btf_parse_str_sec(env);
3347        if (err)
3348                goto errout;
3349
3350        err = btf_parse_type_sec(env);
3351        if (err)
3352                goto errout;
3353
3354        if (log->level && bpf_verifier_log_full(log)) {
3355                err = -ENOSPC;
3356                goto errout;
3357        }
3358
3359        btf_verifier_env_free(env);
3360        refcount_set(&btf->refcnt, 1);
3361        return btf;
3362
3363errout:
3364        btf_verifier_env_free(env);
3365        if (btf)
3366                btf_free(btf);
3367        return ERR_PTR(err);
3368}
3369
3370void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj,
3371                       struct seq_file *m)
3372{
3373        const struct btf_type *t = btf_type_by_id(btf, type_id);
3374
3375        btf_type_ops(t)->seq_show(btf, t, type_id, obj, 0, m);
3376}
3377
3378#ifdef CONFIG_PROC_FS
3379static void bpf_btf_show_fdinfo(struct seq_file *m, struct file *filp)
3380{
3381        const struct btf *btf = filp->private_data;
3382
3383        seq_printf(m, "btf_id:\t%u\n", btf->id);
3384}
3385#endif
3386
3387static int btf_release(struct inode *inode, struct file *filp)
3388{
3389        btf_put(filp->private_data);
3390        return 0;
3391}
3392
3393const struct file_operations btf_fops = {
3394#ifdef CONFIG_PROC_FS
3395        .show_fdinfo    = bpf_btf_show_fdinfo,
3396#endif
3397        .release        = btf_release,
3398};
3399
3400static int __btf_new_fd(struct btf *btf)
3401{
3402        return anon_inode_getfd("btf", &btf_fops, btf, O_RDONLY | O_CLOEXEC);
3403}
3404
3405int btf_new_fd(const union bpf_attr *attr)
3406{
3407        struct btf *btf;
3408        int ret;
3409
3410        btf = btf_parse(u64_to_user_ptr(attr->btf),
3411                        attr->btf_size, attr->btf_log_level,
3412                        u64_to_user_ptr(attr->btf_log_buf),
3413                        attr->btf_log_size);
3414        if (IS_ERR(btf))
3415                return PTR_ERR(btf);
3416
3417        ret = btf_alloc_id(btf);
3418        if (ret) {
3419                btf_free(btf);
3420                return ret;
3421        }
3422
3423        /*
3424         * The BTF ID is published to the userspace.
3425         * All BTF free must go through call_rcu() from
3426         * now on (i.e. free by calling btf_put()).
3427         */
3428
3429        ret = __btf_new_fd(btf);
3430        if (ret < 0)
3431                btf_put(btf);
3432
3433        return ret;
3434}
3435
3436struct btf *btf_get_by_fd(int fd)
3437{
3438        struct btf *btf;
3439        struct fd f;
3440
3441        f = fdget(fd);
3442
3443        if (!f.file)
3444                return ERR_PTR(-EBADF);
3445
3446        if (f.file->f_op != &btf_fops) {
3447                fdput(f);
3448                return ERR_PTR(-EINVAL);
3449        }
3450
3451        btf = f.file->private_data;
3452        refcount_inc(&btf->refcnt);
3453        fdput(f);
3454
3455        return btf;
3456}
3457
3458int btf_get_info_by_fd(const struct btf *btf,
3459                       const union bpf_attr *attr,
3460                       union bpf_attr __user *uattr)
3461{
3462        struct bpf_btf_info __user *uinfo;
3463        struct bpf_btf_info info = {};
3464        u32 info_copy, btf_copy;
3465        void __user *ubtf;
3466        u32 uinfo_len;
3467
3468        uinfo = u64_to_user_ptr(attr->info.info);
3469        uinfo_len = attr->info.info_len;
3470
3471        info_copy = min_t(u32, uinfo_len, sizeof(info));
3472        if (copy_from_user(&info, uinfo, info_copy))
3473                return -EFAULT;
3474
3475        info.id = btf->id;
3476        ubtf = u64_to_user_ptr(info.btf);
3477        btf_copy = min_t(u32, btf->data_size, info.btf_size);
3478        if (copy_to_user(ubtf, btf->data, btf_copy))
3479                return -EFAULT;
3480        info.btf_size = btf->data_size;
3481
3482        if (copy_to_user(uinfo, &info, info_copy) ||
3483            put_user(info_copy, &uattr->info.info_len))
3484                return -EFAULT;
3485
3486        return 0;
3487}
3488
3489int btf_get_fd_by_id(u32 id)
3490{
3491        struct btf *btf;
3492        int fd;
3493
3494        rcu_read_lock();
3495        btf = idr_find(&btf_idr, id);
3496        if (!btf || !refcount_inc_not_zero(&btf->refcnt))
3497                btf = ERR_PTR(-ENOENT);
3498        rcu_read_unlock();
3499
3500        if (IS_ERR(btf))
3501                return PTR_ERR(btf);
3502
3503        fd = __btf_new_fd(btf);
3504        if (fd < 0)
3505                btf_put(btf);
3506
3507        return fd;
3508}
3509
3510u32 btf_id(const struct btf *btf)
3511{
3512        return btf->id;
3513}
3514