Skip to content

Commit 3ddeac6

Browse files
Jakub Kicinskiborkmann
authored andcommitted
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 <[email protected]> Reviewed-by: Jiong Wang <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 1bd70d2 commit 3ddeac6

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

tools/bpf/bpftool/common.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,9 @@ static int read_sysfs_netdev_hex_int(char *devname, const char *entry_name)
554554
return read_sysfs_hex_int(full_path);
555555
}
556556

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)
558560
{
559561
char devname[IF_NAMESIZE];
560562
int vendor_id;
@@ -579,6 +581,7 @@ const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino)
579581
device_id != 0x6000 &&
580582
device_id != 0x6003)
581583
p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch");
584+
*opt = "ctx4";
582585
return "NFP-6xxx";
583586
default:
584587
p_err("Can't get bfd arch name for device vendor id 0x%04x",

tools/bpf/bpftool/jit_disasm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ static int fprintf_json(void *out, const char *fmt, ...)
7777
}
7878

7979
void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
80-
const char *arch)
80+
const char *arch, const char *disassembler_options)
8181
{
8282
disassembler_ftype disassemble;
8383
struct disassemble_info info;
@@ -116,6 +116,8 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
116116

117117
info.arch = bfd_get_arch(bfdf);
118118
info.mach = bfd_get_mach(bfdf);
119+
if (disassembler_options)
120+
info.disassembler_options = disassembler_options;
119121
info.buffer = image;
120122
info.buffer_length = len;
121123

tools/bpf/bpftool/main.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,15 @@ int map_parse_fd(int *argc, char ***argv);
145145
int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len);
146146

147147
void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
148-
const char *arch);
148+
const char *arch, const char *disassembler_options);
149149
void print_data_json(uint8_t *data, size_t len);
150150
void print_hex_data_json(uint8_t *data, size_t len);
151151

152152
unsigned int get_page_size(void);
153153
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);
155157

156158
struct btf_dumper {
157159
const struct btf *btf;

tools/bpf/bpftool/prog.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ static int do_dump(int argc, char **argv)
449449
unsigned long *func_ksyms = NULL;
450450
struct bpf_prog_info info = {};
451451
unsigned int *func_lens = NULL;
452+
const char *disasm_opt = NULL;
452453
unsigned int nr_func_ksyms;
453454
unsigned int nr_func_lens;
454455
struct dump_data dd = {};
@@ -607,9 +608,10 @@ static int do_dump(int argc, char **argv)
607608
const char *name = NULL;
608609

609610
if (info.ifindex) {
610-
name = ifindex_to_bfd_name_ns(info.ifindex,
611-
info.netns_dev,
612-
info.netns_ino);
611+
name = ifindex_to_bfd_params(info.ifindex,
612+
info.netns_dev,
613+
info.netns_ino,
614+
&disasm_opt);
613615
if (!name)
614616
goto err_free;
615617
}
@@ -651,7 +653,8 @@ static int do_dump(int argc, char **argv)
651653
printf("%s:\n", sym_name);
652654
}
653655

654-
disasm_print_insn(img, lens[i], opcodes, name);
656+
disasm_print_insn(img, lens[i], opcodes, name,
657+
disasm_opt);
655658
img += lens[i];
656659

657660
if (json_output)
@@ -663,7 +666,8 @@ static int do_dump(int argc, char **argv)
663666
if (json_output)
664667
jsonw_end_array(json_wtr);
665668
} else {
666-
disasm_print_insn(buf, *member_len, opcodes, name);
669+
disasm_print_insn(buf, *member_len, opcodes, name,
670+
disasm_opt);
667671
}
668672
} else if (visual) {
669673
if (json_output)

0 commit comments

Comments
 (0)