perf disasm: Add e_machine/e_flags to struct arch
authorIan Rogers <irogers@google.com>
Fri, 8 Nov 2024 23:45:49 +0000 (15:45 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 9 Nov 2024 16:39:13 +0000 (08:39 -0800)
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.

Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Anup Patel <anup@brainfault.org>
Cc: Yang Jihong <yangjihong@bytedance.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Shenlin Liang <liangshenlin@eswincomputing.com>
Cc: Nick Terrell <terrelln@fb.com>
Cc: Guilherme Amadio <amadio@gentoo.org>
Cc: Steinar H. Gunderson <sesse@google.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Alexander Lobakin <aleksander.lobakin@intel.com>
Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Will Deacon <will@kernel.org>
Cc: James Clark <james.clark@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Chen Pei <cp0613@linux.alibaba.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-riscv@lists.infradead.org
Cc: Bibo Mao <maobibo@loongson.cn>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Atish Patra <atishp@rivosinc.com>
Cc: Dima Kogan <dima@secretsauce.net>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: linux-csky@vger.kernel.org
Link: https://lore.kernel.org/r/20241108234606.429459-5-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
12 files changed:
tools/perf/arch/arc/annotate/instructions.c
tools/perf/arch/arm/annotate/instructions.c
tools/perf/arch/arm64/annotate/instructions.c
tools/perf/arch/csky/annotate/instructions.c
tools/perf/arch/loongarch/annotate/instructions.c
tools/perf/arch/mips/annotate/instructions.c
tools/perf/arch/powerpc/annotate/instructions.c
tools/perf/arch/riscv64/annotate/instructions.c
tools/perf/arch/s390/annotate/instructions.c
tools/perf/arch/sparc/annotate/instructions.c
tools/perf/arch/x86/annotate/instructions.c
tools/perf/util/disasm.h

index 2f00e99..e561977 100644 (file)
@@ -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;
 }
index 2ff6ced..cf91a43 100644 (file)
@@ -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:
index f86d9f4..d465d09 100644 (file)
@@ -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:
index 5337bfb..1427031 100644 (file)
@@ -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
        return 0;
 }
index ab43b1a..70262d5 100644 (file)
@@ -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;
index 340993f..b50b46c 100644 (file)
@@ -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;
index 54478cf..ca567cf 100644 (file)
@@ -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;
index 869a0eb..55cf911 100644 (file)
@@ -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;
index eeac25c..c61193f 100644 (file)
@@ -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;
index 2614c01..68c3158 100644 (file)
@@ -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;
index c869abe..ae94b1f 100644 (file)
@@ -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;
 }
index 486c269..c135db2 100644 (file)
@@ -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 {