aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/machine.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 28a9541c4835..dc7aafe45a2b 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
924 * symbol_name if it's not that important. 924 * symbol_name if it's not that important.
925 */ 925 */
926static int machine__get_running_kernel_start(struct machine *machine, 926static int machine__get_running_kernel_start(struct machine *machine,
927 const char **symbol_name, u64 *start) 927 const char **symbol_name,
928 u64 *start, u64 *end)
928{ 929{
929 char filename[PATH_MAX]; 930 char filename[PATH_MAX];
930 int i, err = -1; 931 int i, err = -1;
@@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine,
949 *symbol_name = name; 950 *symbol_name = name;
950 951
951 *start = addr; 952 *start = addr;
953
954 err = kallsyms__get_function_start(filename, "_etext", &addr);
955 if (!err)
956 *end = addr;
957
952 return 0; 958 return 0;
953} 959}
954 960
@@ -1441,7 +1447,7 @@ int machine__create_kernel_maps(struct machine *machine)
1441 struct dso *kernel = machine__get_kernel(machine); 1447 struct dso *kernel = machine__get_kernel(machine);
1442 const char *name = NULL; 1448 const char *name = NULL;
1443 struct map *map; 1449 struct map *map;
1444 u64 addr = 0; 1450 u64 start = 0, end = ~0ULL;
1445 int ret; 1451 int ret;
1446 1452
1447 if (kernel == NULL) 1453 if (kernel == NULL)
@@ -1460,9 +1466,9 @@ int machine__create_kernel_maps(struct machine *machine)
1460 "continuing anyway...\n", machine->pid); 1466 "continuing anyway...\n", machine->pid);
1461 } 1467 }
1462 1468
1463 if (!machine__get_running_kernel_start(machine, &name, &addr)) { 1469 if (!machine__get_running_kernel_start(machine, &name, &start, &end)) {
1464 if (name && 1470 if (name &&
1465 map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, addr)) { 1471 map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, start)) {
1466 machine__destroy_kernel_maps(machine); 1472 machine__destroy_kernel_maps(machine);
1467 ret = -1; 1473 ret = -1;
1468 goto out_put; 1474 goto out_put;
@@ -1472,16 +1478,19 @@ int machine__create_kernel_maps(struct machine *machine)
1472 * we have a real start address now, so re-order the kmaps 1478 * we have a real start address now, so re-order the kmaps
1473 * assume it's the last in the kmaps 1479 * assume it's the last in the kmaps
1474 */ 1480 */
1475 machine__update_kernel_mmap(machine, addr, ~0ULL); 1481 machine__update_kernel_mmap(machine, start, end);
1476 } 1482 }
1477 1483
1478 if (machine__create_extra_kernel_maps(machine, kernel)) 1484 if (machine__create_extra_kernel_maps(machine, kernel))
1479 pr_debug("Problems creating extra kernel maps, continuing anyway...\n"); 1485 pr_debug("Problems creating extra kernel maps, continuing anyway...\n");
1480 1486
1481 /* update end address of the kernel map using adjacent module address */ 1487 if (end == ~0ULL) {
1482 map = map__next(machine__kernel_map(machine)); 1488 /* update end address of the kernel map using adjacent module address */
1483 if (map) 1489 map = map__next(machine__kernel_map(machine));
1484 machine__set_kernel_mmap(machine, addr, map->start); 1490 if (map)
1491 machine__set_kernel_mmap(machine, start, map->start);
1492 }
1493
1485out_put: 1494out_put:
1486 dso__put(kernel); 1495 dso__put(kernel);
1487 return ret; 1496 return ret;