Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf dwarf-regs: Move powerpc dwarf-regs out of arch

Move arch/powerpc/util/dwarf-regs.c to util/dwarf-regs-powerpc.c and
compile in unconditionally. get_arch_regstr is redundant when EM_NONE
is treated as EM_HOST so remove and update dwarf-regs.c conditions.
Make get_powerpc_regs unconditionally available whwn libdw is.

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-14-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

Ian Rogers and committed by
Namhyung Kim
285b523c 8a768a2f

+70 -149
-1
tools/perf/arch/powerpc/util/Build
··· 7 7 perf-util-y += evsel.o 8 8 perf-util-y += event.o 9 9 10 - perf-util-$(CONFIG_LIBDW) += dwarf-regs.o 11 10 perf-util-$(CONFIG_LIBDW) += skip-callchain-idx.o 12 11 13 12 perf-util-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
-141
tools/perf/arch/powerpc/util/dwarf-regs.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* 3 - * Mapping of DWARF debug register numbers into register names. 4 - * 5 - * Copyright (C) 2010 Ian Munsie, IBM Corporation. 6 - */ 7 - 8 - #include <stddef.h> 9 - #include <errno.h> 10 - #include <string.h> 11 - #include <dwarf-regs.h> 12 - #include <linux/kernel.h> 13 - #include <linux/stringify.h> 14 - 15 - struct regs_dwarfnum { 16 - const char *name; 17 - unsigned int dwarfnum; 18 - }; 19 - 20 - #define REG_DWARFNUM_NAME(r, num) \ 21 - {.name = __stringify(%)__stringify(r), .dwarfnum = num} 22 - #define GPR_DWARFNUM_NAME(num) \ 23 - {.name = __stringify(%gpr##num), .dwarfnum = num} 24 - #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} 25 - 26 - /* 27 - * Reference: 28 - * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html 29 - */ 30 - static const struct regs_dwarfnum regdwarfnum_table[] = { 31 - GPR_DWARFNUM_NAME(0), 32 - GPR_DWARFNUM_NAME(1), 33 - GPR_DWARFNUM_NAME(2), 34 - GPR_DWARFNUM_NAME(3), 35 - GPR_DWARFNUM_NAME(4), 36 - GPR_DWARFNUM_NAME(5), 37 - GPR_DWARFNUM_NAME(6), 38 - GPR_DWARFNUM_NAME(7), 39 - GPR_DWARFNUM_NAME(8), 40 - GPR_DWARFNUM_NAME(9), 41 - GPR_DWARFNUM_NAME(10), 42 - GPR_DWARFNUM_NAME(11), 43 - GPR_DWARFNUM_NAME(12), 44 - GPR_DWARFNUM_NAME(13), 45 - GPR_DWARFNUM_NAME(14), 46 - GPR_DWARFNUM_NAME(15), 47 - GPR_DWARFNUM_NAME(16), 48 - GPR_DWARFNUM_NAME(17), 49 - GPR_DWARFNUM_NAME(18), 50 - GPR_DWARFNUM_NAME(19), 51 - GPR_DWARFNUM_NAME(20), 52 - GPR_DWARFNUM_NAME(21), 53 - GPR_DWARFNUM_NAME(22), 54 - GPR_DWARFNUM_NAME(23), 55 - GPR_DWARFNUM_NAME(24), 56 - GPR_DWARFNUM_NAME(25), 57 - GPR_DWARFNUM_NAME(26), 58 - GPR_DWARFNUM_NAME(27), 59 - GPR_DWARFNUM_NAME(28), 60 - GPR_DWARFNUM_NAME(29), 61 - GPR_DWARFNUM_NAME(30), 62 - GPR_DWARFNUM_NAME(31), 63 - REG_DWARFNUM_NAME(msr, 66), 64 - REG_DWARFNUM_NAME(ctr, 109), 65 - REG_DWARFNUM_NAME(link, 108), 66 - REG_DWARFNUM_NAME(xer, 101), 67 - REG_DWARFNUM_NAME(dar, 119), 68 - REG_DWARFNUM_NAME(dsisr, 118), 69 - REG_DWARFNUM_END, 70 - }; 71 - 72 - /** 73 - * get_arch_regstr() - lookup register name from it's DWARF register number 74 - * @n: the DWARF register number 75 - * 76 - * get_arch_regstr() returns the name of the register in struct 77 - * regdwarfnum_table from it's DWARF register number. If the register is not 78 - * found in the table, this returns NULL; 79 - */ 80 - const char *get_arch_regstr(unsigned int n) 81 - { 82 - const struct regs_dwarfnum *roff; 83 - 84 - for (roff = regdwarfnum_table; roff->name != NULL; roff++) 85 - if (roff->dwarfnum == n) 86 - return roff->name; 87 - return NULL; 88 - } 89 - 90 - #define PPC_OP(op) (((op) >> 26) & 0x3F) 91 - #define PPC_RA(a) (((a) >> 16) & 0x1f) 92 - #define PPC_RT(t) (((t) >> 21) & 0x1f) 93 - #define PPC_RB(b) (((b) >> 11) & 0x1f) 94 - #define PPC_D(D) ((D) & 0xfffe) 95 - #define PPC_DS(DS) ((DS) & 0xfffc) 96 - #define OP_LD 58 97 - #define OP_STD 62 98 - 99 - static int get_source_reg(u32 raw_insn) 100 - { 101 - return PPC_RA(raw_insn); 102 - } 103 - 104 - static int get_target_reg(u32 raw_insn) 105 - { 106 - return PPC_RT(raw_insn); 107 - } 108 - 109 - static int get_offset_opcode(u32 raw_insn) 110 - { 111 - int opcode = PPC_OP(raw_insn); 112 - 113 - /* DS- form */ 114 - if ((opcode == OP_LD) || (opcode == OP_STD)) 115 - return PPC_DS(raw_insn); 116 - else 117 - return PPC_D(raw_insn); 118 - } 119 - 120 - /* 121 - * Fills the required fields for op_loc depending on if it 122 - * is a source or target. 123 - * D form: ins RT,D(RA) -> src_reg1 = RA, offset = D, dst_reg1 = RT 124 - * DS form: ins RT,DS(RA) -> src_reg1 = RA, offset = DS, dst_reg1 = RT 125 - * X form: ins RT,RA,RB -> src_reg1 = RA, src_reg2 = RB, dst_reg1 = RT 126 - */ 127 - void get_powerpc_regs(u32 raw_insn, int is_source, 128 - struct annotated_op_loc *op_loc) 129 - { 130 - if (is_source) 131 - op_loc->reg1 = get_source_reg(raw_insn); 132 - else 133 - op_loc->reg1 = get_target_reg(raw_insn); 134 - 135 - if (op_loc->multi_regs) 136 - op_loc->reg2 = PPC_RB(raw_insn); 137 - 138 - /* TODO: Implement offset handling for X Form */ 139 - if ((op_loc->mem_ref) && (PPC_OP(raw_insn) != 31)) 140 - op_loc->offset = get_offset_opcode(raw_insn); 141 - }
+1
tools/perf/util/Build
··· 205 205 perf-util-$(CONFIG_LIBDW) += dwarf-aux.o 206 206 perf-util-$(CONFIG_LIBDW) += dwarf-regs.o 207 207 perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o 208 + perf-util-$(CONFIG_LIBDW) += dwarf-regs-powerpc.o 208 209 perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o 209 210 perf-util-$(CONFIG_LIBDW) += debuginfo.o 210 211 perf-util-$(CONFIG_LIBDW) += annotate-data.o
+61
tools/perf/util/dwarf-regs-powerpc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Mapping of DWARF debug register numbers into register names. 4 + * 5 + * Copyright (C) 2010 Ian Munsie, IBM Corporation. 6 + */ 7 + 8 + #include <dwarf-regs.h> 9 + 10 + #define PPC_OP(op) (((op) >> 26) & 0x3F) 11 + #define PPC_RA(a) (((a) >> 16) & 0x1f) 12 + #define PPC_RT(t) (((t) >> 21) & 0x1f) 13 + #define PPC_RB(b) (((b) >> 11) & 0x1f) 14 + #define PPC_D(D) ((D) & 0xfffe) 15 + #define PPC_DS(DS) ((DS) & 0xfffc) 16 + #define OP_LD 58 17 + #define OP_STD 62 18 + 19 + static int get_source_reg(u32 raw_insn) 20 + { 21 + return PPC_RA(raw_insn); 22 + } 23 + 24 + static int get_target_reg(u32 raw_insn) 25 + { 26 + return PPC_RT(raw_insn); 27 + } 28 + 29 + static int get_offset_opcode(u32 raw_insn) 30 + { 31 + int opcode = PPC_OP(raw_insn); 32 + 33 + /* DS- form */ 34 + if ((opcode == OP_LD) || (opcode == OP_STD)) 35 + return PPC_DS(raw_insn); 36 + else 37 + return PPC_D(raw_insn); 38 + } 39 + 40 + /* 41 + * Fills the required fields for op_loc depending on if it 42 + * is a source or target. 43 + * D form: ins RT,D(RA) -> src_reg1 = RA, offset = D, dst_reg1 = RT 44 + * DS form: ins RT,DS(RA) -> src_reg1 = RA, offset = DS, dst_reg1 = RT 45 + * X form: ins RT,RA,RB -> src_reg1 = RA, src_reg2 = RB, dst_reg1 = RT 46 + */ 47 + void get_powerpc_regs(u32 raw_insn, int is_source, 48 + struct annotated_op_loc *op_loc) 49 + { 50 + if (is_source) 51 + op_loc->reg1 = get_source_reg(raw_insn); 52 + else 53 + op_loc->reg1 = get_target_reg(raw_insn); 54 + 55 + if (op_loc->multi_regs) 56 + op_loc->reg2 = PPC_RB(raw_insn); 57 + 58 + /* TODO: Implement offset handling for X Form */ 59 + if ((op_loc->mem_ref) && (PPC_OP(raw_insn) != 31)) 60 + op_loc->offset = get_offset_opcode(raw_insn); 61 + }
+4 -2
tools/perf/util/dwarf-regs.c
··· 32 32 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags) 33 33 { 34 34 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \ 35 - || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS 35 + || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \ 36 + || EM_HOST == EM_PPC64 36 37 if (machine == EM_NONE) { 37 38 /* Generic arch - use host arch */ 38 39 machine = EM_HOST; ··· 41 40 #endif 42 41 switch (machine) { 43 42 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \ 44 - && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS 43 + && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \ 44 + && EM_HOST != EM_PPC64 45 45 case EM_NONE: /* Generic arch - use host arch */ 46 46 return get_arch_regstr(n); 47 47 #endif
+4 -5
tools/perf/util/include/dwarf-regs.h
··· 90 90 91 91 #ifdef HAVE_LIBDW_SUPPORT 92 92 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \ 93 - && !defined(__loongarch__) && !defined(__mips__) 93 + && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \ 94 + && !defined(__powerpc64__) 94 95 const char *get_arch_regstr(unsigned int n); 95 96 #endif 96 97 ··· 118 117 */ 119 118 int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags); 120 119 120 + void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc); 121 + 121 122 #else /* HAVE_LIBDW_SUPPORT */ 122 123 123 124 static inline int get_dwarf_regnum(const char *name __maybe_unused, ··· 128 125 { 129 126 return -1; 130 127 } 131 - #endif 132 128 133 - #if !defined(__powerpc__) || !defined(HAVE_LIBDW_SUPPORT) 134 129 static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source __maybe_unused, 135 130 struct annotated_op_loc *op_loc __maybe_unused) 136 131 { 137 132 return; 138 133 } 139 - #else 140 - void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc); 141 134 #endif 142 135 143 136 #endif