OSDN Git Service

perf tools: Use the "_stest" symbol to identify the kernel map when loading kcore
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 9 May 2018 11:43:34 +0000 (14:43 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 15 May 2018 17:31:25 +0000 (14:31 -0300)
The first symbol is not necessarily in the kernel text.  Instead of
using the first symbol, use the _stest symbol to identify the kernel map
when loading kcore.

This allows for the introduction of symbols to identify the x86_64 PTI
entry trampolines.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: x86@kernel.org
Link: http://lkml.kernel.org/r/1525866228-30321-6-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/symbol.c

index f48dc15..4a39f4d 100644 (file)
@@ -1149,7 +1149,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
        bool is_64_bit;
        int err, fd;
        char kcore_filename[PATH_MAX];
-       struct symbol *sym;
+       u64 stext;
 
        if (!kmaps)
                return -EINVAL;
@@ -1198,13 +1198,13 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
                old_map = next;
        }
 
-       /* Find the kernel map using the first symbol */
-       sym = dso__first_symbol(dso);
-       list_for_each_entry(new_map, &md.maps, node) {
-               if (sym && sym->start >= new_map->start &&
-                   sym->start < new_map->end) {
-                       replacement_map = new_map;
-                       break;
+       /* Find the kernel map using the '_stext' symbol */
+       if (!kallsyms__get_function_start(kallsyms_filename, "_stext", &stext)) {
+               list_for_each_entry(new_map, &md.maps, node) {
+                       if (stext >= new_map->start && stext < new_map->end) {
+                               replacement_map = new_map;
+                               break;
+                       }
                }
        }