Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ddeac67 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Daniel Borkmann
Browse files

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: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarJiong Wang <jiong.wang@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 1bd70d2e
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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",
+3 −1
Original line number Diff line number Diff line
@@ -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;

+4 −2
Original line number Diff line number Diff line
@@ -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;
+9 −5
Original line number Diff line number Diff line
@@ -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,
			name = ifindex_to_bfd_params(info.ifindex,
						     info.netns_dev,
						      info.netns_ino);
						     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)