diff options
Diffstat (limited to 'tools/perf/tests/vmlinux-kallsyms.c')
| -rw-r--r-- | tools/perf/tests/vmlinux-kallsyms.c | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c index e63abab7d5a1..a5082331f246 100644 --- a/tools/perf/tests/vmlinux-kallsyms.c +++ b/tools/perf/tests/vmlinux-kallsyms.c | |||
| @@ -8,14 +8,6 @@ | |||
| 8 | #include "debug.h" | 8 | #include "debug.h" |
| 9 | #include "machine.h" | 9 | #include "machine.h" |
| 10 | 10 | ||
| 11 | static int vmlinux_matches_kallsyms_filter(struct map *map __maybe_unused, | ||
| 12 | struct symbol *sym) | ||
| 13 | { | ||
| 14 | bool *visited = symbol__priv(sym); | ||
| 15 | *visited = true; | ||
| 16 | return 0; | ||
| 17 | } | ||
| 18 | |||
| 19 | #define UM(x) kallsyms_map->unmap_ip(kallsyms_map, (x)) | 11 | #define UM(x) kallsyms_map->unmap_ip(kallsyms_map, (x)) |
| 20 | 12 | ||
| 21 | int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) | 13 | int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) |
| @@ -28,6 +20,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) | |||
| 28 | enum map_type type = MAP__FUNCTION; | 20 | enum map_type type = MAP__FUNCTION; |
| 29 | struct maps *maps = &vmlinux.kmaps.maps[type]; | 21 | struct maps *maps = &vmlinux.kmaps.maps[type]; |
| 30 | u64 mem_start, mem_end; | 22 | u64 mem_start, mem_end; |
| 23 | bool header_printed; | ||
| 31 | 24 | ||
| 32 | /* | 25 | /* |
| 33 | * Step 1: | 26 | * Step 1: |
| @@ -61,7 +54,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) | |||
| 61 | * be compacted against the list of modules found in the "vmlinux" | 54 | * be compacted against the list of modules found in the "vmlinux" |
| 62 | * code and with the one got from /proc/modules from the "kallsyms" code. | 55 | * code and with the one got from /proc/modules from the "kallsyms" code. |
| 63 | */ | 56 | */ |
| 64 | if (__machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, true, NULL) <= 0) { | 57 | if (__machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, true) <= 0) { |
| 65 | pr_debug("dso__load_kallsyms "); | 58 | pr_debug("dso__load_kallsyms "); |
| 66 | goto out; | 59 | goto out; |
| 67 | } | 60 | } |
| @@ -99,8 +92,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) | |||
| 99 | * maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines | 92 | * maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines |
| 100 | * to fixup the symbols. | 93 | * to fixup the symbols. |
| 101 | */ | 94 | */ |
| 102 | if (machine__load_vmlinux_path(&vmlinux, type, | 95 | if (machine__load_vmlinux_path(&vmlinux, type) <= 0) { |
| 103 | vmlinux_matches_kallsyms_filter) <= 0) { | ||
| 104 | pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n"); | 96 | pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n"); |
| 105 | err = TEST_SKIP; | 97 | err = TEST_SKIP; |
| 106 | goto out; | 98 | goto out; |
| @@ -126,7 +118,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused) | |||
| 126 | mem_end = vmlinux_map->unmap_ip(vmlinux_map, sym->end); | 118 | mem_end = vmlinux_map->unmap_ip(vmlinux_map, sym->end); |
| 127 | 119 | ||
| 128 | first_pair = machine__find_kernel_symbol(&kallsyms, type, | 120 | first_pair = machine__find_kernel_symbol(&kallsyms, type, |
| 129 | mem_start, NULL, NULL); | 121 | mem_start, NULL); |
| 130 | pair = first_pair; | 122 | pair = first_pair; |
| 131 | 123 | ||
| 132 | if (pair && UM(pair->start) == mem_start) { | 124 | if (pair && UM(pair->start) == mem_start) { |
| @@ -143,7 +135,7 @@ next_pair: | |||
| 143 | */ | 135 | */ |
| 144 | s64 skew = mem_end - UM(pair->end); | 136 | s64 skew = mem_end - UM(pair->end); |
| 145 | if (llabs(skew) >= page_size) | 137 | if (llabs(skew) >= page_size) |
| 146 | pr_debug("%#" PRIx64 ": diff end addr for %s v: %#" PRIx64 " k: %#" PRIx64 "\n", | 138 | pr_debug("WARN: %#" PRIx64 ": diff end addr for %s v: %#" PRIx64 " k: %#" PRIx64 "\n", |
| 147 | mem_start, sym->name, mem_end, | 139 | mem_start, sym->name, mem_end, |
| 148 | UM(pair->end)); | 140 | UM(pair->end)); |
| 149 | 141 | ||
| @@ -154,22 +146,23 @@ next_pair: | |||
| 154 | * kallsyms. | 146 | * kallsyms. |
| 155 | */ | 147 | */ |
| 156 | continue; | 148 | continue; |
| 157 | |||
| 158 | } else { | 149 | } else { |
| 159 | pair = machine__find_kernel_symbol_by_name(&kallsyms, type, sym->name, NULL, NULL); | 150 | pair = machine__find_kernel_symbol_by_name(&kallsyms, type, sym->name, NULL); |
| 160 | if (pair) { | 151 | if (pair) { |
| 161 | if (UM(pair->start) == mem_start) | 152 | if (UM(pair->start) == mem_start) |
| 162 | goto next_pair; | 153 | goto next_pair; |
| 163 | 154 | ||
| 164 | pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n", | 155 | pr_debug("WARN: %#" PRIx64 ": diff name v: %s k: %s\n", |
| 165 | mem_start, sym->name, pair->name); | 156 | mem_start, sym->name, pair->name); |
| 166 | } else { | 157 | } else { |
| 167 | pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n", | 158 | pr_debug("WARN: %#" PRIx64 ": diff name v: %s k: %s\n", |
| 168 | mem_start, sym->name, first_pair->name); | 159 | mem_start, sym->name, first_pair->name); |
| 169 | } | 160 | } |
| 161 | |||
| 162 | continue; | ||
| 170 | } | 163 | } |
| 171 | } else | 164 | } else |
| 172 | pr_debug("%#" PRIx64 ": %s not on kallsyms\n", | 165 | pr_debug("ERR : %#" PRIx64 ": %s not on kallsyms\n", |
| 173 | mem_start, sym->name); | 166 | mem_start, sym->name); |
| 174 | 167 | ||
| 175 | err = -1; | 168 | err = -1; |
| @@ -178,7 +171,7 @@ next_pair: | |||
| 178 | if (!verbose) | 171 | if (!verbose) |
| 179 | goto out; | 172 | goto out; |
| 180 | 173 | ||
| 181 | pr_info("Maps only in vmlinux:\n"); | 174 | header_printed = false; |
| 182 | 175 | ||
| 183 | for (map = maps__first(maps); map; map = map__next(map)) { | 176 | for (map = maps__first(maps); map; map = map__next(map)) { |
| 184 | struct map * | 177 | struct map * |
| @@ -192,13 +185,18 @@ next_pair: | |||
| 192 | (map->dso->kernel ? | 185 | (map->dso->kernel ? |
| 193 | map->dso->short_name : | 186 | map->dso->short_name : |
| 194 | map->dso->name)); | 187 | map->dso->name)); |
| 195 | if (pair) | 188 | if (pair) { |
| 196 | pair->priv = 1; | 189 | pair->priv = 1; |
| 197 | else | 190 | } else { |
| 191 | if (!header_printed) { | ||
| 192 | pr_info("WARN: Maps only in vmlinux:\n"); | ||
| 193 | header_printed = true; | ||
| 194 | } | ||
| 198 | map__fprintf(map, stderr); | 195 | map__fprintf(map, stderr); |
| 196 | } | ||
| 199 | } | 197 | } |
| 200 | 198 | ||
| 201 | pr_info("Maps in vmlinux with a different name in kallsyms:\n"); | 199 | header_printed = false; |
| 202 | 200 | ||
| 203 | for (map = maps__first(maps); map; map = map__next(map)) { | 201 | for (map = maps__first(maps); map; map = map__next(map)) { |
| 204 | struct map *pair; | 202 | struct map *pair; |
| @@ -211,24 +209,33 @@ next_pair: | |||
| 211 | continue; | 209 | continue; |
| 212 | 210 | ||
| 213 | if (pair->start == mem_start) { | 211 | if (pair->start == mem_start) { |
| 214 | pair->priv = 1; | 212 | if (!header_printed) { |
| 215 | pr_info(" %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as", | 213 | pr_info("WARN: Maps in vmlinux with a different name in kallsyms:\n"); |
| 214 | header_printed = true; | ||
| 215 | } | ||
| 216 | |||
| 217 | pr_info("WARN: %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as", | ||
| 216 | map->start, map->end, map->pgoff, map->dso->name); | 218 | map->start, map->end, map->pgoff, map->dso->name); |
| 217 | if (mem_end != pair->end) | 219 | if (mem_end != pair->end) |
| 218 | pr_info(":\n*%" PRIx64 "-%" PRIx64 " %" PRIx64, | 220 | pr_info(":\nWARN: *%" PRIx64 "-%" PRIx64 " %" PRIx64, |
| 219 | pair->start, pair->end, pair->pgoff); | 221 | pair->start, pair->end, pair->pgoff); |
| 220 | pr_info(" %s\n", pair->dso->name); | 222 | pr_info(" %s\n", pair->dso->name); |
| 221 | pair->priv = 1; | 223 | pair->priv = 1; |
| 222 | } | 224 | } |
| 223 | } | 225 | } |
| 224 | 226 | ||
| 225 | pr_info("Maps only in kallsyms:\n"); | 227 | header_printed = false; |
| 226 | 228 | ||
| 227 | maps = &kallsyms.kmaps.maps[type]; | 229 | maps = &kallsyms.kmaps.maps[type]; |
| 228 | 230 | ||
| 229 | for (map = maps__first(maps); map; map = map__next(map)) { | 231 | for (map = maps__first(maps); map; map = map__next(map)) { |
| 230 | if (!map->priv) | 232 | if (!map->priv) { |
| 233 | if (!header_printed) { | ||
| 234 | pr_info("WARN: Maps only in kallsyms:\n"); | ||
| 235 | header_printed = true; | ||
| 236 | } | ||
| 231 | map__fprintf(map, stderr); | 237 | map__fprintf(map, stderr); |
| 238 | } | ||
| 232 | } | 239 | } |
| 233 | out: | 240 | out: |
| 234 | machine__exit(&kallsyms); | 241 | machine__exit(&kallsyms); |
