diff options
| -rw-r--r-- | tools/perf/util/machine.c | 27 |
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 | */ |
| 926 | static int machine__get_running_kernel_start(struct machine *machine, | 926 | static 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 | |||
| 1485 | out_put: | 1494 | out_put: |
| 1486 | dso__put(kernel); | 1495 | dso__put(kernel); |
| 1487 | return ret; | 1496 | return ret; |
