On Wed, Oct 16, 2024 at 05:25:04PM -0700, Ian Rogers wrote: > Currently functions like get_dwarf_regnum only work with the host > architecture. Carry the elf machine and flags in struct arch so that > in disassembly these can be used to allow cross platform disassembly. > > Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx> > --- > tools/perf/arch/arc/annotate/instructions.c | 2 ++ > tools/perf/arch/arm/annotate/instructions.c | 2 ++ > tools/perf/arch/arm64/annotate/instructions.c | 2 ++ > tools/perf/arch/csky/annotate/instructions.c | 7 ++++++- > tools/perf/arch/loongarch/annotate/instructions.c | 2 ++ > tools/perf/arch/mips/annotate/instructions.c | 2 ++ > tools/perf/arch/powerpc/annotate/instructions.c | 2 ++ > tools/perf/arch/riscv64/annotate/instructions.c | 2 ++ > tools/perf/arch/s390/annotate/instructions.c | 2 ++ > tools/perf/arch/sparc/annotate/instructions.c | 2 ++ > tools/perf/arch/x86/annotate/instructions.c | 3 ++- > tools/perf/util/disasm.h | 4 ++++ > 12 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c > index 2f00e995c7e3..e5619770a1af 100644 > --- a/tools/perf/arch/arc/annotate/instructions.c > +++ b/tools/perf/arch/arc/annotate/instructions.c > @@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > { > arch->initialized = true; > arch->objdump.comment_char = ';'; > + arch->e_machine = EM_ARC; > + arch->e_flags = 0; > return 0; > } > diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c > index 2ff6cedeb9c5..cf91a43362b0 100644 > --- a/tools/perf/arch/arm/annotate/instructions.c > +++ b/tools/perf/arch/arm/annotate/instructions.c > @@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = arm__associate_instruction_ops; > arch->objdump.comment_char = ';'; > arch->objdump.skip_functions_char = '+'; > + arch->e_machine = EM_ARM; > + arch->e_flags = 0; > return 0; > > out_free_call: > diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c > index f86d9f4798bd..d465d093e7eb 100644 > --- a/tools/perf/arch/arm64/annotate/instructions.c > +++ b/tools/perf/arch/arm64/annotate/instructions.c > @@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = arm64__associate_instruction_ops; > arch->objdump.comment_char = '/'; > arch->objdump.skip_functions_char = '+'; > + arch->e_machine = EM_AARCH64; > + arch->e_flags = 0; > return 0; > > out_free_call: > diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c > index 5337bfb7d5fc..14270311d215 100644 > --- a/tools/perf/arch/csky/annotate/instructions.c > +++ b/tools/perf/arch/csky/annotate/instructions.c > @@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->initialized = true; > arch->objdump.comment_char = '/'; > arch->associate_instruction_ops = csky__associate_ins_ops; > - > + arch->e_machine = EM_CSKY; > +#if defined(__CSKYABIV2__) > + arch->e_flags = EF_CSKY_ABIV2; > +#else > + arch->e_flags = EF_CSKY_ABIV1; > +#endif By moving this into the general code, it should take care of old systems that doesn't have the macro. In file included from util/disasm.c:109: /linux/tools/perf/arch/csky/annotate/instructions.c: In function 'csky__annotate_init': /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: error: 'EF_CSKY_ABIV1' undeclared (first use in this function) 50 | arch->e_flags = EF_CSKY_ABIV1; | ^~~~~~~~~~~~~ /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: note: each undeclared identifier is reported only once for each function it appears in Also, I think __CSKYABIV2__ is defined only when the host is csky. So it'll use ABI v1 on cross env. I'm not sure if it's a problem. We may need to save the ABI somewhere in the metadata later. Thanks, Namhyung > return 0; > } > diff --git a/tools/perf/arch/loongarch/annotate/instructions.c b/tools/perf/arch/loongarch/annotate/instructions.c > index ab43b1ab51e3..70262d5f1444 100644 > --- a/tools/perf/arch/loongarch/annotate/instructions.c > +++ b/tools/perf/arch/loongarch/annotate/instructions.c > @@ -131,6 +131,8 @@ int loongarch__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = loongarch__associate_ins_ops; > arch->initialized = true; > arch->objdump.comment_char = '#'; > + arch->e_machine = EM_LOONGARCH; > + arch->e_flags = 0; > } > > return 0; > diff --git a/tools/perf/arch/mips/annotate/instructions.c b/tools/perf/arch/mips/annotate/instructions.c > index 340993f2a897..b50b46c613d6 100644 > --- a/tools/perf/arch/mips/annotate/instructions.c > +++ b/tools/perf/arch/mips/annotate/instructions.c > @@ -40,6 +40,8 @@ int mips__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = mips__associate_ins_ops; > arch->initialized = true; > arch->objdump.comment_char = '#'; > + arch->e_machine = EM_MIPS; > + arch->e_flags = 0; > } > > return 0; > diff --git a/tools/perf/arch/powerpc/annotate/instructions.c b/tools/perf/arch/powerpc/annotate/instructions.c > index 54478cf5cccc..ca567cfdcbdb 100644 > --- a/tools/perf/arch/powerpc/annotate/instructions.c > +++ b/tools/perf/arch/powerpc/annotate/instructions.c > @@ -309,6 +309,8 @@ static int powerpc__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = powerpc__associate_instruction_ops; > arch->objdump.comment_char = '#'; > annotate_opts.show_asm_raw = true; > + arch->e_machine = EM_PPC; > + arch->e_flags = 0; > } > > return 0; > diff --git a/tools/perf/arch/riscv64/annotate/instructions.c b/tools/perf/arch/riscv64/annotate/instructions.c > index 869a0eb28953..55cf911633f8 100644 > --- a/tools/perf/arch/riscv64/annotate/instructions.c > +++ b/tools/perf/arch/riscv64/annotate/instructions.c > @@ -28,6 +28,8 @@ int riscv64__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->associate_instruction_ops = riscv64__associate_ins_ops; > arch->initialized = true; > arch->objdump.comment_char = '#'; > + arch->e_machine = EM_RISCV; > + arch->e_flags = 0; > } > > return 0; > diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c > index eeac25cca699..c61193f1e096 100644 > --- a/tools/perf/arch/s390/annotate/instructions.c > +++ b/tools/perf/arch/s390/annotate/instructions.c > @@ -166,6 +166,8 @@ static int s390__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > if (s390__cpuid_parse(arch, cpuid)) > err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING; > } > + arch->e_machine = EM_S390; > + arch->e_flags = 0; > } > > return err; > diff --git a/tools/perf/arch/sparc/annotate/instructions.c b/tools/perf/arch/sparc/annotate/instructions.c > index 2614c010c235..68c31580ccfc 100644 > --- a/tools/perf/arch/sparc/annotate/instructions.c > +++ b/tools/perf/arch/sparc/annotate/instructions.c > @@ -163,6 +163,8 @@ static int sparc__annotate_init(struct arch *arch, char *cpuid __maybe_unused) > arch->initialized = true; > arch->associate_instruction_ops = sparc__associate_instruction_ops; > arch->objdump.comment_char = '#'; > + arch->e_machine = EM_SPARC; > + arch->e_flags = 0; > } > > return 0; > diff --git a/tools/perf/arch/x86/annotate/instructions.c b/tools/perf/arch/x86/annotate/instructions.c > index c869abe3c31d..ae94b1f0b9cc 100644 > --- a/tools/perf/arch/x86/annotate/instructions.c > +++ b/tools/perf/arch/x86/annotate/instructions.c > @@ -202,7 +202,8 @@ static int x86__annotate_init(struct arch *arch, char *cpuid) > if (x86__cpuid_parse(arch, cpuid)) > err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING; > } > - > + arch->e_machine = EM_X86_64; > + arch->e_flags = 0; > arch->initialized = true; > return err; > } > diff --git a/tools/perf/util/disasm.h b/tools/perf/util/disasm.h > index 486c269b29ba..c135db2416b5 100644 > --- a/tools/perf/util/disasm.h > +++ b/tools/perf/util/disasm.h > @@ -44,6 +44,10 @@ struct arch { > struct data_loc_info *dloc, Dwarf_Die *cu_die, > struct disasm_line *dl); > #endif > + /** @e_machine: ELF machine associated with arch. */ > + unsigned int e_machine; > + /** @e_flags: Optional ELF flags associated with arch. */ > + unsigned int e_flags; > }; > > struct ins { > -- > 2.47.0.105.g07ac214952-goog >