Skip to content

Commit

Permalink
bpftool: Print the enum's name instead of value
Browse files Browse the repository at this point in the history
This patch prints the enum's name if there is one found in
the array of btf_enum.

The commit 9eea984 ("bpf: fix BTF verification of enums")
has details about an enum could have any power-of-2 size (up to 8 bytes).
This patch also takes this chance to accommodate these non 4 byte
enums.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20200318171637.128862-1-kafai@fb.com
  • Loading branch information
Martin KaFai Lau authored and Daniel Borkmann committed Mar 20, 2020
1 parent 90ceddc commit ca7e6e4
Showing 1 changed file with 36 additions and 4 deletions.
40 changes: 36 additions & 4 deletions tools/bpf/bpftool/btf_dumper.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,42 @@ static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id,
return btf_dumper_do_type(d, actual_type_id, bit_offset, data);
}

static void btf_dumper_enum(const void *data, json_writer_t *jw)
static int btf_dumper_enum(const struct btf_dumper *d,
const struct btf_type *t,
const void *data)
{
jsonw_printf(jw, "%d", *(int *)data);
const struct btf_enum *enums = btf_enum(t);
__s64 value;
__u16 i;

switch (t->size) {
case 8:
value = *(__s64 *)data;
break;
case 4:
value = *(__s32 *)data;
break;
case 2:
value = *(__s16 *)data;
break;
case 1:
value = *(__s8 *)data;
break;
default:
return -EINVAL;
}

for (i = 0; i < btf_vlen(t); i++) {
if (value == enums[i].val) {
jsonw_string(d->jw,
btf__name_by_offset(d->btf,
enums[i].name_off));
return 0;
}
}

jsonw_int(d->jw, value);
return 0;
}

static int btf_dumper_array(const struct btf_dumper *d, __u32 type_id,
Expand Down Expand Up @@ -366,8 +399,7 @@ static int btf_dumper_do_type(const struct btf_dumper *d, __u32 type_id,
case BTF_KIND_ARRAY:
return btf_dumper_array(d, type_id, data);
case BTF_KIND_ENUM:
btf_dumper_enum(data, d->jw);
return 0;
return btf_dumper_enum(d, t, data);
case BTF_KIND_PTR:
btf_dumper_ptr(data, d->jw, d->is_plain_text);
return 0;
Expand Down

0 comments on commit ca7e6e4

Please sign in to comment.