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 2f00e995c7e38de85461b1df587854af1660e005..e5619770a1af7365bffb79505c952a9d34ff4e0e 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 2ff6cedeb9c53715f4c4f8280bed959fd2be3202..cf91a43362b0e3f17dac175c7e415e49208ff316 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 f86d9f4798bd06b95f608a9142e37bfea1728c36..d465d093e7eb57486cebb174edb22ccdac671abd 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 5337bfb7d5fcf63ad044d478c18239eccce676fd..14270311d215ef7e523f4c6c47f5477c80d23dce 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 ab43b1ab51e3ba989d5d2864b3fe5205a1620916..70262d5f1444243dd95bb8e83229cf967adb5b51 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 340993f2a897a43e77ff0df991e85a8e70507832..b50b46c613d660149ab9e85492ca762696597b9e 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 54478cf5cccc95a782624c33137dc809a6e8bd04..ca567cfdcbdb4dda11d8aa3fda9a0a6dd5cf44c1 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 869a0eb28953198fc9d7ee8dcd956ef5255642a5..55cf911633f8bd4ebed5e6bb076a03f0a014c196 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 eeac25cca699a0b7b5198e76365583f7ee5ad5cb..c61193f1e096404026d8536d1511a79e7dd8eea2 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 2614c010c23522bc63e0e8c1e9935ae18d33cfb1..68c31580ccfc44d53619ab4147ade2123b726e6a 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 c869abe3c31da4fd72ea3fb90f6eedac8dc963ba..ae94b1f0b9cce1d3c0e4617abef106309b484e6c 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 486c269b29ba5cf7624d56cc9b430814740d26e9..c135db2416b5cdceaa29cc3fbd14b771834c5cb9 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 {