When dumping prog info in JSON format add two new fields: "orig_insn" and "jit". The former field maps the xlated instruction to the original instruction (which was loaded via the bpf(2) syscall). The latter maps the xlated instruction to the jitted instruction; as jited instructions lengths may vary both the offset and length are specified. Signed-off-by: Anton Protopopov <aspsk@xxxxxxxxxxxxx> --- tools/bpf/bpftool/prog.c | 14 ++++++++++++++ tools/bpf/bpftool/xlated_dumper.c | 18 ++++++++++++++++++ tools/bpf/bpftool/xlated_dumper.h | 2 ++ 3 files changed, 34 insertions(+) diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 9cb42a3366c0..d3fd7d699574 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -119,6 +119,12 @@ static int prep_prog_info(struct bpf_prog_info *const info, enum dump_mode mode, holder.jited_line_info_rec_size = info->jited_line_info_rec_size; needed += info->nr_jited_line_info * info->jited_line_info_rec_size; + holder.orig_idx_len = info->orig_idx_len; + needed += info->orig_idx_len; + + holder.xlated_to_jit_len = info->xlated_to_jit_len; + needed += info->xlated_to_jit_len; + if (needed > *info_data_sz) { ptr = realloc(*info_data, needed); if (!ptr) @@ -152,6 +158,12 @@ static int prep_prog_info(struct bpf_prog_info *const info, enum dump_mode mode, holder.jited_line_info = ptr_to_u64(ptr); ptr += holder.nr_jited_line_info * holder.jited_line_info_rec_size; + holder.orig_idx = ptr_to_u64(ptr); + ptr += holder.orig_idx_len; + + holder.xlated_to_jit = ptr_to_u64(ptr); + ptr += holder.xlated_to_jit_len; + *info = holder; return 0; } @@ -852,6 +864,8 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode, dd.func_info = func_info; dd.finfo_rec_size = info->func_info_rec_size; dd.prog_linfo = prog_linfo; + dd.orig_idx = u64_to_ptr(info->orig_idx); + dd.xlated_to_jit = u64_to_ptr(info->xlated_to_jit); if (json_output) dump_xlated_json(&dd, buf, member_len, opcodes, linum); diff --git a/tools/bpf/bpftool/xlated_dumper.c b/tools/bpf/bpftool/xlated_dumper.c index 567f56dfd9f1..fcc1c4a96178 100644 --- a/tools/bpf/bpftool/xlated_dumper.c +++ b/tools/bpf/bpftool/xlated_dumper.c @@ -270,6 +270,24 @@ void dump_xlated_json(struct dump_data *dd, void *buf, unsigned int len, jsonw_name(json_wtr, "disasm"); print_bpf_insn(&cbs, insn + i, true); + if (dd->orig_idx) { + jsonw_name(json_wtr, "orig_insn"); + jsonw_printf(json_wtr, "\"0x%x\"", dd->orig_idx[i]); + } + + if (dd->xlated_to_jit) { + jsonw_name(json_wtr, "jit"); + jsonw_start_object(json_wtr); + + jsonw_name(json_wtr, "off"); + jsonw_printf(json_wtr, "\"0x%x\"", dd->xlated_to_jit[i].off); + + jsonw_name(json_wtr, "len"); + jsonw_printf(json_wtr, "\"%d\"", dd->xlated_to_jit[i].len); + + jsonw_end_object(json_wtr); + } + if (opcodes) { jsonw_name(json_wtr, "opcodes"); jsonw_start_object(json_wtr); diff --git a/tools/bpf/bpftool/xlated_dumper.h b/tools/bpf/bpftool/xlated_dumper.h index db3ba0671501..078430fada17 100644 --- a/tools/bpf/bpftool/xlated_dumper.h +++ b/tools/bpf/bpftool/xlated_dumper.h @@ -26,6 +26,8 @@ struct dump_data { __u32 finfo_rec_size; const struct bpf_prog_linfo *prog_linfo; char scratch_buff[SYM_MAX_NAME + 8]; + unsigned int *orig_idx; + struct bpf_xlated_to_jit *xlated_to_jit; }; void kernel_syms_load(struct dump_data *dd); -- 2.34.1