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

Configure Feed

Select the types of activity you want to include in your feed.

perf dwarf-regs: Add RISC-V perf to DWARF register number mapping functions

These functions allow the generic initial register state code in
unwind-libdw to be used.

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: Alexandre Ghiti <alex@ghiti.fr>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.ibm.com>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Haibo Xu <haibo1.xu@intel.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Mark Wielaard <mark@klomp.org>
Cc: Namhyung Kim <namhyung@kernel.org>
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: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
36b372df f0053022

+18 -64
+1
tools/perf/util/dwarf-regs-arch/Build
··· 3 3 perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o 4 4 perf-util-$(CONFIG_LIBDW) += dwarf-regs-loongarch.o 5 5 perf-util-$(CONFIG_LIBDW) += dwarf-regs-powerpc.o 6 + perf-util-$(CONFIG_LIBDW) += dwarf-regs-riscv.o 6 7 perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
+12
tools/perf/util/dwarf-regs-arch/dwarf-regs-riscv.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <errno.h> 3 + #include <dwarf-regs.h> 4 + #include "../../../arch/riscv/include/uapi/asm/perf_regs.h" 5 + 6 + int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum) 7 + { 8 + if (perf_regnum < 0 || perf_regnum >= PERF_REG_RISCV_MAX) 9 + return -ENOENT; 10 + 11 + return perf_regnum; 12 + }
+3
tools/perf/util/dwarf-regs.c
··· 209 209 case EM_PPC64: 210 210 reg = __get_dwarf_regnum_for_perf_regnum_powerpc(perf_regnum); 211 211 break; 212 + case EM_RISCV: 213 + reg = __get_dwarf_regnum_for_perf_regnum_riscv(perf_regnum); 214 + break; 212 215 case EM_LOONGARCH: 213 216 reg = __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum); 214 217 break;
+1
tools/perf/util/include/dwarf-regs.h
··· 111 111 int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int flags); 112 112 int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum); 113 113 int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum); 114 + int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum); 114 115 115 116 /* 116 117 * get_dwarf_regnum - Returns DWARF regnum from register name
-1
tools/perf/util/unwind-libdw-arch/Build
··· 1 - perf-util-y += unwind-libdw-riscv.o 2 1 perf-util-y += unwind-libdw-s390.o
-58
tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. */ 3 - 4 - #include <elfutils/libdwfl.h> 5 - #include "../arch/riscv/include/uapi/asm/perf_regs.h" 6 - #include "util/unwind-libdw.h" 7 - #include "util/perf_regs.h" 8 - #include "util/sample.h" 9 - 10 - bool libdw_set_initial_registers_riscv(Dwfl_Thread *thread, void *arg) 11 - { 12 - struct unwind_info *ui = arg; 13 - struct regs_dump *user_regs = perf_sample__user_regs(ui->sample); 14 - Dwarf_Word dwarf_regs[32]; 15 - 16 - #define REG(r) ({ \ 17 - Dwarf_Word val = 0; \ 18 - perf_reg_value(&val, user_regs, PERF_REG_RISCV_##r); \ 19 - val; \ 20 - }) 21 - 22 - dwarf_regs[0] = 0; 23 - dwarf_regs[1] = REG(RA); 24 - dwarf_regs[2] = REG(SP); 25 - dwarf_regs[3] = REG(GP); 26 - dwarf_regs[4] = REG(TP); 27 - dwarf_regs[5] = REG(T0); 28 - dwarf_regs[6] = REG(T1); 29 - dwarf_regs[7] = REG(T2); 30 - dwarf_regs[8] = REG(S0); 31 - dwarf_regs[9] = REG(S1); 32 - dwarf_regs[10] = REG(A0); 33 - dwarf_regs[11] = REG(A1); 34 - dwarf_regs[12] = REG(A2); 35 - dwarf_regs[13] = REG(A3); 36 - dwarf_regs[14] = REG(A4); 37 - dwarf_regs[15] = REG(A5); 38 - dwarf_regs[16] = REG(A6); 39 - dwarf_regs[17] = REG(A7); 40 - dwarf_regs[18] = REG(S2); 41 - dwarf_regs[19] = REG(S3); 42 - dwarf_regs[20] = REG(S4); 43 - dwarf_regs[21] = REG(S5); 44 - dwarf_regs[22] = REG(S6); 45 - dwarf_regs[23] = REG(S7); 46 - dwarf_regs[24] = REG(S8); 47 - dwarf_regs[25] = REG(S9); 48 - dwarf_regs[26] = REG(S10); 49 - dwarf_regs[27] = REG(S11); 50 - dwarf_regs[28] = REG(T3); 51 - dwarf_regs[29] = REG(T4); 52 - dwarf_regs[30] = REG(T5); 53 - dwarf_regs[31] = REG(T6); 54 - dwfl_thread_state_register_pc(thread, REG(PC)); 55 - 56 - return dwfl_thread_state_registers(thread, 0, PERF_REG_RISCV_MAX, 57 - dwarf_regs); 58 - }
+1 -4
tools/perf/util/unwind-libdw.c
··· 292 292 .set_initial_registers = libdw_set_initial_registers_generic, 293 293 }; 294 294 295 - DEFINE_DWFL_THREAD_CALLBACKS(riscv); 296 295 DEFINE_DWFL_THREAD_CALLBACKS(s390); 297 296 298 297 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) 299 298 { 300 - if (!strcmp(arch, "riscv")) 301 - return &callbacks_riscv; 302 - else if (!strcmp(arch, "s390")) 299 + if (!strcmp(arch, "s390")) 303 300 return &callbacks_s390; 304 301 305 302 return &callbacks_generic;
-1
tools/perf/util/unwind-libdw.h
··· 10 10 struct thread; 11 11 12 12 bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); 13 - bool libdw_set_initial_registers_riscv(Dwfl_Thread *thread, void *arg); 14 13 bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg); 15 14 16 15 struct unwind_info {