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>
This commit is contained in:
Родитель
1bd70d2eba
Коммит
3ddeac6705
|
@ -554,7 +554,9 @@ static int read_sysfs_netdev_hex_int(char *devname, const char *entry_name)
|
||||||
return read_sysfs_hex_int(full_path);
|
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];
|
char devname[IF_NAMESIZE];
|
||||||
int vendor_id;
|
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 != 0x6000 &&
|
||||||
device_id != 0x6003)
|
device_id != 0x6003)
|
||||||
p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch");
|
p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch");
|
||||||
|
*opt = "ctx4";
|
||||||
return "NFP-6xxx";
|
return "NFP-6xxx";
|
||||||
default:
|
default:
|
||||||
p_err("Can't get bfd arch name for device vendor id 0x%04x",
|
p_err("Can't get bfd arch name for device vendor id 0x%04x",
|
||||||
|
|
|
@ -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,
|
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;
|
disassembler_ftype disassemble;
|
||||||
struct disassemble_info info;
|
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.arch = bfd_get_arch(bfdf);
|
||||||
info.mach = bfd_get_mach(bfdf);
|
info.mach = bfd_get_mach(bfdf);
|
||||||
|
if (disassembler_options)
|
||||||
|
info.disassembler_options = disassembler_options;
|
||||||
info.buffer = image;
|
info.buffer = image;
|
||||||
info.buffer_length = len;
|
info.buffer_length = len;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
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,
|
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_data_json(uint8_t *data, size_t len);
|
||||||
void print_hex_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_page_size(void);
|
||||||
unsigned int get_possible_cpus(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 {
|
struct btf_dumper {
|
||||||
const struct btf *btf;
|
const struct btf *btf;
|
||||||
|
|
|
@ -449,6 +449,7 @@ static int do_dump(int argc, char **argv)
|
||||||
unsigned long *func_ksyms = NULL;
|
unsigned long *func_ksyms = NULL;
|
||||||
struct bpf_prog_info info = {};
|
struct bpf_prog_info info = {};
|
||||||
unsigned int *func_lens = NULL;
|
unsigned int *func_lens = NULL;
|
||||||
|
const char *disasm_opt = NULL;
|
||||||
unsigned int nr_func_ksyms;
|
unsigned int nr_func_ksyms;
|
||||||
unsigned int nr_func_lens;
|
unsigned int nr_func_lens;
|
||||||
struct dump_data dd = {};
|
struct dump_data dd = {};
|
||||||
|
@ -607,9 +608,10 @@ static int do_dump(int argc, char **argv)
|
||||||
const char *name = NULL;
|
const char *name = NULL;
|
||||||
|
|
||||||
if (info.ifindex) {
|
if (info.ifindex) {
|
||||||
name = ifindex_to_bfd_name_ns(info.ifindex,
|
name = ifindex_to_bfd_params(info.ifindex,
|
||||||
info.netns_dev,
|
info.netns_dev,
|
||||||
info.netns_ino);
|
info.netns_ino,
|
||||||
|
&disasm_opt);
|
||||||
if (!name)
|
if (!name)
|
||||||
goto err_free;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
@ -651,7 +653,8 @@ static int do_dump(int argc, char **argv)
|
||||||
printf("%s:\n", sym_name);
|
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];
|
img += lens[i];
|
||||||
|
|
||||||
if (json_output)
|
if (json_output)
|
||||||
|
@ -663,7 +666,8 @@ static int do_dump(int argc, char **argv)
|
||||||
if (json_output)
|
if (json_output)
|
||||||
jsonw_end_array(json_wtr);
|
jsonw_end_array(json_wtr);
|
||||||
} else {
|
} else {
|
||||||
disasm_print_insn(buf, *member_len, opcodes, name);
|
disasm_print_insn(buf, *member_len, opcodes, name,
|
||||||
|
disasm_opt);
|
||||||
}
|
}
|
||||||
} else if (visual) {
|
} else if (visual) {
|
||||||
if (json_output)
|
if (json_output)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче