diff options
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r-- | tools/bpf/bpftool/prog.c | 24 |
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 | ||
421 | static int do_dump(int argc, char **argv) | 421 | static 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 | ||
571 | err_free: | 594 | err_free: |
572 | free(buf); | 595 | free(buf); |
596 | free(func_ksyms); | ||
573 | return -1; | 597 | return -1; |
574 | } | 598 | } |
575 | 599 | ||