From: Jakub Kicinski > Sent: 19 October 2017 23:46 > 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>`).
Guess why most modern instruction sets use a 'load high' instruction to generate big constants... Interestingly, is there anything special in the rest of the second instruction in order to make it an identifiable no-op? ... > 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, ...) > 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; > + } Why not just: for (i = 0; i < len / sizeof(*insn); i += 1 + double_insn) { ... David