Commit 14032f26 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

libbpf: Simplify bpf_core_parse_spec() signature

Simplify bpf_core_parse_spec() signature to take struct bpf_core_relo as
an input instead of requiring callers to decompose them into type_id,
relo, spec_str, etc. This makes using and reusing this helper easier.
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20220426004511.2691730-9-andrii@kernel.org
parent b58af63a
...@@ -179,28 +179,27 @@ static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind) ...@@ -179,28 +179,27 @@ static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind)
* string to specify enumerator's value index that need to be relocated. * string to specify enumerator's value index that need to be relocated.
*/ */
static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
__u32 type_id, const struct bpf_core_relo *relo,
const char *spec_str,
enum bpf_core_relo_kind relo_kind,
struct bpf_core_spec *spec) struct bpf_core_spec *spec)
{ {
int access_idx, parsed_len, i; int access_idx, parsed_len, i;
struct bpf_core_accessor *acc; struct bpf_core_accessor *acc;
const struct btf_type *t; const struct btf_type *t;
const char *name; const char *name, *spec_str;
__u32 id; __u32 id;
__s64 sz; __s64 sz;
spec_str = btf__name_by_offset(btf, relo->access_str_off);
if (str_is_empty(spec_str) || *spec_str == ':') if (str_is_empty(spec_str) || *spec_str == ':')
return -EINVAL; return -EINVAL;
memset(spec, 0, sizeof(*spec)); memset(spec, 0, sizeof(*spec));
spec->btf = btf; spec->btf = btf;
spec->root_type_id = type_id; spec->root_type_id = relo->type_id;
spec->relo_kind = relo_kind; spec->relo_kind = relo->kind;
/* type-based relocations don't have a field access string */ /* type-based relocations don't have a field access string */
if (core_relo_is_type_based(relo_kind)) { if (core_relo_is_type_based(relo->kind)) {
if (strcmp(spec_str, "0")) if (strcmp(spec_str, "0"))
return -EINVAL; return -EINVAL;
return 0; return 0;
...@@ -221,7 +220,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, ...@@ -221,7 +220,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
if (spec->raw_len == 0) if (spec->raw_len == 0)
return -EINVAL; return -EINVAL;
t = skip_mods_and_typedefs(btf, type_id, &id); t = skip_mods_and_typedefs(btf, relo->type_id, &id);
if (!t) if (!t)
return -EINVAL; return -EINVAL;
...@@ -231,7 +230,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, ...@@ -231,7 +230,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
acc->idx = access_idx; acc->idx = access_idx;
spec->len++; spec->len++;
if (core_relo_is_enumval_based(relo_kind)) { if (core_relo_is_enumval_based(relo->kind)) {
if (!btf_is_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t)) if (!btf_is_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t))
return -EINVAL; return -EINVAL;
...@@ -240,7 +239,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, ...@@ -240,7 +239,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
return 0; return 0;
} }
if (!core_relo_is_field_based(relo_kind)) if (!core_relo_is_field_based(relo->kind))
return -EINVAL; return -EINVAL;
sz = btf__resolve_size(btf, id); sz = btf__resolve_size(btf, id);
...@@ -301,7 +300,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, ...@@ -301,7 +300,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
spec->bit_offset += access_idx * sz * 8; spec->bit_offset += access_idx * sz * 8;
} else { } else {
pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n", pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n",
prog_name, type_id, spec_str, i, id, btf_kind_str(t)); prog_name, relo->type_id, spec_str, i, id, btf_kind_str(t));
return -EINVAL; return -EINVAL;
} }
} }
...@@ -1182,7 +1181,6 @@ int bpf_core_calc_relo_insn(const char *prog_name, ...@@ -1182,7 +1181,6 @@ int bpf_core_calc_relo_insn(const char *prog_name,
const struct btf_type *local_type; const struct btf_type *local_type;
const char *local_name; const char *local_name;
__u32 local_id; __u32 local_id;
const char *spec_str;
char spec_buf[256]; char spec_buf[256];
int i, j, err; int i, j, err;
...@@ -1192,17 +1190,15 @@ int bpf_core_calc_relo_insn(const char *prog_name, ...@@ -1192,17 +1190,15 @@ int bpf_core_calc_relo_insn(const char *prog_name,
if (!local_name) if (!local_name)
return -EINVAL; return -EINVAL;
spec_str = btf__name_by_offset(local_btf, relo->access_str_off); err = bpf_core_parse_spec(prog_name, local_btf, relo, local_spec);
if (str_is_empty(spec_str))
return -EINVAL;
err = bpf_core_parse_spec(prog_name, local_btf, local_id, spec_str,
relo->kind, local_spec);
if (err) { if (err) {
const char *spec_str;
spec_str = btf__name_by_offset(local_btf, relo->access_str_off);
pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n", pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n",
prog_name, relo_idx, local_id, btf_kind_str(local_type), prog_name, relo_idx, local_id, btf_kind_str(local_type),
str_is_empty(local_name) ? "<anon>" : local_name, str_is_empty(local_name) ? "<anon>" : local_name,
spec_str, err); spec_str ?: "<?>", err);
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment