@@ -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);
@@ -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);
@@ -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);
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@isovalent.com> --- 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(+)