tools: bpftool: use 4 context mode for the NFP disasm
authorJakub Kicinski <jakub.kicinski@netronome.com>
Thu, 18 Oct 2018 18:34:55 +0000 (11:34 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 18 Oct 2018 20:16:02 +0000 (22:16 +0200)
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>
tools/bpf/bpftool/common.c
tools/bpf/bpftool/jit_disasm.c
tools/bpf/bpftool/main.h
tools/bpf/bpftool/prog.c

index 3318da8060bd16232a381f789971ea6530070dff..25af85304ebee3b073d9e7d0036038c5c4c05d68 100644 (file)
@@ -554,7 +554,9 @@ static int read_sysfs_netdev_hex_int(char *devname, const char *entry_name)
        return read_sysfs_hex_int(full_path);
 }
 
-const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino)
+const char *
+ifindex_to_bfd_params(__u32 ifindex, __u64 ns_dev, __u64 ns_ino,
+                     const char **opt)
 {
        char devname[IF_NAMESIZE];
        int vendor_id;
@@ -579,6 +581,7 @@ const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino)
                    device_id != 0x6000 &&
                    device_id != 0x6003)
                        p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch");
+               *opt = "ctx4";
                return "NFP-6xxx";
        default:
                p_err("Can't get bfd arch name for device vendor id 0x%04x",
index 87439320ef70e1ce5f17d437ff1d882897ccab78..c75ffd9ce2bb30c34ae644f617d667348431f5bd 100644 (file)
@@ -77,7 +77,7 @@ static int fprintf_json(void *out, const char *fmt, ...)
 }
 
 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
-                      const char *arch)
+                      const char *arch, const char *disassembler_options)
 {
        disassembler_ftype disassemble;
        struct disassemble_info info;
@@ -116,6 +116,8 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
 
        info.arch = bfd_get_arch(bfdf);
        info.mach = bfd_get_mach(bfdf);
+       if (disassembler_options)
+               info.disassembler_options = disassembler_options;
        info.buffer = image;
        info.buffer_length = len;
 
index 28ee769bd11b7fd01e88068d00db43445b676dbf..28322ace285653f91a9fe42e69a29483b0a1280b 100644 (file)
@@ -145,13 +145,15 @@ int map_parse_fd(int *argc, char ***argv);
 int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len);
 
 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
-                      const char *arch);
+                      const char *arch, const char *disassembler_options);
 void print_data_json(uint8_t *data, size_t len);
 void print_hex_data_json(uint8_t *data, size_t len);
 
 unsigned int get_page_size(void);
 unsigned int get_possible_cpus(void);
-const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino);
+const char *
+ifindex_to_bfd_params(__u32 ifindex, __u64 ns_dev, __u64 ns_ino,
+                     const char **opt);
 
 struct btf_dumper {
        const struct btf *btf;
index 335028968dfb95b1f89ec08b3c168bd6f726b582..5302ee282409eb039458447ad40215f24516c48a 100644 (file)
@@ -449,6 +449,7 @@ static int do_dump(int argc, char **argv)
        unsigned long *func_ksyms = NULL;
        struct bpf_prog_info info = {};
        unsigned int *func_lens = NULL;
+       const char *disasm_opt = NULL;
        unsigned int nr_func_ksyms;
        unsigned int nr_func_lens;
        struct dump_data dd = {};
@@ -607,9 +608,10 @@ static int do_dump(int argc, char **argv)
                const char *name = NULL;
 
                if (info.ifindex) {
-                       name = ifindex_to_bfd_name_ns(info.ifindex,
-                                                     info.netns_dev,
-                                                     info.netns_ino);
+                       name = ifindex_to_bfd_params(info.ifindex,
+                                                    info.netns_dev,
+                                                    info.netns_ino,
+                                                    &disasm_opt);
                        if (!name)
                                goto err_free;
                }
@@ -651,7 +653,8 @@ static int do_dump(int argc, char **argv)
                                        printf("%s:\n", sym_name);
                                }
 
-                               disasm_print_insn(img, lens[i], opcodes, name);
+                               disasm_print_insn(img, lens[i], opcodes, name,
+                                                 disasm_opt);
                                img += lens[i];
 
                                if (json_output)
@@ -663,7 +666,8 @@ static int do_dump(int argc, char **argv)
                        if (json_output)
                                jsonw_end_array(json_wtr);
                } else {
-                       disasm_print_insn(buf, *member_len, opcodes, name);
+                       disasm_print_insn(buf, *member_len, opcodes, name,
+                                         disasm_opt);
                }
        } else if (visual) {
                if (json_output)