Lines Matching refs:spec
2043 pr_warn("map '%s': key spec is not PTR: %s.\n",
2085 pr_warn("map '%s': value spec is not PTR: %s.\n",
2136 pr_warn("map '%s': map-in-map inner spec is not a zero-sized array.\n",
4382 /* high-level spec: named fields and array indices only */
4383 struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN];
4388 /* high-level spec length */
4390 /* raw, low-level spec: 1-to-1 with accessor spec string */
4392 /* raw spec length */
4394 /* field bit offset represented by spec */
4477 * Turn bpf_core_relo into a low- and high-level spec representation,
4479 * field bit offset, specified by accessor string. Low-level spec captures
4498 * Low-level spec has 1:1 mapping with each element of access string (it's
4501 * High-level spec will capture only 3 points:
4503 * - field 'a' access (corresponds to '2' in low-level spec);
4504 * - array element #3 access (corresponds to '3' in low-level spec).
4508 * spec and raw_spec are kept empty.
4517 struct bpf_core_spec *spec)
4529 memset(spec, 0, sizeof(*spec));
4530 spec->btf = btf;
4531 spec->root_type_id = type_id;
4532 spec->relo_kind = relo_kind;
4547 if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN)
4550 spec->raw_spec[spec->raw_len++] = access_idx;
4553 if (spec->raw_len == 0)
4560 access_idx = spec->raw_spec[0];
4561 acc = &spec->spec[0];
4564 spec->len++;
4567 if (!btf_is_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t))
4581 spec->bit_offset = access_idx * sz * 8;
4583 for (i = 1; i < spec->raw_len; i++) {
4588 access_idx = spec->raw_spec[i];
4589 acc = &spec->spec[spec->len];
4599 spec->bit_offset += bit_offset;
4610 spec->len++;
4626 spec->spec[spec->len].type_id = id;
4627 spec->spec[spec->len].idx = access_idx;
4628 spec->len++;
4633 spec->bit_offset += access_idx * sz * 8;
4811 * maintain low-level spec for target as well. Also keep updating target
4828 struct bpf_core_spec *spec,
4856 if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN)
4860 spec->bit_offset += bit_offset;
4861 spec->raw_spec[spec->raw_len++] = i;
4868 spec, next_targ_id);
4875 targ_acc = &spec->spec[spec->len++];
4885 spec->len--; /* pop accessor */
4889 spec->bit_offset -= bit_offset;
4890 spec->raw_len--;
4991 * Try to match local spec to a target type and, if successful, produce full
4992 * target spec (high-level, low-level + bit offset).
5014 local_acc = &local_spec->spec[0];
5015 targ_acc = &targ_spec->spec[0];
5107 const struct bpf_core_spec *spec,
5122 *val = spec ? 1 : 0;
5126 if (!spec)
5129 acc = &spec->spec[spec->len - 1];
5130 t = btf__type_by_id(spec->btf, acc->type_id);
5135 *val = spec->bit_offset / 8;
5137 sz = btf__resolve_size(spec->btf, acc->type_id);
5143 sz = btf__resolve_size(spec->btf, acc->type_id);
5158 mt = skip_mods_and_typedefs(spec->btf, m->type, &field_type_id);
5159 bit_off = spec->bit_offset;
5178 sz = btf__resolve_size(spec->btf, field_type_id);
5182 byte_off = spec->bit_offset / 8;
5232 const struct bpf_core_spec *spec,
5238 if (!spec) {
5245 *val = spec->root_type_id;
5251 sz = btf__resolve_size(spec->btf, spec->root_type_id);
5266 const struct bpf_core_spec *spec,
5274 *val = spec ? 1 : 0;
5277 if (!spec)
5279 t = btf__type_by_id(spec->btf, spec->spec[0].type_id);
5280 e = btf_enum(t) + spec->spec[0].idx;
5458 * For existence relocations target spec will be NULL if field/type is not found.
5460 * spec, and is checked before patching instruction. If actual insn->imm value
5609 /* Output spec definition in the format:
5610 * [<type-id>] (<type-name>) + <raw-spec> => <offset>@<spec>,
5611 * where <spec> is a C-syntax view of recorded field access, e.g.: x.a[3].b
5613 static void bpf_core_dump_spec(int level, const struct bpf_core_spec *spec)
5621 type_id = spec->root_type_id;
5622 t = btf__type_by_id(spec->btf, type_id);
5623 s = btf__name_by_offset(spec->btf, t->name_off);
5627 if (core_relo_is_type_based(spec->relo_kind))
5630 if (core_relo_is_enumval_based(spec->relo_kind)) {
5631 t = skip_mods_and_typedefs(spec->btf, type_id, NULL);
5632 e = btf_enum(t) + spec->raw_spec[0];
5633 s = btf__name_by_offset(spec->btf, e->name_off);
5639 if (core_relo_is_field_based(spec->relo_kind)) {
5640 for (i = 0; i < spec->len; i++) {
5641 if (spec->spec[i].name)
5642 libbpf_print(level, ".%s", spec->spec[i].name);
5643 else if (i > 0 || spec->spec[i].idx > 0)
5644 libbpf_print(level, "[%u]", spec->spec[i].idx);
5648 for (i = 0; i < spec->raw_len; i++)
5649 libbpf_print(level, "%s%d", i == 0 ? "" : ":", spec->raw_spec[i]);
5651 if (spec->bit_offset % 8)
5653 spec->bit_offset / 8, spec->bit_offset % 8);
5655 libbpf_print(level, " @ offset %u)", spec->bit_offset / 8);
5701 * high-level spec accessors, meaning that all named fields should match,
5705 * matching the spec. As long as all the specs resolve to the same set of
5764 pr_debug("prog '%s': relo #%d: kind <%s> (%d), spec is ", prog->name,