bpftool: Fix bug for long instructions in program CFG dumps
authorQuentin Monnet <quentin@isovalent.com>
Wed, 5 Apr 2023 13:21:15 +0000 (14:21 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 6 Apr 2023 04:27:27 +0000 (21:27 -0700)
When dumping the control flow graphs for programs using the 16-byte long
load instruction, we need to skip the second part of this instruction
when looking for the next instruction to process. Otherwise, we end up
printing "BUG_ld_00" from the kernel disassembler in the CFG.

Fixes: efcef17a6d65 ("tools: bpftool: generate .dot graph from CFG information")
Signed-off-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20230405132120.59886-3-quentin@isovalent.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/bpf/bpftool/xlated_dumper.c

index 6fe3134ae45d4feaf72ac0fb2072deb8d68c844b..3daa05d9bbb7337cecf1303174a3627fb88a0af9 100644 (file)
@@ -372,8 +372,15 @@ void dump_xlated_for_graph(struct dump_data *dd, void *buf_start, void *buf_end,
        struct bpf_insn *insn_start = buf_start;
        struct bpf_insn *insn_end = buf_end;
        struct bpf_insn *cur = insn_start;
+       bool double_insn = false;
 
        for (; cur <= insn_end; cur++) {
+               if (double_insn) {
+                       double_insn = false;
+                       continue;
+               }
+               double_insn = cur->code == (BPF_LD | BPF_IMM | BPF_DW);
+
                printf("% 4d: ", (int)(cur - insn_start + start_idx));
                print_bpf_insn(&cbs, cur, true);
                if (cur != insn_end)