• Yonghong Song's avatar
    tools: bpftool: fix a bitfield pretty print issue · 528bff0c
    Yonghong Song authored
    Commit b12d6ec0 ("bpf: btf: add btf print functionality")
    added btf pretty print functionality to bpftool.
    There is a problem though in printing a bitfield whose type
    has modifiers.
    
    For example, for a type like
      typedef int ___int;
      struct tmp_t {
              int a:3;
              ___int b:3;
      };
    Suppose we have a map
      struct bpf_map_def SEC("maps") tmpmap = {
              .type = BPF_MAP_TYPE_HASH,
              .key_size = sizeof(__u32),
              .value_size = sizeof(struct tmp_t),
              .max_entries = 1,
      };
    and the hash table is populated with one element with
    key 0 and value (.a = 1 and .b = 2).
    
    In BTF, the struct member "b" will have a type "typedef" which
    points to an int type. The current implementation does not
    pass the bit offset during transition from typedef to int type,
    hence incorrectly print the value as
      $ bpftool m d id 79
      [{
              "key": 0,
              "value": {
                  "a": 0x1,
                  "b": 0x1
              }
          }
      ]
    
    This patch fixed the issue by carrying bit_offset along the type
    chain during bit_field print. The correct result can be printed as
      $ bpftool m d id 76
      [{
              "key": 0,
              "value": {
                  "a": 0x1,
                  "b": 0x2
              }
          }
      ]
    
    The kernel pretty print is implemented correctly and does not
    have this issue.
    
    Fixes: b12d6ec0 ("bpf: btf: add btf print functionality")
    Signed-off-by: default avatarYonghong Song <yhs@fb.com>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    528bff0c
btf_dumper.c 6.41 KB