diff options
Diffstat (limited to 'tools/perf/util/event.c')
-rw-r--r-- | tools/perf/util/event.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1fc1c2f04772..b0f3ca850e9e 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -470,23 +470,32 @@ static int find_symbol_cb(void *arg, const char *name, char type, | |||
470 | return 1; | 470 | return 1; |
471 | } | 471 | } |
472 | 472 | ||
473 | u64 kallsyms__get_function_start(const char *kallsyms_filename, | ||
474 | const char *symbol_name) | ||
475 | { | ||
476 | struct process_symbol_args args = { .name = symbol_name, }; | ||
477 | |||
478 | if (kallsyms__parse(kallsyms_filename, &args, find_symbol_cb) <= 0) | ||
479 | return 0; | ||
480 | |||
481 | return args.start; | ||
482 | } | ||
483 | |||
473 | int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | 484 | int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, |
474 | perf_event__handler_t process, | 485 | perf_event__handler_t process, |
475 | struct machine *machine, | 486 | struct machine *machine) |
476 | const char *symbol_name) | ||
477 | { | 487 | { |
478 | size_t size; | 488 | size_t size; |
479 | const char *filename, *mmap_name; | 489 | const char *mmap_name; |
480 | char path[PATH_MAX]; | ||
481 | char name_buff[PATH_MAX]; | 490 | char name_buff[PATH_MAX]; |
482 | struct map *map; | 491 | struct map *map; |
492 | struct kmap *kmap; | ||
483 | int err; | 493 | int err; |
484 | /* | 494 | /* |
485 | * We should get this from /sys/kernel/sections/.text, but till that is | 495 | * We should get this from /sys/kernel/sections/.text, but till that is |
486 | * available use this, and after it is use this as a fallback for older | 496 | * available use this, and after it is use this as a fallback for older |
487 | * kernels. | 497 | * kernels. |
488 | */ | 498 | */ |
489 | struct process_symbol_args args = { .name = symbol_name, }; | ||
490 | union perf_event *event = zalloc((sizeof(event->mmap) + | 499 | union perf_event *event = zalloc((sizeof(event->mmap) + |
491 | machine->id_hdr_size)); | 500 | machine->id_hdr_size)); |
492 | if (event == NULL) { | 501 | if (event == NULL) { |
@@ -502,30 +511,19 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | |||
502 | * see kernel/perf_event.c __perf_event_mmap | 511 | * see kernel/perf_event.c __perf_event_mmap |
503 | */ | 512 | */ |
504 | event->header.misc = PERF_RECORD_MISC_KERNEL; | 513 | event->header.misc = PERF_RECORD_MISC_KERNEL; |
505 | filename = "/proc/kallsyms"; | ||
506 | } else { | 514 | } else { |
507 | event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL; | 515 | event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL; |
508 | if (machine__is_default_guest(machine)) | ||
509 | filename = (char *) symbol_conf.default_guest_kallsyms; | ||
510 | else { | ||
511 | sprintf(path, "%s/proc/kallsyms", machine->root_dir); | ||
512 | filename = path; | ||
513 | } | ||
514 | } | ||
515 | |||
516 | if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) { | ||
517 | free(event); | ||
518 | return -ENOENT; | ||
519 | } | 516 | } |
520 | 517 | ||
521 | map = machine->vmlinux_maps[MAP__FUNCTION]; | 518 | map = machine->vmlinux_maps[MAP__FUNCTION]; |
519 | kmap = map__kmap(map); | ||
522 | size = snprintf(event->mmap.filename, sizeof(event->mmap.filename), | 520 | size = snprintf(event->mmap.filename, sizeof(event->mmap.filename), |
523 | "%s%s", mmap_name, symbol_name) + 1; | 521 | "%s%s", mmap_name, kmap->ref_reloc_sym->name) + 1; |
524 | size = PERF_ALIGN(size, sizeof(u64)); | 522 | size = PERF_ALIGN(size, sizeof(u64)); |
525 | event->mmap.header.type = PERF_RECORD_MMAP; | 523 | event->mmap.header.type = PERF_RECORD_MMAP; |
526 | event->mmap.header.size = (sizeof(event->mmap) - | 524 | event->mmap.header.size = (sizeof(event->mmap) - |
527 | (sizeof(event->mmap.filename) - size) + machine->id_hdr_size); | 525 | (sizeof(event->mmap.filename) - size) + machine->id_hdr_size); |
528 | event->mmap.pgoff = args.start; | 526 | event->mmap.pgoff = kmap->ref_reloc_sym->addr; |
529 | event->mmap.start = map->start; | 527 | event->mmap.start = map->start; |
530 | event->mmap.len = map->end - event->mmap.start; | 528 | event->mmap.len = map->end - event->mmap.start; |
531 | event->mmap.pid = machine->pid; | 529 | event->mmap.pid = machine->pid; |