tools: bpftool: print all relevant byte opcodes for "load double word"
authorQuentin Monnet <quentin.monnet@netronome.com>
Thu, 19 Oct 2017 22:46:24 +0000 (15:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 22 Oct 2017 01:11:32 +0000 (02:11 +0100)
The eBPF instruction permitting to load double words (8 bytes) into a
register need 8-byte long "immediate" field, and thus occupy twice the
space of other instructions. bpftool was aware of this and would
increment the instruction counter only once on meeting such instruction,
but it would only print the first four bytes of the immediate value to
load. Make it able to dump the whole 16 byte-long double instruction
instead (as would `llvm-objdump -d <program>`).

Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/bpf/bpftool/prog.c

index 355c14325622f2ae76ba9ded0dbde6a1f83ca909..57edbea2fbe8293e474bac7909fccd76302bfe4a 100644 (file)
@@ -313,20 +313,29 @@ static void print_insn(struct bpf_verifier_env *env, const char *fmt, ...)
 static void dump_xlated(void *buf, unsigned int len, bool opcodes)
 {
        struct bpf_insn *insn = buf;
+       bool double_insn = false;
        unsigned int i;
 
        for (i = 0; i < len / sizeof(*insn); i++) {
+               if (double_insn) {
+                       double_insn = false;
+                       continue;
+               }
+
+               double_insn = insn[i].code == (BPF_LD | BPF_IMM | BPF_DW);
+
                printf("% 4d: ", i);
                print_bpf_insn(print_insn, NULL, insn + i, true);
 
                if (opcodes) {
                        printf("       ");
                        fprint_hex(stdout, insn + i, 8, " ");
+                       if (double_insn && i < len - 1) {
+                               printf(" ");
+                               fprint_hex(stdout, insn + i + 1, 8, " ");
+                       }
                        printf("\n");
                }
-
-               if (insn[i].code == (BPF_LD | BPF_IMM | BPF_DW))
-                       i++;
        }
 }