diff options
Diffstat (limited to 'tools/perf/util/machine.c')
-rw-r--r-- | tools/perf/util/machine.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 0e5fea95d596..c73e1fc12e53 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
@@ -496,18 +496,6 @@ struct process_args { | |||
496 | u64 start; | 496 | u64 start; |
497 | }; | 497 | }; |
498 | 498 | ||
499 | static int symbol__in_kernel(void *arg, const char *name, | ||
500 | char type __maybe_unused, u64 start) | ||
501 | { | ||
502 | struct process_args *args = arg; | ||
503 | |||
504 | if (strchr(name, '[')) | ||
505 | return 0; | ||
506 | |||
507 | args->start = start; | ||
508 | return 1; | ||
509 | } | ||
510 | |||
511 | static void machine__get_kallsyms_filename(struct machine *machine, char *buf, | 499 | static void machine__get_kallsyms_filename(struct machine *machine, char *buf, |
512 | size_t bufsz) | 500 | size_t bufsz) |
513 | { | 501 | { |
@@ -517,27 +505,41 @@ static void machine__get_kallsyms_filename(struct machine *machine, char *buf, | |||
517 | scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir); | 505 | scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir); |
518 | } | 506 | } |
519 | 507 | ||
520 | /* Figure out the start address of kernel map from /proc/kallsyms */ | 508 | const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL}; |
521 | static u64 machine__get_kernel_start_addr(struct machine *machine) | 509 | |
510 | /* Figure out the start address of kernel map from /proc/kallsyms. | ||
511 | * Returns the name of the start symbol in *symbol_name. Pass in NULL as | ||
512 | * symbol_name if it's not that important. | ||
513 | */ | ||
514 | static u64 machine__get_kernel_start_addr(struct machine *machine, | ||
515 | const char **symbol_name) | ||
522 | { | 516 | { |
523 | char filename[PATH_MAX]; | 517 | char filename[PATH_MAX]; |
524 | struct process_args args; | 518 | int i; |
519 | const char *name; | ||
520 | u64 addr = 0; | ||
525 | 521 | ||
526 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); | 522 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); |
527 | 523 | ||
528 | if (symbol__restricted_filename(filename, "/proc/kallsyms")) | 524 | if (symbol__restricted_filename(filename, "/proc/kallsyms")) |
529 | return 0; | 525 | return 0; |
530 | 526 | ||
531 | if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0) | 527 | for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) { |
532 | return 0; | 528 | addr = kallsyms__get_function_start(filename, name); |
529 | if (addr) | ||
530 | break; | ||
531 | } | ||
532 | |||
533 | if (symbol_name) | ||
534 | *symbol_name = name; | ||
533 | 535 | ||
534 | return args.start; | 536 | return addr; |
535 | } | 537 | } |
536 | 538 | ||
537 | int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) | 539 | int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) |
538 | { | 540 | { |
539 | enum map_type type; | 541 | enum map_type type; |
540 | u64 start = machine__get_kernel_start_addr(machine); | 542 | u64 start = machine__get_kernel_start_addr(machine, NULL); |
541 | 543 | ||
542 | for (type = 0; type < MAP__NR_TYPES; ++type) { | 544 | for (type = 0; type < MAP__NR_TYPES; ++type) { |
543 | struct kmap *kmap; | 545 | struct kmap *kmap; |
@@ -852,23 +854,11 @@ static int machine__create_modules(struct machine *machine) | |||
852 | return 0; | 854 | return 0; |
853 | } | 855 | } |
854 | 856 | ||
855 | const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL}; | ||
856 | |||
857 | int machine__create_kernel_maps(struct machine *machine) | 857 | int machine__create_kernel_maps(struct machine *machine) |
858 | { | 858 | { |
859 | struct dso *kernel = machine__get_kernel(machine); | 859 | struct dso *kernel = machine__get_kernel(machine); |
860 | char filename[PATH_MAX]; | ||
861 | const char *name; | 860 | const char *name; |
862 | u64 addr = 0; | 861 | u64 addr = machine__get_kernel_start_addr(machine, &name); |
863 | int i; | ||
864 | |||
865 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); | ||
866 | |||
867 | for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) { | ||
868 | addr = kallsyms__get_function_start(filename, name); | ||
869 | if (addr) | ||
870 | break; | ||
871 | } | ||
872 | if (!addr) | 862 | if (!addr) |
873 | return -1; | 863 | return -1; |
874 | 864 | ||