45 lines
1.6 KiB
Diff
45 lines
1.6 KiB
Diff
From 27942f477d1069adab3f6c45f59146bc9379dd45 Mon Sep 17 00:00:00 2001
|
|
From: Quentin Monnet <quentin@isovalent.com>
|
|
Date: Wed, 5 Apr 2023 14:21:15 +0100
|
|
Subject: 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>
|
|
---
|
|
src/xlated_dumper.c | 7 +++++++
|
|
1 file changed, 7 insertions(+)
|
|
|
|
diff --git a/src/xlated_dumper.c b/src/xlated_dumper.c
|
|
index 8608cd68cdd07..13d614b16f6c2 100644
|
|
--- a/src/xlated_dumper.c
|
|
+++ b/src/xlated_dumper.c
|
|
@@ -363,8 +363,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)
|
|
--
|
|
cgit
|
|
|