aboutsummaryrefslogtreecommitdiffstats
path: root/tools/bpf/bpftool/prog.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r--tools/bpf/bpftool/prog.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index 9bdfdf2d3fbe..e05ab58d39e2 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -420,7 +420,9 @@ static int do_show(int argc, char **argv)
420 420
421static int do_dump(int argc, char **argv) 421static int do_dump(int argc, char **argv)
422{ 422{
423 unsigned long *func_ksyms = NULL;
423 struct bpf_prog_info info = {}; 424 struct bpf_prog_info info = {};
425 unsigned int nr_func_ksyms;
424 struct dump_data dd = {}; 426 struct dump_data dd = {};
425 __u32 len = sizeof(info); 427 __u32 len = sizeof(info);
426 unsigned int buf_size; 428 unsigned int buf_size;
@@ -496,10 +498,22 @@ static int do_dump(int argc, char **argv)
496 return -1; 498 return -1;
497 } 499 }
498 500
501 nr_func_ksyms = info.nr_jited_ksyms;
502 if (nr_func_ksyms) {
503 func_ksyms = malloc(nr_func_ksyms * sizeof(__u64));
504 if (!func_ksyms) {
505 p_err("mem alloc failed");
506 close(fd);
507 goto err_free;
508 }
509 }
510
499 memset(&info, 0, sizeof(info)); 511 memset(&info, 0, sizeof(info));
500 512
501 *member_ptr = ptr_to_u64(buf); 513 *member_ptr = ptr_to_u64(buf);
502 *member_len = buf_size; 514 *member_len = buf_size;
515 info.jited_ksyms = ptr_to_u64(func_ksyms);
516 info.nr_jited_ksyms = nr_func_ksyms;
503 517
504 err = bpf_obj_get_info_by_fd(fd, &info, &len); 518 err = bpf_obj_get_info_by_fd(fd, &info, &len);
505 close(fd); 519 close(fd);
@@ -513,6 +527,11 @@ static int do_dump(int argc, char **argv)
513 goto err_free; 527 goto err_free;
514 } 528 }
515 529
530 if (info.nr_jited_ksyms > nr_func_ksyms) {
531 p_err("too many addresses returned");
532 goto err_free;
533 }
534
516 if ((member_len == &info.jited_prog_len && 535 if ((member_len == &info.jited_prog_len &&
517 info.jited_prog_insns == 0) || 536 info.jited_prog_insns == 0) ||
518 (member_len == &info.xlated_prog_len && 537 (member_len == &info.xlated_prog_len &&
@@ -558,6 +577,9 @@ static int do_dump(int argc, char **argv)
558 dump_xlated_cfg(buf, *member_len); 577 dump_xlated_cfg(buf, *member_len);
559 } else { 578 } else {
560 kernel_syms_load(&dd); 579 kernel_syms_load(&dd);
580 dd.nr_jited_ksyms = info.nr_jited_ksyms;
581 dd.jited_ksyms = (__u64 *) info.jited_ksyms;
582
561 if (json_output) 583 if (json_output)
562 dump_xlated_json(&dd, buf, *member_len, opcodes); 584 dump_xlated_json(&dd, buf, *member_len, opcodes);
563 else 585 else
@@ -566,10 +588,12 @@ static int do_dump(int argc, char **argv)
566 } 588 }
567 589
568 free(buf); 590 free(buf);
591 free(func_ksyms);
569 return 0; 592 return 0;
570 593
571err_free: 594err_free:
572 free(buf); 595 free(buf);
596 free(func_ksyms);
573 return -1; 597 return -1;
574} 598}
575 599