Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools: bpftool: use 4 context mode for the NFP disasm

The nfp driver is currently always JITing the BPF for 4 context/thread
mode of the NFP flow processors. Tell this to the disassembler,
otherwise some registers may be incorrectly decoded.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>

authored by

Jakub Kicinski and committed by
Daniel Borkmann
3ddeac67 1bd70d2e

+20 -9
+4 -1
tools/bpf/bpftool/common.c
··· 554 554 return read_sysfs_hex_int(full_path); 555 555 } 556 556 557 - const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino) 557 + const char * 558 + ifindex_to_bfd_params(__u32 ifindex, __u64 ns_dev, __u64 ns_ino, 559 + const char **opt) 558 560 { 559 561 char devname[IF_NAMESIZE]; 560 562 int vendor_id; ··· 581 579 device_id != 0x6000 && 582 580 device_id != 0x6003) 583 581 p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch"); 582 + *opt = "ctx4"; 584 583 return "NFP-6xxx"; 585 584 default: 586 585 p_err("Can't get bfd arch name for device vendor id 0x%04x",
+3 -1
tools/bpf/bpftool/jit_disasm.c
··· 77 77 } 78 78 79 79 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, 80 - const char *arch) 80 + const char *arch, const char *disassembler_options) 81 81 { 82 82 disassembler_ftype disassemble; 83 83 struct disassemble_info info; ··· 116 116 117 117 info.arch = bfd_get_arch(bfdf); 118 118 info.mach = bfd_get_mach(bfdf); 119 + if (disassembler_options) 120 + info.disassembler_options = disassembler_options; 119 121 info.buffer = image; 120 122 info.buffer_length = len; 121 123
+4 -2
tools/bpf/bpftool/main.h
··· 145 145 int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len); 146 146 147 147 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, 148 - const char *arch); 148 + const char *arch, const char *disassembler_options); 149 149 void print_data_json(uint8_t *data, size_t len); 150 150 void print_hex_data_json(uint8_t *data, size_t len); 151 151 152 152 unsigned int get_page_size(void); 153 153 unsigned int get_possible_cpus(void); 154 - const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino); 154 + const char * 155 + ifindex_to_bfd_params(__u32 ifindex, __u64 ns_dev, __u64 ns_ino, 156 + const char **opt); 155 157 156 158 struct btf_dumper { 157 159 const struct btf *btf;
+9 -5
tools/bpf/bpftool/prog.c
··· 449 449 unsigned long *func_ksyms = NULL; 450 450 struct bpf_prog_info info = {}; 451 451 unsigned int *func_lens = NULL; 452 + const char *disasm_opt = NULL; 452 453 unsigned int nr_func_ksyms; 453 454 unsigned int nr_func_lens; 454 455 struct dump_data dd = {}; ··· 608 607 const char *name = NULL; 609 608 610 609 if (info.ifindex) { 611 - name = ifindex_to_bfd_name_ns(info.ifindex, 612 - info.netns_dev, 613 - info.netns_ino); 610 + name = ifindex_to_bfd_params(info.ifindex, 611 + info.netns_dev, 612 + info.netns_ino, 613 + &disasm_opt); 614 614 if (!name) 615 615 goto err_free; 616 616 } ··· 653 651 printf("%s:\n", sym_name); 654 652 } 655 653 656 - disasm_print_insn(img, lens[i], opcodes, name); 654 + disasm_print_insn(img, lens[i], opcodes, name, 655 + disasm_opt); 657 656 img += lens[i]; 658 657 659 658 if (json_output) ··· 666 663 if (json_output) 667 664 jsonw_end_array(json_wtr); 668 665 } else { 669 - disasm_print_insn(buf, *member_len, opcodes, name); 666 + disasm_print_insn(buf, *member_len, opcodes, name, 667 + disasm_opt); 670 668 } 671 669 } else if (visual) { 672 670 if (json_output)