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 S390 perf to DWARF register number mapping functions

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

Now the non-generic code in unwind-libdw has no uses remove it.

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
1e452dd8 36b372df

+62 -94
+1
tools/perf/util/dwarf-regs-arch/Build
··· 4 4 perf-util-$(CONFIG_LIBDW) += dwarf-regs-loongarch.o 5 5 perf-util-$(CONFIG_LIBDW) += dwarf-regs-powerpc.o 6 6 perf-util-$(CONFIG_LIBDW) += dwarf-regs-riscv.o 7 + perf-util-$(CONFIG_LIBDW) += dwarf-regs-s390.o 7 8 perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
+53
tools/perf/util/dwarf-regs-arch/dwarf-regs-s390.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <errno.h> 3 + #include <dwarf-regs.h> 4 + #include "../../../arch/s390/include/uapi/asm/perf_regs.h" 5 + 6 + int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum) 7 + { 8 + static const int dwarf_s390_regnums[] = { 9 + [PERF_REG_S390_R0] = 0, 10 + [PERF_REG_S390_R1] = 1, 11 + [PERF_REG_S390_R2] = 2, 12 + [PERF_REG_S390_R3] = 3, 13 + [PERF_REG_S390_R4] = 4, 14 + [PERF_REG_S390_R5] = 5, 15 + [PERF_REG_S390_R6] = 6, 16 + [PERF_REG_S390_R7] = 7, 17 + [PERF_REG_S390_R8] = 8, 18 + [PERF_REG_S390_R9] = 9, 19 + [PERF_REG_S390_R10] = 10, 20 + [PERF_REG_S390_R11] = 11, 21 + [PERF_REG_S390_R12] = 12, 22 + [PERF_REG_S390_R13] = 13, 23 + [PERF_REG_S390_R14] = 14, 24 + [PERF_REG_S390_R15] = 15, 25 + [PERF_REG_S390_FP0] = 16, 26 + [PERF_REG_S390_FP1] = 20, 27 + [PERF_REG_S390_FP2] = 17, 28 + [PERF_REG_S390_FP3] = 21, 29 + [PERF_REG_S390_FP4] = 18, 30 + [PERF_REG_S390_FP5] = 22, 31 + [PERF_REG_S390_FP6] = 19, 32 + [PERF_REG_S390_FP7] = 23, 33 + [PERF_REG_S390_FP8] = 24, 34 + [PERF_REG_S390_FP9] = 28, 35 + [PERF_REG_S390_FP10] = 25, 36 + [PERF_REG_S390_FP11] = 29, 37 + [PERF_REG_S390_FP12] = 26, 38 + [PERF_REG_S390_FP13] = 30, 39 + [PERF_REG_S390_FP14] = 27, 40 + [PERF_REG_S390_FP15] = 31, 41 + [PERF_REG_S390_MASK] = 64, 42 + [PERF_REG_S390_PC] = 65, 43 + }; 44 + 45 + if (perf_regnum == 0) 46 + return 0; 47 + 48 + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_s390_regnums) || 49 + dwarf_s390_regnums[perf_regnum] == 0) 50 + return -ENOENT; 51 + 52 + return dwarf_s390_regnums[perf_regnum]; 53 + }
+3
tools/perf/util/dwarf-regs.c
··· 212 212 case EM_RISCV: 213 213 reg = __get_dwarf_regnum_for_perf_regnum_riscv(perf_regnum); 214 214 break; 215 + case EM_S390: 216 + reg = __get_dwarf_regnum_for_perf_regnum_s390(perf_regnum); 217 + break; 215 218 case EM_LOONGARCH: 216 219 reg = __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum); 217 220 break;
+1
tools/perf/util/include/dwarf-regs.h
··· 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 114 int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum); 115 + int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum); 115 116 116 117 /* 117 118 * get_dwarf_regnum - Returns DWARF regnum from register name
-1
tools/perf/util/unwind-libdw-arch/Build
··· 1 - perf-util-y += unwind-libdw-s390.o
-65
tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c
··· 1 - #include <linux/kernel.h> 2 - #include <elfutils/libdwfl.h> 3 - #include "util/unwind-libdw.h" 4 - #include "util/perf_regs.h" 5 - #include "util/event.h" 6 - #include "util/sample.h" 7 - #include "../arch/s390/include/dwarf-regs-table.h" 8 - #include "../arch/s390/include/uapi/asm/perf_regs.h" 9 - 10 - 11 - bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg) 12 - { 13 - struct unwind_info *ui = arg; 14 - struct regs_dump *user_regs = perf_sample__user_regs(ui->sample); 15 - Dwarf_Word dwarf_regs[ARRAY_SIZE(s390_dwarf_regs)]; 16 - 17 - #define REG(r) ({ \ 18 - Dwarf_Word val = 0; \ 19 - perf_reg_value(&val, user_regs, PERF_REG_S390_##r); \ 20 - val; \ 21 - }) 22 - /* 23 - * For DWARF register mapping details, 24 - * see also perf/arch/s390/include/dwarf-regs-table.h 25 - */ 26 - dwarf_regs[0] = REG(R0); 27 - dwarf_regs[1] = REG(R1); 28 - dwarf_regs[2] = REG(R2); 29 - dwarf_regs[3] = REG(R3); 30 - dwarf_regs[4] = REG(R4); 31 - dwarf_regs[5] = REG(R5); 32 - dwarf_regs[6] = REG(R6); 33 - dwarf_regs[7] = REG(R7); 34 - dwarf_regs[8] = REG(R8); 35 - dwarf_regs[9] = REG(R9); 36 - dwarf_regs[10] = REG(R10); 37 - dwarf_regs[11] = REG(R11); 38 - dwarf_regs[12] = REG(R12); 39 - dwarf_regs[13] = REG(R13); 40 - dwarf_regs[14] = REG(R14); 41 - dwarf_regs[15] = REG(R15); 42 - 43 - dwarf_regs[16] = REG(FP0); 44 - dwarf_regs[17] = REG(FP2); 45 - dwarf_regs[18] = REG(FP4); 46 - dwarf_regs[19] = REG(FP6); 47 - dwarf_regs[20] = REG(FP1); 48 - dwarf_regs[21] = REG(FP3); 49 - dwarf_regs[22] = REG(FP5); 50 - dwarf_regs[23] = REG(FP7); 51 - dwarf_regs[24] = REG(FP8); 52 - dwarf_regs[25] = REG(FP10); 53 - dwarf_regs[26] = REG(FP12); 54 - dwarf_regs[27] = REG(FP14); 55 - dwarf_regs[28] = REG(FP9); 56 - dwarf_regs[29] = REG(FP11); 57 - dwarf_regs[30] = REG(FP13); 58 - dwarf_regs[31] = REG(FP15); 59 - 60 - dwarf_regs[64] = REG(MASK); 61 - dwarf_regs[65] = REG(PC); 62 - 63 - dwfl_thread_state_register_pc(thread, dwarf_regs[65]); 64 - return dwfl_thread_state_registers(thread, 0, 32, dwarf_regs); 65 - }
+4 -27
tools/perf/util/unwind-libdw.c
··· 226 226 return true; 227 227 } 228 228 229 - static bool libdw_set_initial_registers_generic(Dwfl_Thread *thread, void *arg) 229 + static bool libdw_set_initial_registers(Dwfl_Thread *thread, void *arg) 230 230 { 231 231 struct unwind_info *ui = arg; 232 232 struct regs_dump *user_regs = perf_sample__user_regs(ui->sample); ··· 279 279 return ret; 280 280 } 281 281 282 - #define DEFINE_DWFL_THREAD_CALLBACKS(arch) \ 283 - static const Dwfl_Thread_Callbacks callbacks_##arch = { \ 284 - .next_thread = next_thread, \ 285 - .memory_read = memory_read, \ 286 - .set_initial_registers = libdw_set_initial_registers_##arch, \ 287 - } 288 - 289 - static const Dwfl_Thread_Callbacks callbacks_generic = { 282 + static const Dwfl_Thread_Callbacks callbacks = { 290 283 .next_thread = next_thread, 291 284 .memory_read = memory_read, 292 - .set_initial_registers = libdw_set_initial_registers_generic, 285 + .set_initial_registers = libdw_set_initial_registers, 293 286 }; 294 - 295 - DEFINE_DWFL_THREAD_CALLBACKS(s390); 296 - 297 - static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) 298 - { 299 - if (!strcmp(arch, "s390")) 300 - return &callbacks_s390; 301 - 302 - return &callbacks_generic; 303 - } 304 287 305 288 static int 306 289 frame_callback(Dwfl_Frame *state, void *arg) ··· 332 349 .e_machine = e_machine, 333 350 .best_effort = best_effort 334 351 }; 335 - const char *arch = perf_env__arch(machine->env); 336 352 Dwarf_Word ip; 337 353 int err = -EINVAL, i; 338 - const Dwfl_Thread_Callbacks *callbacks; 339 354 340 355 if (!data->user_regs || !data->user_regs->regs) 341 356 return -EINVAL; ··· 356 375 if (err) 357 376 goto out; 358 377 359 - callbacks = get_thread_callbacks(arch); 360 - if (!callbacks) 361 - goto out; 362 - 363 - err = !dwfl_attach_state(ui->dwfl, /*elf=*/NULL, thread__tid(thread), callbacks, ui); 378 + err = !dwfl_attach_state(ui->dwfl, /*elf=*/NULL, thread__tid(thread), &callbacks, ui); 364 379 if (err) 365 380 goto out; 366 381
-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_s390(Dwfl_Thread *thread, void *arg); 14 13 15 14 struct unwind_info { 16 15 Dwfl *dwfl;