aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/machine.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/machine.c')
-rw-r--r--tools/perf/util/machine.c70
1 files changed, 44 insertions, 26 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 84cdb072ac83..620a1983b76b 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -9,6 +9,7 @@
9#include "strlist.h" 9#include "strlist.h"
10#include "thread.h" 10#include "thread.h"
11#include <stdbool.h> 11#include <stdbool.h>
12#include <symbol/kallsyms.h>
12#include "unwind.h" 13#include "unwind.h"
13 14
14int machine__init(struct machine *machine, const char *root_dir, pid_t pid) 15int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
@@ -26,6 +27,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
26 machine->pid = pid; 27 machine->pid = pid;
27 28
28 machine->symbol_filter = NULL; 29 machine->symbol_filter = NULL;
30 machine->id_hdr_size = 0;
29 31
30 machine->root_dir = strdup(root_dir); 32 machine->root_dir = strdup(root_dir);
31 if (machine->root_dir == NULL) 33 if (machine->root_dir == NULL)
@@ -101,8 +103,7 @@ void machine__exit(struct machine *machine)
101 map_groups__exit(&machine->kmaps); 103 map_groups__exit(&machine->kmaps);
102 dsos__delete(&machine->user_dsos); 104 dsos__delete(&machine->user_dsos);
103 dsos__delete(&machine->kernel_dsos); 105 dsos__delete(&machine->kernel_dsos);
104 free(machine->root_dir); 106 zfree(&machine->root_dir);
105 machine->root_dir = NULL;
106} 107}
107 108
108void machine__delete(struct machine *machine) 109void machine__delete(struct machine *machine)
@@ -495,23 +496,22 @@ static int symbol__in_kernel(void *arg, const char *name,
495 return 1; 496 return 1;
496} 497}
497 498
499static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
500 size_t bufsz)
501{
502 if (machine__is_default_guest(machine))
503 scnprintf(buf, bufsz, "%s", symbol_conf.default_guest_kallsyms);
504 else
505 scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir);
506}
507
498/* Figure out the start address of kernel map from /proc/kallsyms */ 508/* Figure out the start address of kernel map from /proc/kallsyms */
499static u64 machine__get_kernel_start_addr(struct machine *machine) 509static u64 machine__get_kernel_start_addr(struct machine *machine)
500{ 510{
501 const char *filename; 511 char filename[PATH_MAX];
502 char path[PATH_MAX];
503 struct process_args args; 512 struct process_args args;
504 513
505 if (machine__is_host(machine)) { 514 machine__get_kallsyms_filename(machine, filename, PATH_MAX);
506 filename = "/proc/kallsyms";
507 } else {
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 515
516 if (symbol__restricted_filename(filename, "/proc/kallsyms")) 516 if (symbol__restricted_filename(filename, "/proc/kallsyms"))
517 return 0; 517 return 0;
@@ -565,11 +565,10 @@ void machine__destroy_kernel_maps(struct machine *machine)
565 * on one of them. 565 * on one of them.
566 */ 566 */
567 if (type == MAP__FUNCTION) { 567 if (type == MAP__FUNCTION) {
568 free((char *)kmap->ref_reloc_sym->name); 568 zfree((char **)&kmap->ref_reloc_sym->name);
569 kmap->ref_reloc_sym->name = NULL; 569 zfree(&kmap->ref_reloc_sym);
570 free(kmap->ref_reloc_sym); 570 } else
571 } 571 kmap->ref_reloc_sym = NULL;
572 kmap->ref_reloc_sym = NULL;
573 } 572 }
574 573
575 map__delete(machine->vmlinux_maps[type]); 574 map__delete(machine->vmlinux_maps[type]);
@@ -767,8 +766,7 @@ static int map_groups__set_modules_path_dir(struct map_groups *mg,
767 ret = -1; 766 ret = -1;
768 goto out; 767 goto out;
769 } 768 }
770 dso__set_long_name(map->dso, long_name); 769 dso__set_long_name(map->dso, long_name, true);
771 map->dso->lname_alloc = 1;
772 dso__kernel_module_get_build_id(map->dso, ""); 770 dso__kernel_module_get_build_id(map->dso, "");
773 } 771 }
774 } 772 }
@@ -834,9 +832,25 @@ static int machine__create_modules(struct machine *machine)
834 return 0; 832 return 0;
835} 833}
836 834
835const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
836
837int machine__create_kernel_maps(struct machine *machine) 837int machine__create_kernel_maps(struct machine *machine)
838{ 838{
839 struct dso *kernel = machine__get_kernel(machine); 839 struct dso *kernel = machine__get_kernel(machine);
840 char filename[PATH_MAX];
841 const char *name;
842 u64 addr = 0;
843 int i;
844
845 machine__get_kallsyms_filename(machine, filename, PATH_MAX);
846
847 for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
848 addr = kallsyms__get_function_start(filename, name);
849 if (addr)
850 break;
851 }
852 if (!addr)
853 return -1;
840 854
841 if (kernel == NULL || 855 if (kernel == NULL ||
842 __machine__create_kernel_maps(machine, kernel) < 0) 856 __machine__create_kernel_maps(machine, kernel) < 0)
@@ -855,6 +869,13 @@ int machine__create_kernel_maps(struct machine *machine)
855 * Now that we have all the maps created, just set the ->end of them: 869 * Now that we have all the maps created, just set the ->end of them:
856 */ 870 */
857 map_groups__fixup_end(&machine->kmaps); 871 map_groups__fixup_end(&machine->kmaps);
872
873 if (maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name,
874 addr)) {
875 machine__destroy_kernel_maps(machine);
876 return -1;
877 }
878
858 return 0; 879 return 0;
859} 880}
860 881
@@ -939,8 +960,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
939 if (name == NULL) 960 if (name == NULL)
940 goto out_problem; 961 goto out_problem;
941 962
942 map->dso->short_name = name; 963 dso__set_short_name(map->dso, name, true);
943 map->dso->sname_alloc = 1;
944 map->end = map->start + event->mmap.len; 964 map->end = map->start + event->mmap.len;
945 } else if (is_kernel_mmap) { 965 } else if (is_kernel_mmap) {
946 const char *symbol_name = (event->mmap.filename + 966 const char *symbol_name = (event->mmap.filename +
@@ -1193,7 +1213,7 @@ static void ip__resolve_ams(struct machine *machine, struct thread *thread,
1193 */ 1213 */
1194 thread__find_addr_location(thread, machine, m, MAP__FUNCTION, 1214 thread__find_addr_location(thread, machine, m, MAP__FUNCTION,
1195 ip, &al); 1215 ip, &al);
1196 if (al.sym) 1216 if (al.map)
1197 goto found; 1217 goto found;
1198 } 1218 }
1199found: 1219found:
@@ -1320,8 +1340,6 @@ static int machine__resolve_callchain_sample(struct machine *machine,
1320 *root_al = al; 1340 *root_al = al;
1321 callchain_cursor_reset(&callchain_cursor); 1341 callchain_cursor_reset(&callchain_cursor);
1322 } 1342 }
1323 if (!symbol_conf.use_callchain)
1324 break;
1325 } 1343 }
1326 1344
1327 err = callchain_cursor_append(&callchain_cursor, 1345 err = callchain_cursor_append(&callchain_cursor,