diff options
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r-- | tools/bpf/bpftool/prog.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 355c14325622..57edbea2fbe8 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c | |||
@@ -313,20 +313,29 @@ static void print_insn(struct bpf_verifier_env *env, const char *fmt, ...) | |||
313 | static void dump_xlated(void *buf, unsigned int len, bool opcodes) | 313 | static void dump_xlated(void *buf, unsigned int len, bool opcodes) |
314 | { | 314 | { |
315 | struct bpf_insn *insn = buf; | 315 | struct bpf_insn *insn = buf; |
316 | bool double_insn = false; | ||
316 | unsigned int i; | 317 | unsigned int i; |
317 | 318 | ||
318 | for (i = 0; i < len / sizeof(*insn); i++) { | 319 | for (i = 0; i < len / sizeof(*insn); i++) { |
320 | if (double_insn) { | ||
321 | double_insn = false; | ||
322 | continue; | ||
323 | } | ||
324 | |||
325 | double_insn = insn[i].code == (BPF_LD | BPF_IMM | BPF_DW); | ||
326 | |||
319 | printf("% 4d: ", i); | 327 | printf("% 4d: ", i); |
320 | print_bpf_insn(print_insn, NULL, insn + i, true); | 328 | print_bpf_insn(print_insn, NULL, insn + i, true); |
321 | 329 | ||
322 | if (opcodes) { | 330 | if (opcodes) { |
323 | printf(" "); | 331 | printf(" "); |
324 | fprint_hex(stdout, insn + i, 8, " "); | 332 | fprint_hex(stdout, insn + i, 8, " "); |
333 | if (double_insn && i < len - 1) { | ||
334 | printf(" "); | ||
335 | fprint_hex(stdout, insn + i + 1, 8, " "); | ||
336 | } | ||
325 | printf("\n"); | 337 | printf("\n"); |
326 | } | 338 | } |
327 | |||
328 | if (insn[i].code == (BPF_LD | BPF_IMM | BPF_DW)) | ||
329 | i++; | ||
330 | } | 339 | } |
331 | } | 340 | } |
332 | 341 | ||