Commit 67cf52cd authored by Quentin Monnet's avatar Quentin Monnet Committed by Alexei Starovoitov

bpftool: Fix bug for long instructions in program CFG dumps

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: efcef17a ("tools: bpftool: generate .dot graph from CFG information")
Signed-off-by: default avatarQuentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20230405132120.59886-3-quentin@isovalent.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent e27f0f16
...@@ -372,8 +372,15 @@ void dump_xlated_for_graph(struct dump_data *dd, void *buf_start, void *buf_end, ...@@ -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_start = buf_start;
struct bpf_insn *insn_end = buf_end; struct bpf_insn *insn_end = buf_end;
struct bpf_insn *cur = insn_start; struct bpf_insn *cur = insn_start;
bool double_insn = false;
for (; cur <= insn_end; cur++) { 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)); printf("% 4d: ", (int)(cur - insn_start + start_idx));
print_bpf_insn(&cbs, cur, true); print_bpf_insn(&cbs, cur, true);
if (cur != insn_end) if (cur != insn_end)
......
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