diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index cf91d099f0aa..aa8a03120bbd 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -53,6 +53,11 @@ out_close: | |||
53 | return -1; | 53 | return -1; |
54 | } | 54 | } |
55 | 55 | ||
56 | static inline int perf_session__create_kernel_maps(struct perf_session *self) | ||
57 | { | ||
58 | return map_groups__create_kernel_maps(&self->kmaps, self->vmlinux_maps); | ||
59 | } | ||
60 | |||
56 | struct perf_session *perf_session__new(const char *filename, int mode, bool force) | 61 | struct perf_session *perf_session__new(const char *filename, int mode, bool force) |
57 | { | 62 | { |
58 | size_t len = filename ? strlen(filename) + 1 : 0; | 63 | size_t len = filename ? strlen(filename) + 1 : 0; |
@@ -507,6 +512,7 @@ int perf_session__set_kallsyms_ref_reloc_sym(struct perf_session *self, | |||
507 | u64 addr) | 512 | u64 addr) |
508 | { | 513 | { |
509 | char *bracket; | 514 | char *bracket; |
515 | enum map_type i; | ||
510 | 516 | ||
511 | self->ref_reloc_sym.name = strdup(symbol_name); | 517 | self->ref_reloc_sym.name = strdup(symbol_name); |
512 | if (self->ref_reloc_sym.name == NULL) | 518 | if (self->ref_reloc_sym.name == NULL) |
@@ -517,6 +523,12 @@ int perf_session__set_kallsyms_ref_reloc_sym(struct perf_session *self, | |||
517 | *bracket = '\0'; | 523 | *bracket = '\0'; |
518 | 524 | ||
519 | self->ref_reloc_sym.addr = addr; | 525 | self->ref_reloc_sym.addr = addr; |
526 | |||
527 | for (i = 0; i < MAP__NR_TYPES; ++i) { | ||
528 | struct kmap *kmap = map__kmap(self->vmlinux_maps[i]); | ||
529 | kmap->ref_reloc_sym = &self->ref_reloc_sym; | ||
530 | } | ||
531 | |||
520 | return 0; | 532 | return 0; |
521 | } | 533 | } |
522 | 534 | ||
@@ -530,20 +542,21 @@ static u64 map__reloc_unmap_ip(struct map *map, u64 ip) | |||
530 | return ip - (s64)map->pgoff; | 542 | return ip - (s64)map->pgoff; |
531 | } | 543 | } |
532 | 544 | ||
533 | void perf_session__reloc_vmlinux_maps(struct perf_session *self, | 545 | void map__reloc_vmlinux(struct map *self) |
534 | u64 unrelocated_addr) | ||
535 | { | 546 | { |
536 | enum map_type type; | 547 | struct kmap *kmap = map__kmap(self); |
537 | s64 reloc = unrelocated_addr - self->ref_reloc_sym.addr; | 548 | s64 reloc; |
538 | 549 | ||
539 | if (!reloc) | 550 | if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->unrelocated_addr) |
540 | return; | 551 | return; |
541 | 552 | ||
542 | for (type = 0; type < MAP__NR_TYPES; ++type) { | 553 | reloc = (kmap->ref_reloc_sym->unrelocated_addr - |
543 | struct map *map = self->vmlinux_maps[type]; | 554 | kmap->ref_reloc_sym->addr); |
544 | 555 | ||
545 | map->map_ip = map__reloc_map_ip; | 556 | if (!reloc) |
546 | map->unmap_ip = map__reloc_unmap_ip; | 557 | return; |
547 | map->pgoff = reloc; | 558 | |
548 | } | 559 | self->map_ip = map__reloc_map_ip; |
560 | self->unmap_ip = map__reloc_unmap_ip; | ||
561 | self->pgoff = reloc; | ||
549 | } | 562 | } |