From nobody Sun Feb 8 22:06:34 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8977E32F75A for ; Sat, 17 Jan 2026 05:29:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627798; cv=none; b=E6LwP+08Cjyzi6jr8EUf3FEtIZR2fqD3nVKmrKZyJvA/cRqsFA38eD92u8DxDVL80WL3SKQnnlXE9uZHWJ7hUygAuUVq2v7STRswfyUzS4VFGLKZnxO2WgiKfZhFz8R8RbBXNTVTgR1waXnJA5hdOzobZGS7g2fQm7iqbzIQFAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627798; c=relaxed/simple; bh=BndAyPy+UuQw35OI1r1v6VocafXtrLbU/myQm8PBEEQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=JHvsVS/kutOAwq+Ih7y/KHiOI9iYeGMcRljL+V4MCJm+Evq8dN053785qVdqlJByGgw99NqdBtwRE9ZacWVz0Z9dBy/8OCzVXz3W8uWRcTlqzeKtYD/yDbPLnPmvlQtsbK7Mx5lzQrsOEx2tL7rcg9RACgJ3OY60qkr20zs9P5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gkb8R172; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gkb8R172" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-1219f27037fso2973013c88.1 for ; Fri, 16 Jan 2026 21:29:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627795; x=1769232595; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=CCYe3hHM7B67Bwgfqfhfq46zBLS+3DmzwV+DSyW0kMs=; b=gkb8R1724Kep7Vtwr/s2FggrCfe6LT3bSmUtucWLQQEo6zHJXwaYULE3p+EFyqIEJz IUXqU6HCB7vAPAC8G0IzE2S307UM4PFRvqH2VM/yL9p00t6GnHh5KX7s+mv+oVqnBjnY KCP4HhQtAK5ijLdAFxpx6fCi8Hrstj6Cvu5loGibNtvLfDEtRXqUEwRHRPTBOoume5eE 83by83tCpg/tkFj7c55izJVIb05I1gYNY6lu20Kv0H7Gdq2FhewAsC8vOihoHT2VE/Gz Uno2yKrHpcYmaiNep/PU1fjd6mV1ZjAsxmxaNA9FCRsxdGlIXQLoIRRZAbD+XuGKAwww m6sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627795; x=1769232595; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CCYe3hHM7B67Bwgfqfhfq46zBLS+3DmzwV+DSyW0kMs=; b=bvXZINTp4oLaMjE5YPV1mw+Q1h4KqB+SY5YaNv7+lABASBbg/1QaPwJAATx5UTlkNC QG6CgbP4p0o/vdeXy7D+JHHq8yKPD7ZOfXZeg5NnjPsQOd0qeW1GYh619s/4SF2L5uRB JUhwV5ZR1oS3YytAw+7J2nRl7qp0Fe9yxeFZF3bziDm73BBK/jEWmQ8id+Fy8DAFuNIi yaffBY3kQ/x6EZw/VIJ+mWSEt4Z+VYaM27A1WySEXVYTFm4SFBEE14Y3JiCbOQ1slKr+ ninNsb95jOfQEuLDZ1tFyag/AeT3ZxgwchfMHHGeDL3QqoQkrSCL3uG+e1aLpIlXMygx Kn0Q== X-Forwarded-Encrypted: i=1; AJvYcCX4QojvIZNxjXK0iwXz530KIHXRvGV9dvW2PZSgbscX+4QkOIwnv2qdLpOroLOnI8QAGNfANLLIDDOvIQc=@vger.kernel.org X-Gm-Message-State: AOJu0YxRpr3GGr24tYLkie3e0BvD3RTM7agK6SSIKIZecLc6beq6tbjJ F5iSO0lyn2kNvJcIcjmvTG7tVAz7+NvJpVEu99dqj1+UT/iDh36CkaEP2i8b0eHY3iVCONTIupo h29+j9d24pQ== X-Received: from dlbvv6.prod.google.com ([2002:a05:7022:5f06:b0:11b:1a9a:d2e8]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:2387:b0:11b:c1ab:bdd4 with SMTP id a92af1059eb24-1244a74fe9amr4162959c88.38.1768627794473; Fri, 16 Jan 2026 21:29:54 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:45 -0800 In-Reply-To: <20260117052849.2205545-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260117052849.2205545-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.457.g6b5491de43-goog Message-ID: <20260117052849.2205545-20-irogers@google.com> Subject: [PATCH v1 19/23] perf dwarf-regs: Add S390 perf to dwarf register number mapping functions From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Leo Yan , Guo Ren , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Athira Rajeev , Stephen Brennan , Howard Chu , Thomas Falcon , Andi Kleen , "Dr. David Alan Gilbert" , Dmitry Vyukov , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Chun-Tse Shao , Aditya Bodkhe , Haibo Xu , Sergei Trofimovich , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, linux-riscv@lists.infradead.org, Mark Wielaard Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- tools/perf/util/dwarf-regs-arch/Build | 1 + .../util/dwarf-regs-arch/dwarf-regs-s390.c | 53 +++++++++++++++ tools/perf/util/dwarf-regs.c | 3 + tools/perf/util/include/dwarf-regs.h | 1 + tools/perf/util/unwind-libdw-arch/Build | 1 - .../unwind-libdw-arch/unwind-libdw-s390.c | 65 ------------------- tools/perf/util/unwind-libdw.c | 31 ++------- tools/perf/util/unwind-libdw.h | 1 - 8 files changed, 62 insertions(+), 94 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-s390.c delete mode 100644 tools/perf/util/unwind-libdw-arch/Build delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build index 94e4dfceb4d1..10c2af3d933a 100644 --- a/tools/perf/util/dwarf-regs-arch/Build +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -4,4 +4,5 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-csky.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-loongarch.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-powerpc.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-riscv.o +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-s390.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-x86.o diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-s390.c b/tools/perf= /util/dwarf-regs-arch/dwarf-regs-s390.c new file mode 100644 index 000000000000..310a37451bdc --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-s390.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/s390/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum) +{ + static const int dwarf_s390_regnums[] =3D { + [PERF_REG_S390_R0] =3D 0, + [PERF_REG_S390_R1] =3D 1, + [PERF_REG_S390_R2] =3D 2, + [PERF_REG_S390_R3] =3D 3, + [PERF_REG_S390_R4] =3D 4, + [PERF_REG_S390_R5] =3D 5, + [PERF_REG_S390_R6] =3D 6, + [PERF_REG_S390_R7] =3D 7, + [PERF_REG_S390_R8] =3D 8, + [PERF_REG_S390_R9] =3D 9, + [PERF_REG_S390_R10] =3D 10, + [PERF_REG_S390_R11] =3D 11, + [PERF_REG_S390_R12] =3D 12, + [PERF_REG_S390_R13] =3D 13, + [PERF_REG_S390_R14] =3D 14, + [PERF_REG_S390_R15] =3D 15, + [PERF_REG_S390_FP0] =3D 16, + [PERF_REG_S390_FP1] =3D 20, + [PERF_REG_S390_FP2] =3D 17, + [PERF_REG_S390_FP3] =3D 21, + [PERF_REG_S390_FP4] =3D 18, + [PERF_REG_S390_FP5] =3D 22, + [PERF_REG_S390_FP6] =3D 19, + [PERF_REG_S390_FP7] =3D 23, + [PERF_REG_S390_FP8] =3D 24, + [PERF_REG_S390_FP9] =3D 28, + [PERF_REG_S390_FP10] =3D 25, + [PERF_REG_S390_FP11] =3D 29, + [PERF_REG_S390_FP12] =3D 26, + [PERF_REG_S390_FP13] =3D 30, + [PERF_REG_S390_FP14] =3D 27, + [PERF_REG_S390_FP15] =3D 31, + [PERF_REG_S390_MASK] =3D 64, + [PERF_REG_S390_PC] =3D 65, + }; + + if (perf_regnum =3D=3D 0) + return 0; + + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_s390_regnums)= || + dwarf_s390_regnums[perf_regnum] =3D=3D 0) + return -ENOENT; + + return dwarf_s390_regnums[perf_regnum]; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 137568e15018..f86f76547592 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -212,6 +212,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, u= nsigned int machine, case EM_RISCV: reg =3D __get_dwarf_regnum_for_perf_regnum_riscv(perf_regnum); break; + case EM_S390: + reg =3D __get_dwarf_regnum_for_perf_regnum_s390(perf_regnum); + break; case EM_LOONGARCH: reg =3D __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum); break; diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index ae76608da110..b95cf2d7b5b3 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -112,6 +112,7 @@ int __get_dwarf_regnum_for_perf_regnum_csky(int perf_re= gnum, unsigned int flags) int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum); int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum); int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum); +int __get_dwarf_regnum_for_perf_regnum_s390(int perf_regnum); =20 /* * get_dwarf_regnum - Returns DWARF regnum from register name diff --git a/tools/perf/util/unwind-libdw-arch/Build b/tools/perf/util/unwi= nd-libdw-arch/Build deleted file mode 100644 index 6d6e319e1201..000000000000 --- a/tools/perf/util/unwind-libdw-arch/Build +++ /dev/null @@ -1 +0,0 @@ -perf-util-y +=3D unwind-libdw-s390.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c b/tools/= perf/util/unwind-libdw-arch/unwind-libdw-s390.c deleted file mode 100644 index 1e05e9d9d95f..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/event.h" -#include "util/sample.h" -#include "../arch/s390/include/dwarf-regs-table.h" -#include "../arch/s390/include/uapi/asm/perf_regs.h" - - -bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg) -{ - struct unwind_info *ui =3D arg; - struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); - Dwarf_Word dwarf_regs[ARRAY_SIZE(s390_dwarf_regs)]; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_S390_##r); \ - val; \ -}) - /* - * For DWARF register mapping details, - * see also perf/arch/s390/include/dwarf-regs-table.h - */ - dwarf_regs[0] =3D REG(R0); - dwarf_regs[1] =3D REG(R1); - dwarf_regs[2] =3D REG(R2); - dwarf_regs[3] =3D REG(R3); - dwarf_regs[4] =3D REG(R4); - dwarf_regs[5] =3D REG(R5); - dwarf_regs[6] =3D REG(R6); - dwarf_regs[7] =3D REG(R7); - dwarf_regs[8] =3D REG(R8); - dwarf_regs[9] =3D REG(R9); - dwarf_regs[10] =3D REG(R10); - dwarf_regs[11] =3D REG(R11); - dwarf_regs[12] =3D REG(R12); - dwarf_regs[13] =3D REG(R13); - dwarf_regs[14] =3D REG(R14); - dwarf_regs[15] =3D REG(R15); - - dwarf_regs[16] =3D REG(FP0); - dwarf_regs[17] =3D REG(FP2); - dwarf_regs[18] =3D REG(FP4); - dwarf_regs[19] =3D REG(FP6); - dwarf_regs[20] =3D REG(FP1); - dwarf_regs[21] =3D REG(FP3); - dwarf_regs[22] =3D REG(FP5); - dwarf_regs[23] =3D REG(FP7); - dwarf_regs[24] =3D REG(FP8); - dwarf_regs[25] =3D REG(FP10); - dwarf_regs[26] =3D REG(FP12); - dwarf_regs[27] =3D REG(FP14); - dwarf_regs[28] =3D REG(FP9); - dwarf_regs[29] =3D REG(FP11); - dwarf_regs[30] =3D REG(FP13); - dwarf_regs[31] =3D REG(FP15); - - dwarf_regs[64] =3D REG(MASK); - dwarf_regs[65] =3D REG(PC); - - dwfl_thread_state_register_pc(thread, dwarf_regs[65]); - return dwfl_thread_state_registers(thread, 0, 32, dwarf_regs); -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index b3c4380d40b6..e0321043af88 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -226,7 +226,7 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwar= f_Addr addr, Dwarf_Word * return true; } =20 -static bool libdw_set_initial_registers_generic(Dwfl_Thread *thread, void = *arg) +static bool libdw_set_initial_registers(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); @@ -279,29 +279,12 @@ static bool libdw_set_initial_registers_generic(Dwfl_= Thread *thread, void *arg) return ret; } =20 -#define DEFINE_DWFL_THREAD_CALLBACKS(arch) \ -static const Dwfl_Thread_Callbacks callbacks_##arch =3D { \ - .next_thread =3D next_thread, \ - .memory_read =3D memory_read, \ - .set_initial_registers =3D libdw_set_initial_registers_##arch, \ -} - -static const Dwfl_Thread_Callbacks callbacks_generic =3D { +static const Dwfl_Thread_Callbacks callbacks =3D { .next_thread =3D next_thread, .memory_read =3D memory_read, - .set_initial_registers =3D libdw_set_initial_registers_generic, + .set_initial_registers =3D libdw_set_initial_registers, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(s390); - -static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) -{ - if (!strcmp(arch, "s390")) - return &callbacks_s390; - - return &callbacks_generic; -} - static int frame_callback(Dwfl_Frame *state, void *arg) { @@ -349,10 +332,8 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *ar= g, .e_machine =3D e_machine, .best_effort =3D best_effort }; - const char *arch =3D perf_env__arch(machine->env); Dwarf_Word ip; int err =3D -EINVAL, i; - const Dwfl_Thread_Callbacks *callbacks; =20 if (!data->user_regs || !data->user_regs->regs) return -EINVAL; @@ -375,11 +356,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *ar= g, if (err) goto out; =20 - callbacks =3D get_thread_callbacks(arch); - if (!callbacks) - goto out; - - err =3D !dwfl_attach_state(ui->dwfl, /*elf=3D*/NULL, thread__tid(thread),= callbacks, ui); + err =3D !dwfl_attach_state(ui->dwfl, /*elf=3D*/NULL, thread__tid(thread),= &callbacks, ui); if (err) goto out; =20 diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 5c23080cb6c1..20d63d881dff 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -10,7 +10,6 @@ struct perf_sample; struct thread; =20 bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); -bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg); =20 struct unwind_info { Dwfl *dwfl; --=20 2.52.0.457.g6b5491de43-goog