summaryrefslogtreecommitdiff
path: root/tools/bpf
diff options
context:
space:
mode:
authorQuentin Monnet <quentin@isovalent.com>2023-04-05 14:21:15 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-05-11 23:00:27 +0900
commit80bfd8b184d8dd87921d4f78ddea7fdc0077c1d6 (patch)
treef9998e9faf626613f62f6fc266ec388b53aabfbc /tools/bpf
parentafdc3a4bd77d07ea4aab2bcbd2643301534054a3 (diff)
downloadlinux-80bfd8b184d8dd87921d4f78ddea7fdc0077c1d6.tar.gz
linux-80bfd8b184d8dd87921d4f78ddea7fdc0077c1d6.tar.bz2
linux-80bfd8b184d8dd87921d4f78ddea7fdc0077c1d6.zip
bpftool: Fix bug for long instructions in program CFG dumps
[ Upstream commit 67cf52cdb6c8fa6365d29106555dacf95c9fd374 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'tools/bpf')
-rw-r--r--tools/bpf/bpftool/xlated_dumper.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/tools/bpf/bpftool/xlated_dumper.c b/tools/bpf/bpftool/xlated_dumper.c
index f1f32e21d5cd..b91c62d0a7d6 100644
--- a/tools/bpf/bpftool/xlated_dumper.c
+++ b/tools/bpf/bpftool/xlated_dumper.c
@@ -369,8 +369,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)