diff options
Diffstat (limited to 'tools/perf/util/symbol.c')
-rw-r--r-- | tools/perf/util/symbol.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index eb06746b06b2..078331140d8c 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include "machine.h" | 15 | #include "machine.h" |
16 | #include "symbol.h" | 16 | #include "symbol.h" |
17 | #include "strlist.h" | 17 | #include "strlist.h" |
18 | #include "header.h" | ||
18 | 19 | ||
19 | #include <elf.h> | 20 | #include <elf.h> |
20 | #include <limits.h> | 21 | #include <limits.h> |
@@ -33,6 +34,7 @@ struct symbol_conf symbol_conf = { | |||
33 | .try_vmlinux_path = true, | 34 | .try_vmlinux_path = true, |
34 | .annotate_src = true, | 35 | .annotate_src = true, |
35 | .demangle = true, | 36 | .demangle = true, |
37 | .demangle_kernel = false, | ||
36 | .cumulate_callchain = true, | 38 | .cumulate_callchain = true, |
37 | .show_hist_headers = true, | 39 | .show_hist_headers = true, |
38 | .symfs = "", | 40 | .symfs = "", |
@@ -184,7 +186,7 @@ void symbols__fixup_end(struct rb_root *symbols) | |||
184 | curr = rb_entry(nd, struct symbol, rb_node); | 186 | curr = rb_entry(nd, struct symbol, rb_node); |
185 | 187 | ||
186 | if (prev->end == prev->start && prev->end != curr->start) | 188 | if (prev->end == prev->start && prev->end != curr->start) |
187 | prev->end = curr->start - 1; | 189 | prev->end = curr->start; |
188 | } | 190 | } |
189 | 191 | ||
190 | /* Last entry */ | 192 | /* Last entry */ |
@@ -205,7 +207,7 @@ void __map_groups__fixup_end(struct map_groups *mg, enum map_type type) | |||
205 | for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) { | 207 | for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) { |
206 | prev = curr; | 208 | prev = curr; |
207 | curr = rb_entry(nd, struct map, rb_node); | 209 | curr = rb_entry(nd, struct map, rb_node); |
208 | prev->end = curr->start - 1; | 210 | prev->end = curr->start; |
209 | } | 211 | } |
210 | 212 | ||
211 | /* | 213 | /* |
@@ -227,7 +229,7 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name) | |||
227 | sym = ((void *)sym) + symbol_conf.priv_size; | 229 | sym = ((void *)sym) + symbol_conf.priv_size; |
228 | 230 | ||
229 | sym->start = start; | 231 | sym->start = start; |
230 | sym->end = len ? start + len - 1 : start; | 232 | sym->end = len ? start + len : start; |
231 | sym->binding = binding; | 233 | sym->binding = binding; |
232 | sym->namelen = namelen - 1; | 234 | sym->namelen = namelen - 1; |
233 | 235 | ||
@@ -323,7 +325,7 @@ static struct symbol *symbols__find(struct rb_root *symbols, u64 ip) | |||
323 | 325 | ||
324 | if (ip < s->start) | 326 | if (ip < s->start) |
325 | n = n->rb_left; | 327 | n = n->rb_left; |
326 | else if (ip > s->end) | 328 | else if (ip >= s->end) |
327 | n = n->rb_right; | 329 | n = n->rb_right; |
328 | else | 330 | else |
329 | return s; | 331 | return s; |
@@ -523,10 +525,15 @@ struct process_kallsyms_args { | |||
523 | struct dso *dso; | 525 | struct dso *dso; |
524 | }; | 526 | }; |
525 | 527 | ||
528 | /* | ||
529 | * These are symbols in the kernel image, so make sure that | ||
530 | * sym is from a kernel DSO. | ||
531 | */ | ||
526 | bool symbol__is_idle(struct symbol *sym) | 532 | bool symbol__is_idle(struct symbol *sym) |
527 | { | 533 | { |
528 | const char * const idle_symbols[] = { | 534 | const char * const idle_symbols[] = { |
529 | "cpu_idle", | 535 | "cpu_idle", |
536 | "cpu_startup_entry", | ||
530 | "intel_idle", | 537 | "intel_idle", |
531 | "default_idle", | 538 | "default_idle", |
532 | "native_safe_halt", | 539 | "native_safe_halt", |
@@ -1468,8 +1475,7 @@ int dso__load_vmlinux(struct dso *dso, struct map *map, | |||
1468 | if (vmlinux[0] == '/') | 1475 | if (vmlinux[0] == '/') |
1469 | snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux); | 1476 | snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux); |
1470 | else | 1477 | else |
1471 | snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s%s", | 1478 | symbol__join_symfs(symfs_vmlinux, vmlinux); |
1472 | symbol_conf.symfs, vmlinux); | ||
1473 | 1479 | ||
1474 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) | 1480 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) |
1475 | symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX; | 1481 | symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX; |
@@ -1745,12 +1751,13 @@ static void vmlinux_path__exit(void) | |||
1745 | zfree(&vmlinux_path); | 1751 | zfree(&vmlinux_path); |
1746 | } | 1752 | } |
1747 | 1753 | ||
1748 | static int vmlinux_path__init(void) | 1754 | static int vmlinux_path__init(struct perf_session_env *env) |
1749 | { | 1755 | { |
1750 | struct utsname uts; | 1756 | struct utsname uts; |
1751 | char bf[PATH_MAX]; | 1757 | char bf[PATH_MAX]; |
1758 | char *kernel_version; | ||
1752 | 1759 | ||
1753 | vmlinux_path = malloc(sizeof(char *) * 5); | 1760 | vmlinux_path = malloc(sizeof(char *) * 6); |
1754 | if (vmlinux_path == NULL) | 1761 | if (vmlinux_path == NULL) |
1755 | return -1; | 1762 | return -1; |
1756 | 1763 | ||
@@ -1763,25 +1770,37 @@ static int vmlinux_path__init(void) | |||
1763 | goto out_fail; | 1770 | goto out_fail; |
1764 | ++vmlinux_path__nr_entries; | 1771 | ++vmlinux_path__nr_entries; |
1765 | 1772 | ||
1766 | /* only try running kernel version if no symfs was given */ | 1773 | /* only try kernel version if no symfs was given */ |
1767 | if (symbol_conf.symfs[0] != 0) | 1774 | if (symbol_conf.symfs[0] != 0) |
1768 | return 0; | 1775 | return 0; |
1769 | 1776 | ||
1770 | if (uname(&uts) < 0) | 1777 | if (env) { |
1771 | return -1; | 1778 | kernel_version = env->os_release; |
1779 | } else { | ||
1780 | if (uname(&uts) < 0) | ||
1781 | goto out_fail; | ||
1772 | 1782 | ||
1773 | snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release); | 1783 | kernel_version = uts.release; |
1784 | } | ||
1785 | |||
1786 | snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", kernel_version); | ||
1774 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); | 1787 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); |
1775 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) | 1788 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) |
1776 | goto out_fail; | 1789 | goto out_fail; |
1777 | ++vmlinux_path__nr_entries; | 1790 | ++vmlinux_path__nr_entries; |
1778 | snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release); | 1791 | snprintf(bf, sizeof(bf), "/usr/lib/debug/boot/vmlinux-%s", |
1792 | kernel_version); | ||
1793 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); | ||
1794 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) | ||
1795 | goto out_fail; | ||
1796 | ++vmlinux_path__nr_entries; | ||
1797 | snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", kernel_version); | ||
1779 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); | 1798 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); |
1780 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) | 1799 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) |
1781 | goto out_fail; | 1800 | goto out_fail; |
1782 | ++vmlinux_path__nr_entries; | 1801 | ++vmlinux_path__nr_entries; |
1783 | snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux", | 1802 | snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux", |
1784 | uts.release); | 1803 | kernel_version); |
1785 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); | 1804 | vmlinux_path[vmlinux_path__nr_entries] = strdup(bf); |
1786 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) | 1805 | if (vmlinux_path[vmlinux_path__nr_entries] == NULL) |
1787 | goto out_fail; | 1806 | goto out_fail; |
@@ -1827,7 +1846,7 @@ static bool symbol__read_kptr_restrict(void) | |||
1827 | return value; | 1846 | return value; |
1828 | } | 1847 | } |
1829 | 1848 | ||
1830 | int symbol__init(void) | 1849 | int symbol__init(struct perf_session_env *env) |
1831 | { | 1850 | { |
1832 | const char *symfs; | 1851 | const char *symfs; |
1833 | 1852 | ||
@@ -1842,7 +1861,7 @@ int symbol__init(void) | |||
1842 | symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) - | 1861 | symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) - |
1843 | sizeof(struct symbol)); | 1862 | sizeof(struct symbol)); |
1844 | 1863 | ||
1845 | if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0) | 1864 | if (symbol_conf.try_vmlinux_path && vmlinux_path__init(env) < 0) |
1846 | return -1; | 1865 | return -1; |
1847 | 1866 | ||
1848 | if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') { | 1867 | if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') { |