mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-04 21:49:11 +08:00
Switch arch__find to using an ELF machine number rather than a string. Rather than an array of fixed size arch structs turn the init functions into new functions indexed by the ELF machine they correspond to. This allows data to be stored with a struct arch with the container_of trick, so the priv variable can be removed. Switch to using the thread to find the arch rather than the evsel as the evsel only has limited notions of the running thread upon which disassembly is performed. Factor out the e_machine and e_flags into their own struct to make them easier to pass around. Reviewed-by: James Clark <james.clark@linaro.org> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Aditya Bodkhe <aditya.b1@linux.ibm.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Athira Rajeev <atrajeev@linux.ibm.com> Cc: Bill Wendling <morbo@google.com> Cc: Dr. David Alan Gilbert <linux@treblig.org> Cc: Guo Ren <guoren@kernel.org> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Julia Lawall <Julia.Lawall@inria.fr> Cc: Justin Stitt <justinstitt@google.com> Cc: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <pjw@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sergei Trofimovich <slyich@gmail.com> Cc: Shimin Guo <shimin.guo@skydio.com> Cc: Suchit Karunakaran <suchitkarunakaran@gmail.com> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Tianyou Li <tianyou.li@intel.com> Cc: Will Deacon <will@kernel.org> Cc: Zecheng Li <zecheng@google.com> [ Include elf.h for EM_CSKY and friends and also conditionally define EM_CSKY_ABIMASK for old distros ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <stdlib.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/zalloc.h>
|
|
#include <errno.h>
|
|
#include <regex.h>
|
|
#include "../annotate.h"
|
|
#include "../disasm.h"
|
|
|
|
struct arch_arm {
|
|
struct arch arch;
|
|
regex_t call_insn;
|
|
regex_t jump_insn;
|
|
};
|
|
|
|
static const struct ins_ops *arm__associate_instruction_ops(struct arch *arch, const char *name)
|
|
{
|
|
struct arch_arm *arm = container_of(arch, struct arch_arm, arch);
|
|
const struct ins_ops *ops;
|
|
regmatch_t match[2];
|
|
|
|
if (!regexec(&arm->call_insn, name, 2, match, 0))
|
|
ops = &call_ops;
|
|
else if (!regexec(&arm->jump_insn, name, 2, match, 0))
|
|
ops = &jump_ops;
|
|
else
|
|
return NULL;
|
|
|
|
arch__associate_ins_ops(arch, name, ops);
|
|
return ops;
|
|
}
|
|
|
|
const struct arch *arch__new_arm(const struct e_machine_and_e_flags *id,
|
|
const char *cpuid __maybe_unused)
|
|
{
|
|
int err;
|
|
struct arch_arm *arm = zalloc(sizeof(*arm));
|
|
struct arch *arch;
|
|
|
|
if (!arm)
|
|
return NULL;
|
|
|
|
arch = &arm->arch;
|
|
arch->name = "arm";
|
|
arch->id = *id;
|
|
arch->objdump.comment_char = ';';
|
|
arch->objdump.skip_functions_char = '+';
|
|
arch->associate_instruction_ops = arm__associate_instruction_ops;
|
|
|
|
#define ARM_CONDS "(cc|cs|eq|ge|gt|hi|le|ls|lt|mi|ne|pl|vc|vs)"
|
|
err = regcomp(&arm->call_insn, "^blx?" ARM_CONDS "?$", REG_EXTENDED);
|
|
if (err)
|
|
goto out_free_arm;
|
|
|
|
err = regcomp(&arm->jump_insn, "^bx?" ARM_CONDS "?$", REG_EXTENDED);
|
|
if (err)
|
|
goto out_free_call;
|
|
#undef ARM_CONDS
|
|
|
|
return arch;
|
|
|
|
out_free_call:
|
|
regfree(&arm->call_insn);
|
|
out_free_arm:
|
|
free(arm);
|
|
errno = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP;
|
|
return NULL;
|
|
}
|