mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
perf symbol: Avoid use of machine__is
Switch to using the ELF machine from the dso or running machine rather than the machine perf_env arch that may fall back on EM_HOST. This also avoids potentially imprecise string comparisons. Signed-off-by: Ian Rogers <irogers@google.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Honglei Wang <jameshongleiwang@126.com> Cc: Jan Polensky <japo@linux.ibm.com> Cc: Sumanth Korikkar <sumanthk@linux.ibm.com> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
c4e16f0543
commit
0af46a17c8
|
|
@ -851,6 +851,23 @@ static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
|
|||
return count;
|
||||
}
|
||||
|
||||
static uint16_t machine_or_dso_e_machine(struct machine *machine, struct dso *dso)
|
||||
{
|
||||
uint16_t e_machine = EM_NONE;
|
||||
/* DSO should be most accurate */
|
||||
if (dso)
|
||||
e_machine = dso__e_machine(dso, machine, /*e_flags=*/NULL);
|
||||
|
||||
if (e_machine != EM_NONE)
|
||||
return e_machine;
|
||||
|
||||
/* Check the global environment next. */
|
||||
if (machine && machine->env && machine->env->e_machine != EM_NONE)
|
||||
return machine->env->e_machine;
|
||||
|
||||
return perf_env__e_machine(machine ? machine->env : NULL, /*e_flags=*/NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Split the symbols into maps, making sure there are no overlaps, i.e. the
|
||||
* kernel range is broken in several maps, named [kernel].N, as we don't have
|
||||
|
|
@ -866,14 +883,13 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
|
|||
struct rb_root_cached *root = dso__symbols(dso);
|
||||
struct rb_node *next = rb_first_cached(root);
|
||||
int kernel_range = 0;
|
||||
bool x86_64;
|
||||
uint16_t e_machine = EM_NONE;
|
||||
|
||||
if (!kmaps)
|
||||
return -1;
|
||||
|
||||
machine = maps__machine(kmaps);
|
||||
|
||||
x86_64 = machine__is(machine, "x86_64");
|
||||
e_machine = machine_or_dso_e_machine(machine, dso);
|
||||
|
||||
while (next) {
|
||||
char *module;
|
||||
|
|
@ -925,7 +941,7 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
|
|||
*/
|
||||
pos->start = map__map_ip(curr_map, pos->start);
|
||||
pos->end = map__map_ip(curr_map, pos->end);
|
||||
} else if (x86_64 && is_entry_trampoline(pos->name)) {
|
||||
} else if (e_machine == EM_X86_64 && is_entry_trampoline(pos->name)) {
|
||||
/*
|
||||
* These symbols are not needed anymore since the
|
||||
* trampoline maps refer to the text section and it's
|
||||
|
|
@ -1428,7 +1444,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
|
|||
free(new_node);
|
||||
}
|
||||
|
||||
if (machine__is(machine, "x86_64")) {
|
||||
if (machine_or_dso_e_machine(machine, dso) == EM_X86_64) {
|
||||
u64 addr;
|
||||
|
||||
/*
|
||||
|
|
@ -1716,7 +1732,7 @@ int dso__load(struct dso *dso, struct map *map)
|
|||
ret = dso__load_guest_kernel_sym(dso, map);
|
||||
|
||||
machine = maps__machine(map__kmaps(map));
|
||||
if (machine__is(machine, "x86_64"))
|
||||
if (machine && machine_or_dso_e_machine(machine, dso) == EM_X86_64)
|
||||
machine__map_x86_64_entry_trampolines(machine, dso);
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user