Skip to content

Commit 1e452dd

Browse files
captain5050acmel
authored andcommitted
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 <[email protected]> Cc: Aditya Bodkhe <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Albert Ou <[email protected]> Cc: Alexandre Ghiti <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Athira Rajeev <[email protected]> Cc: Chun-Tse Shao <[email protected]> Cc: Dmitriy Vyukov <[email protected]> Cc: Dr. David Alan Gilbert <[email protected]> Cc: Guo Ren <[email protected]> Cc: Haibo Xu <[email protected]> Cc: Howard Chu <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: James Clark <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: John Garry <[email protected]> Cc: Krzysztof Łopatowski <[email protected]> Cc: Leo Yan <[email protected]> Cc: Mark Wielaard <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Palmer Dabbelt <[email protected]> Cc: Paul Walmsley <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Sergei Trofimovich <[email protected]> Cc: Shimin Guo <[email protected]> Cc: Stephen Brennan <[email protected]> Cc: Thomas Falcon <[email protected]> Cc: Will Deacon <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 36b372d commit 1e452dd

8 files changed

Lines changed: 62 additions & 94 deletions

File tree

tools/perf/util/dwarf-regs-arch/Build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o
44
perf-util-$(CONFIG_LIBDW) += dwarf-regs-loongarch.o
55
perf-util-$(CONFIG_LIBDW) += dwarf-regs-powerpc.o
66
perf-util-$(CONFIG_LIBDW) += dwarf-regs-riscv.o
7+
perf-util-$(CONFIG_LIBDW) += dwarf-regs-s390.o
78
perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
}

tools/perf/util/dwarf-regs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, unsigned int machine,
212212
case EM_RISCV:
213213
reg = __get_dwarf_regnum_for_perf_regnum_riscv(perf_regnum);
214214
break;
215+
case EM_S390:
216+
reg = __get_dwarf_regnum_for_perf_regnum_s390(perf_regnum);
217+
break;
215218
case EM_LOONGARCH:
216219
reg = __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum);
217220
break;

tools/perf/util/include/dwarf-regs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int flags)
112112
int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum);
113113
int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum);
114114
int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum);
115+
int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum);
115116

116117
/*
117118
* get_dwarf_regnum - Returns DWARF regnum from register name

tools/perf/util/unwind-libdw-arch/Build

Lines changed: 0 additions & 1 deletion
This file was deleted.

tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c

Lines changed: 0 additions & 65 deletions
This file was deleted.

tools/perf/util/unwind-libdw.c

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwarf_Addr addr, Dwarf_Word *
226226
return true;
227227
}
228228

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)
230230
{
231231
struct unwind_info *ui = arg;
232232
struct regs_dump *user_regs = perf_sample__user_regs(ui->sample);
@@ -279,29 +279,12 @@ static bool libdw_set_initial_registers_generic(Dwfl_Thread *thread, void *arg)
279279
return ret;
280280
}
281281

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 = {
290283
.next_thread = next_thread,
291284
.memory_read = memory_read,
292-
.set_initial_registers = libdw_set_initial_registers_generic,
285+
.set_initial_registers = libdw_set_initial_registers,
293286
};
294287

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-
305288
static int
306289
frame_callback(Dwfl_Frame *state, void *arg)
307290
{
@@ -349,10 +332,8 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
349332
.e_machine = e_machine,
350333
.best_effort = best_effort
351334
};
352-
const char *arch = perf_env__arch(machine->env);
353335
Dwarf_Word ip;
354336
int err = -EINVAL, i;
355-
const Dwfl_Thread_Callbacks *callbacks;
356337

357338
if (!data->user_regs || !data->user_regs->regs)
358339
return -EINVAL;
@@ -375,11 +356,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
375356
if (err)
376357
goto out;
377358

378-
callbacks = get_thread_callbacks(arch);
379-
if (!callbacks)
380-
goto out;
381-
382-
err = !dwfl_attach_state(ui->dwfl, /*elf=*/NULL, thread__tid(thread), callbacks, ui);
359+
err = !dwfl_attach_state(ui->dwfl, /*elf=*/NULL, thread__tid(thread), &callbacks, ui);
383360
if (err)
384361
goto out;
385362

tools/perf/util/unwind-libdw.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ struct perf_sample;
1010
struct thread;
1111

1212
bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg);
13-
bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg);
1413

1514
struct unwind_info {
1615
Dwfl *dwfl;

0 commit comments

Comments
 (0)