From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 AD4BD31A7E1 for ; Sat, 17 Jan 2026 05:29:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627762; cv=none; b=PJ1Xlb4a59g+lFqqZNqoxJDPVRpWPx9gRKtqEtwQoJpVywm9OVn0/owxzub0G1+yODoXbRXvLc4F+em5OQycGN3pb+OLpeJMomIFzB1xPnQo2L7KnjQzoFt0pauvVr6TvQIXibfQagR+eSloA/AsG9RHGRIv5peKLBA4zFobY5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627762; c=relaxed/simple; bh=gbFw65gKDB9Q7CSGbuP34AO5oPVulM2chbHXMkIGkC8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Z4Qs9SPcA1hNxPveKmknNqjkXbSHwATryFoYM+NJrv2imNyU9sK06MZSudRTTyOA4wVCKEA8c9mKpw8xVQYvBb/itxcNAUXJ832CO0f9NDnDVC7KLz2MZk3GrPZ29FA3PedxEuO/uhS9wEW3V3tOJ7d6DVPsFR2IMYO/oMY3q84= 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=H1bGZTB9; arc=none smtp.client-ip=74.125.82.202 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="H1bGZTB9" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6ba50fc34so1156551eec.0 for ; Fri, 16 Jan 2026 21:29:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627761; x=1769232561; 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=7OS8+jcXChzbawXYGLy5k5VOyetH1gbj+eqgOcCR0OU=; b=H1bGZTB9/sYMy7T9/JjX2ZVtV5ZK1u2ryhz88RYKQUHOZRtrLax2Y9p87nXXaXHr9Q 4p8mChrMEdd3RMgx+A80yNCgZtEmGM3Ss6TffX/ltIqUnLhXU3/FWI1daTRwIdQop/v2 lQaw1Oge1f+2n/yAXFG4xep/0YB0IlqiaAOyZ3IJFqoIshZAf+OHbQG1FmKqUrhCtABD 3es8irDPceXBV92FBnF3XWbc8hivatbsjzV2vqFOPh+ec8N4PJcKM1arMtU2I1sbCGDt p4bAbsdX0Bm3nFpWuUr+cb2LnhwmO+sfQgqyPKinzB43TujVWsq92IW/Kw6gdf3j4xOs nenA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627761; x=1769232561; 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=7OS8+jcXChzbawXYGLy5k5VOyetH1gbj+eqgOcCR0OU=; b=iiHJiZcmrnlKt4pK+VxQi6wcmiVvlqgang5sPkidOq1X3qZkvJI1AapJIagChnRFDI ChOoBCUeK5YjDGEU615fwduv9llkMvdQm4RVTtl8QhiAAQzdSMl8/V9m2mKpSCHgmucC dXU+3VqXXm2aQw6GBp1Wiw1J5UcRZhV+KaiLp/H92/XI+eil+T1+4A+Is3e4YHbuf2wS cGjl+AN5stwSHY1pIT+/YH3raQVfX2LUqlsrNnihqK2oIxU8MUepEdtq5c7pnNUeQkVZ 58EOYdr8OKzKhB+2UaEUjl63UE0VY49MdtP6gJBhcHpV3PozTZHHpjqQgDPfc6sTyyCF VgTA== X-Forwarded-Encrypted: i=1; AJvYcCXiHhhtzPFmvDpbNfSXYse9PvZrn5k3avdlQlp7hHwvSDgaxfcrpkcC9AffmcrbDikHM+20UrUUAvxHw6M=@vger.kernel.org X-Gm-Message-State: AOJu0YxJqswdX0PvlVqBsxB6EQQ2oHmy8aa8zbWwmgz924lg3BzFp/H6 Os1HdQ7vrunDrYXXFrh4j83wxv40rTqm6xavlA/UztstCq38Lb7HkhhvyHRBkOiPy4TPtPcMyo5 VMgcDiBdk7w== X-Received: from dlbrh14.prod.google.com ([2002:a05:7022:f30e:b0:11a:44f1:daa3]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:dc04:b0:2ae:5b71:d226 with SMTP id 5a478bee46e88-2b6b3ed9044mr3890490eec.3.1768627760880; Fri, 16 Jan 2026 21:29:20 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:27 -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-2-irogers@google.com> Subject: [PATCH v1 01/23] perf symbol-elf: Fix leak of ELF files with GNU debugdata 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" The processing of DSO_BINARY_TYPE__GNU_DEBUGDATA in symsrc__init happens with an open ELF file but the error path only closes the associate fd. Fix the goto so that the ELF file is also ended and memory released. Fixes: b10f74308e13 ("perf symbol: Support .gnu_debugdata for symbols") Signed-off-by: Ian Rogers --- tools/perf/util/symbol-elf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index b8fea12997a0..76912c62b6a0 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -1173,7 +1173,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, = const char *name, Elf *embedded =3D read_gnu_debugdata(dso, elf, name, &new_fd); =20 if (!embedded) - goto out_close; + goto out_elf_end; =20 elf_end(elf); close(fd); --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 682A8328B56 for ; Sat, 17 Jan 2026 05:29:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627764; cv=none; b=lTmuc05VnjsvfAn0x3CSMgw9p/jUgefCYKyuyOsfWadbg0TUAtdCdSiZzdvWzpL9k8YIXJ4EAV6LVYqC9N+WdahVHE8maa0nW7GZo90PCHjlhZzXBqmoZfCJzOXgZDXQ5sOM/kFp0nb9a8Juk3yGCuhWnKO0yUcvWbtq41iq1KI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627764; c=relaxed/simple; bh=72XsDyD4QhqC99XxL2NKKPs+ap/5CJLt+GafEN9+hzM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=MYyhSpbG2EpjPkUB16V8/04b0R/RlYMDgXYsy3P7xWnxKFtfz18+1uEheAsbH8jY4/KeMWGYMRCT/ZJiH2oayAG7Sf8ZvC+neguLWd830uS8Ok8yi2iQsU/vBtsDqBcwZsgX6LDAxWVmQgVrcblnRhLlQGW+FctJ4bhk6QIt0kI= 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=NrP1sPFD; arc=none smtp.client-ip=209.85.214.201 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="NrP1sPFD" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-29f1f69eec6so26790535ad.1 for ; Fri, 16 Jan 2026 21:29:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627763; x=1769232563; 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=kK4WpTbjYTQ30LMox0FYXGUlgDkXshdRvemGVnSiQqs=; b=NrP1sPFDNLf8KZljOW9peOaBCL26dkr3UexLZGDlM5v/SCNryFX0Ln6RwyanHUGseZ FVBqBlH7JhuEOcx3iWbJC/PjfcrcOhtWU90ySb9TX9VbRenu+Wdk/Cx/yK9iIAHkWa66 9viRN/QQn7yUIg1mJYoPkTtzVW6EHNWxjYmg2ORJFPPr6VW8iXndD3h9hZTNEzsjKHTt k3OInXqXQx5Tbt8J0UenspACFM32zTMgn300I6i+GKZPTNowK+iKDgeX4bK42fGgeGqK FGqE0qoBzMu5pifiaJB8hckFTs1/ZmhY/pzBan5duZGRr7Wd5YSjbTggtfXRxKnQQ8IJ PYxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627763; x=1769232563; 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=kK4WpTbjYTQ30LMox0FYXGUlgDkXshdRvemGVnSiQqs=; b=t/S3W0OtZZ7ig4cMF1IvU5LjuXATQakhvmJtWNOTGIAc5l0gjatdoiTXR47vaKreMK PJ1WmPRCHcMOXm5fMbBkngq2WYEHwXnqF3SoweENvcGLnBaAKxU4QQbY5t2nxseSKZ7/ app2rRIDmwKglnqUnAZqL6IkqBguFxs+dDmwXmjUju3zUsOqBrRgxExYnrYwRdHLTPTN vITAq8a7joI405+drOizYZkgNazE80j501NqZ4iSCuTjpTNFTAHkKK+S9zsVBIvutsJQ y9l02hzbnJOKywEa3o3Lfg5rXpXeC7CCK+TpUSBlb61p/ZTwFOADtdjXQmo2UBfn3yCv Wj5A== X-Forwarded-Encrypted: i=1; AJvYcCWYdpfnd0yRO0ekkOnqhjf1ABolEI+hxK3aOwuO+Pq7aCv9PGeVAsV4L1bkp8VMxcZQd8RTTPBvtjtkl4E=@vger.kernel.org X-Gm-Message-State: AOJu0YyDzYSFnT43Y8oaenMQzEftr0ZS/ED0pMhIkItOKybS9OCtP5S4 nqWASCdFZnwInetCdGrLMZ+ADP7Fgw1N4K07CDyqkAkNT6d13fX1h8izMmzn17lpOmM4m6GpRfg fj0EjDKEt4Q== X-Received: from plov5.prod.google.com ([2002:a17:902:8d85:b0:29d:7778:2d65]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2f8a:b0:2a2:f0cb:dfa2 with SMTP id d9443c01a7336-2a71754509fmr50340175ad.13.1768627762755; Fri, 16 Jan 2026 21:29:22 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:28 -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-3-irogers@google.com> Subject: [PATCH v1 02/23] perf dso: Extra validity checks that e_machine is valid 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" Better ensure a read e_machine is valid by checking the file appears like an ELF file and the read e_machine value is less than EM_NUM. This better avoids spurious e_machine values when looking for an e_machine in say a thread. Signed-off-by: Ian Rogers --- tools/perf/util/dso.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 18e656712f5a..143720d1ecb1 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -1236,17 +1236,28 @@ uint16_t dso__e_machine(struct dso *dso, struct mac= hine *machine) try_to_open_dso(dso, machine); fd =3D dso__data(dso)->fd; if (fd >=3D 0) { - _Static_assert(offsetof(Elf32_Ehdr, e_machine) =3D=3D 18, "Unexpected of= fset"); - _Static_assert(offsetof(Elf64_Ehdr, e_machine) =3D=3D 18, "Unexpected of= fset"); - if (dso__needs_swap(dso) =3D=3D DSO_SWAP__UNSET) { - unsigned char eidata; - - if (pread(fd, &eidata, sizeof(eidata), EI_DATA) =3D=3D sizeof(eidata)) - dso__swap_init(dso, eidata); + unsigned char e_ident[EI_NIDENT]; + + _Static_assert(offsetof(Elf32_Ehdr, e_ident) =3D=3D 0, "Unexpected offse= t"); + _Static_assert(offsetof(Elf64_Ehdr, e_ident) =3D=3D 0, "Unexpected offse= t"); + if (pread(fd, &e_ident, sizeof(e_ident), 0) =3D=3D sizeof(e_ident) && + memcmp(e_ident, ELFMAG, SELFMAG) =3D=3D 0 && + e_ident[EI_CLASS] > ELFCLASSNONE && e_ident[EI_CLASS] < ELFCLASSNUM = && + e_ident[EI_DATA] > ELFDATANONE && e_ident[EI_DATA] < ELFDATANUM && + e_ident[EI_VERSION] =3D=3D EV_CURRENT) { + _Static_assert(offsetof(Elf32_Ehdr, e_machine) =3D=3D 18, "Unexpected o= ffset"); + _Static_assert(offsetof(Elf64_Ehdr, e_machine) =3D=3D 18, "Unexpected o= ffset"); + + if (dso__needs_swap(dso) =3D=3D DSO_SWAP__UNSET) + dso__swap_init(dso, e_ident[EI_DATA]); + + if (dso__needs_swap(dso) !=3D DSO_SWAP__UNSET && + pread(fd, &e_machine, sizeof(e_machine), 18) =3D=3D sizeof(e_machin= e) && + e_machine < EM_NUM) + e_machine =3D DSO__SWAP(dso, uint16_t, e_machine); + else + e_machine =3D EM_NONE; } - if (dso__needs_swap(dso) !=3D DSO_SWAP__UNSET && - pread(fd, &e_machine, sizeof(e_machine), 18) =3D=3D sizeof(e_machine= )) - e_machine =3D DSO__SWAP(dso, uint16_t, e_machine); } mutex_unlock(dso__data_open_lock()); return e_machine; --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 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 5BCC7329387 for ; Sat, 17 Jan 2026 05:29:25 +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=1768627766; cv=none; b=orvtWYR6lA9tXco0YdOc1lgTzndrG91yiU83jS5AAjjaETlvhs8WgpXVROo2QR6RRFK8GtGvLvIUIs+gqNKmAPCagv8gAWkLBYfuZOSDUcwMhLoYlLZrwS4QaWT6lwupQKOLdSpilhLtaN5ixJ98JG0CB33xYAcBhW9W0j3UHWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627766; c=relaxed/simple; bh=PGz82t4fQNpiLxXfLez2T61xsRU+uyF68xd2aHc7TqQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=sG4996XCjoqG/HaPB9Stqv5zWM4x5QTqRhJGYUg3y7IPL8WrJOgH1Sao/c9oj5dxl4/LZ9D6BkO7rMxj6ItkDLMEMVnfUbuE+A75Ja+8jmnbXwznZauvz/jqBGtAVtDFGI+zezPN4h9c4rCv0btTksyULzIenMEfKLRWMTR2B/U= 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=DkRIwb5U; 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="DkRIwb5U" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-12338d13f2cso2907969c88.1 for ; Fri, 16 Jan 2026 21:29:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627764; x=1769232564; 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=Mz2w6bSYQtg03VDKQBBKJWoE2q+Ly0vxb+x/N3KKFNE=; b=DkRIwb5UjoEgoZv4NZCZiN6BN7sOzD1WNS55dwOlCuZCvt0sZKUnnb3aT8BuLALnMm EGA8022IVgxkp4ZPAT9vioBEwrDfF1IF/VZq0aIo83ftIHBQ2oJw3lhyQKBzZJ+SWNPZ ETwiCdE+qiHLku1uIX5y/8ecYMxiJIYwZcwi8i4vgW6fuuVueRcR08lMq9IWmN2xDBSC xU6CNCEgcQyUk55WwNYfDv4Fb+SXfNvvGgZp8V2Ucmoxg7Te65is4FD/VDCTR15u4S1K EpHNp4zXUUeYzk21JCsRqNuNyRVwFUIovCrqH/xqQ0+RD0/iJFNWQssk0YrmcgwHAH4s ESdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627764; x=1769232564; 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=Mz2w6bSYQtg03VDKQBBKJWoE2q+Ly0vxb+x/N3KKFNE=; b=HASlfRBR9yPSkzadnf/JJcGh5XN0879rI+IrPXF4CPe8mqdD+vlXSgtT/3tZfDES4f 7jJzsiCfvnJLvfjCv41g/vfN+os5qXbEfuCU8w1OkKEmfaTBdBqgllnMxhyEOZ3yIrLU BFhuSqIfCeg68YmbFygZPslkIQPEjgE8JIB/PXySBbH9gXDVNsmCrO19Tnt1BVZrfl++ nLhpvSvKLoz8kClL6W6vKwB+lXuq1NJjz4MG4kYxS/yZfGqu84yIB/GtXD68+oZBex/O EaSp5N7H5ycYMnX/UIq97TGrjfVJb52LldC3C/39JuUKWD7oHGf/Xd642y6WwOuTSe4O o7Nw== X-Forwarded-Encrypted: i=1; AJvYcCWzd1s3WApBRS4twR3xfdDOrl/HYERAUIrnEvsTIuBq0tc2Md8WuD3IWBm1OiyzcyoeyzCAsSi6CpkkanU=@vger.kernel.org X-Gm-Message-State: AOJu0YwUZy4E0QMRRHHVTvWS5/fPdA4k3sDq53wLmf1xMlBgcIbQjZ+f k4hLVPOcS32kIzShzcQgujz4nCLAVZS+bSoxBVBQNv3au06jvHkRr6F4h1EQJXEEkPLShIvl3Yd +z0jbBFOgjw== X-Received: from dlad13.prod.google.com ([2002:a05:701b:220d:b0:11f:330d:ed15]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:1e01:b0:123:2d38:928e with SMTP id a92af1059eb24-1244b36d491mr3478584c88.35.1768627764374; Fri, 16 Jan 2026 21:29:24 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:29 -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-4-irogers@google.com> Subject: [PATCH v1 03/23] perf record: Disable inline frames when marking build IDs 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" Marking DSOs doesn't need inline frames traversing as the inline frames are all part of the same DSO. Disable to improve performance and also to avoid potential issues with dwarf information. Signed-off-by: Ian Rogers --- tools/perf/builtin-record.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 003e47a4fc1d..663ca3a03396 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1509,6 +1509,8 @@ static int process_buildids(struct record *rec) if (perf_data__size(&rec->data) =3D=3D 0) return 0; =20 + /* A single DSO is needed and not all inline frames. */ + symbol_conf.inline_name =3D false; /* * During this process, it'll load kernel map and replace the * dso->long_name to a real pathname it found. In this case @@ -1519,7 +1521,6 @@ static int process_buildids(struct record *rec) * $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551 */ symbol_conf.ignore_vmlinux_buildid =3D true; - /* * If --buildid-all is given, it marks all DSO regardless of hits, * so no need to process samples. But if timestamp_boundary is enabled, --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 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 D5DA0329C69 for ; Sat, 17 Jan 2026 05:29:26 +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=1768627768; cv=none; b=jfUSnrZZrao5z0JBTqWI+NICoD6SPWxdCekJ10AFOOO/HL2QNbZNkFe3WeKQWhNFq3WX8Bxbdpx9iBjNhYuVWjwfIdtDwvDaKw7SIGw7bZju1JKobsnJw1IGzUGb1iohIEzmHQIzTXfYv9kpCf/hrFxnmFFZ3K3FIk6bk98x2jc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627768; c=relaxed/simple; bh=+lBL3y5aUQ0OFpHafyMAfC6ZjE4f85NZcBC1XEGvCsE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=QAvsS+q63dvmDAfK77Musiy3PhGktek7CHpgo7Tcorxw2qzEL6idYSx6PZi7v6BEIip2brF/sD2ZdKI5WdVdO655KWfjb8Wl0grFinWLYuOqcnmqcbBipYQOwj8vJDe6M7K49G9/Kb8pSL4t/ckgP57O6JjMSEzgjsyTfTY7rnk= 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=s0NxHNFR; 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="s0NxHNFR" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-12339e20a86so3004627c88.0 for ; Fri, 16 Jan 2026 21:29:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627766; x=1769232566; 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=MZjg+n5nlIC/IwIAdkKt39V0NfSI0pSDMH1g5ht+Ccc=; b=s0NxHNFRGSikzPBGpKaTB6Zv4iGmSGj+yTABAm5Z7Gw1A5nXXhyHTND0ffUq5qKyJb kuxCeERibI05tiGESa4mh4hXSZiloyR1iVjLQSMyptpYE/0W7uwvjHi+S0fmjBq6SX3l RsihXsv0AYCk/eAsgg7Cf2MjMB/8QK9TwVufkM0J2E2R+U7mxyOTx3YRq7Ssk9FHqpuz 70vU8dWV2YJtOwNMi6xD8HYLehilETBb862aR8S2yDpXtsNzxq7nZwmOmex0Cg6cmn2l F1UwCa9wVaFXdAG7YJmEwV1uJ9gu7fdjYvPvBxhR+QDtkzYHm6TrcSE1aExn1IX6veFp zFPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627766; x=1769232566; 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=MZjg+n5nlIC/IwIAdkKt39V0NfSI0pSDMH1g5ht+Ccc=; b=BLC337EcMB0734EIRFMPNGCdFgfHahwT6CKiDBvzwtyRhHMOU4YluEWm8CKyWYRM7n 7Spn3eGBoheCqtrUS21IhbOcGytYoPbPwWIrxlkjEUtq9sGiUz4uZmQPPTtNQH0Wr84H 86Bv2pn2DHfFC4mLf/AbEq2ny8qTW3x9qEVusOEz4teP51hQI081JnwyyFCqPwYqqQso gIC0QxXp2+Jui9fJ6u3TvAjDbFdGUuCSd0GaIjDv3eBGCnbR+KHA23DtEEaGxnDXWW3V UGsXa4Qw5G4vFve6q6FyHszr5A84jbZPaUgUGAjR1iW2GckItftISiDOs9vvzjudCWH9 FAug== X-Forwarded-Encrypted: i=1; AJvYcCX7+tNmesiarJVBZc7n4mdIn48fKJlBWwGkeMqI/dUXOd63t/hoauOSfYuhDp7Qu+iCgPOv8LlMz6ygun8=@vger.kernel.org X-Gm-Message-State: AOJu0YxxYcGBgXbiBuAZGvGlpoZIRiLGsyDcHQSHV1N3O+T6DIPLlJir 9CQtMd43Kqtjrfdzf+m9WXVPJF51ypkf0/BJpaLhQWM8uwnj6q80I9wSCbfB+9wK57x+jYPf/+T 4adcSHQMSmw== X-Received: from dlbsj11.prod.google.com ([2002:a05:7022:f90b:b0:123:3368:7a90]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:2482:b0:11b:b3a1:713c with SMTP id a92af1059eb24-1244a6cf5e1mr4159526c88.9.1768627766004; Fri, 16 Jan 2026 21:29:26 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:30 -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-5-irogers@google.com> Subject: [PATCH v1 04/23] perf unwind-libdw: fix a cross-arch unwinding bug 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" From: Shimin Guo The set_initial_registers field of Dwfl_Thread_Callbacks needs to be set according to the arch of the stack samples being analyzed, not the arch that perf itself is built for. Currently perf fails to unwind stack samples collected from archs different from that of the host perf is running on. This patch moves the arch-specific implementations of set_initial_registers from tools/perf/arch to tools/perf/utli/unwind-libdw-arch, similar to the way the perf-regs-arch folder contains arch-specific functions related to registers, and chooses the implementation based on the arch of the data being processed. Signed-off-by: Shimin Guo Reviewed-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/arch/arm/util/Build | 1 - tools/perf/arch/arm64/util/Build | 1 - tools/perf/arch/csky/util/Build | 2 - tools/perf/arch/powerpc/util/Build | 1 - tools/perf/arch/riscv/util/Build | 1 - tools/perf/arch/s390/util/Build | 2 - tools/perf/arch/x86/util/Build | 1 - tools/perf/util/Build | 1 + tools/perf/util/unwind-libdw-arch/Build | 8 +++ .../unwind-libdw-arch/unwind-libdw-arm.c} | 10 ++-- .../unwind-libdw-arch/unwind-libdw-arm64.c} | 10 ++-- .../unwind-libdw-arch/unwind-libdw-csky.c} | 10 ++-- .../unwind-libdw-loongarch.c} | 10 ++-- .../unwind-libdw-arch/unwind-libdw-powerpc.c} | 10 ++-- .../unwind-libdw-arch/unwind-libdw-riscv.c} | 10 ++-- .../unwind-libdw-arch/unwind-libdw-s390.c} | 14 ++--- .../unwind-libdw-arch/unwind-libdw-x86.c} | 8 +-- tools/perf/util/unwind-libdw.c | 51 ++++++++++++++++--- tools/perf/util/unwind-libdw.h | 10 +++- 19 files changed, 104 insertions(+), 57 deletions(-) create mode 100644 tools/perf/util/unwind-libdw-arch/Build rename tools/perf/{arch/arm/util/unwind-libdw.c =3D> util/unwind-libdw-arc= h/unwind-libdw-arm.c} (80%) rename tools/perf/{arch/arm64/util/unwind-libdw.c =3D> util/unwind-libdw-a= rch/unwind-libdw-arm64.c} (87%) rename tools/perf/{arch/csky/util/unwind-libdw.c =3D> util/unwind-libdw-ar= ch/unwind-libdw-csky.c} (90%) rename tools/perf/{arch/loongarch/util/unwind-libdw.c =3D> util/unwind-lib= dw-arch/unwind-libdw-loongarch.c} (86%) rename tools/perf/{arch/powerpc/util/unwind-libdw.c =3D> util/unwind-libdw= -arch/unwind-libdw-powerpc.c} (89%) rename tools/perf/{arch/riscv/util/unwind-libdw.c =3D> util/unwind-libdw-a= rch/unwind-libdw-riscv.c} (87%) rename tools/perf/{arch/s390/util/unwind-libdw.c =3D> util/unwind-libdw-ar= ch/unwind-libdw-s390.c} (84%) rename tools/perf/{arch/x86/util/unwind-libdw.c =3D> util/unwind-libdw-arc= h/unwind-libdw-x86.c} (87%) diff --git a/tools/perf/arch/arm/util/Build b/tools/perf/arch/arm/util/Build index fd695e1fdaee..3291f893b943 100644 --- a/tools/perf/arch/arm/util/Build +++ b/tools/perf/arch/arm/util/Build @@ -1,6 +1,5 @@ perf-util-y +=3D perf_regs.o =20 perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind.o -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o =20 perf-util-y +=3D pmu.o auxtrace.o cs-etm.o diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/= Build index d63881081d2e..0177af19cc00 100644 --- a/tools/perf/arch/arm64/util/Build +++ b/tools/perf/arch/arm64/util/Build @@ -1,4 +1,3 @@ -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind.o perf-util-y +=3D ../../arm/util/auxtrace.o diff --git a/tools/perf/arch/csky/util/Build b/tools/perf/arch/csky/util/Bu= ild index 5e6ea82c4202..6b2d0e021b11 100644 --- a/tools/perf/arch/csky/util/Build +++ b/tools/perf/arch/csky/util/Build @@ -1,3 +1 @@ perf-util-y +=3D perf_regs.o - -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/u= til/Build index 3d0d5427aef7..5fd28ec713a4 100644 --- a/tools/perf/arch/powerpc/util/Build +++ b/tools/perf/arch/powerpc/util/Build @@ -9,5 +9,4 @@ perf-util-y +=3D evsel.o perf-util-$(CONFIG_LIBDW) +=3D skip-callchain-idx.o =20 perf-util-$(CONFIG_LIBUNWIND) +=3D unwind-libunwind.o -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o perf-util-y +=3D auxtrace.o diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/= Build index 58a672246024..628b9ebd418b 100644 --- a/tools/perf/arch/riscv/util/Build +++ b/tools/perf/arch/riscv/util/Build @@ -2,4 +2,3 @@ perf-util-y +=3D perf_regs.o perf-util-y +=3D header.o =20 perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Bu= ild index c64eb18dbdae..5391d26fedd4 100644 --- a/tools/perf/arch/s390/util/Build +++ b/tools/perf/arch/s390/util/Build @@ -2,8 +2,6 @@ perf-util-y +=3D header.o perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-y +=3D perf_regs.o =20 -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o - perf-util-y +=3D machine.o perf-util-y +=3D pmu.o =20 diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build index c0dc5965f362..fad256252bb9 100644 --- a/tools/perf/arch/x86/util/Build +++ b/tools/perf/arch/x86/util/Build @@ -12,7 +12,6 @@ perf-util-y +=3D evsel.o perf-util-y +=3D iostat.o =20 perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind.o -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o =20 perf-util-y +=3D auxtrace.o perf-util-y +=3D archinsn.o diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 4915f237ba9e..5efec73be474 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -227,6 +227,7 @@ perf-util-$(CONFIG_LIBDW) +=3D annotate-data.o perf-util-$(CONFIG_LIBDW) +=3D libdw.o =20 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o +perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw-arch/ perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind-local.o perf-util-$(CONFIG_LIBUNWIND) +=3D unwind-libunwind.o perf-util-$(CONFIG_LIBUNWIND_X86) +=3D libunwind/x86_32.o diff --git a/tools/perf/util/unwind-libdw-arch/Build b/tools/perf/util/unwi= nd-libdw-arch/Build new file mode 100644 index 000000000000..ef17a83a7813 --- /dev/null +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -0,0 +1,8 @@ +perf-util-y +=3D unwind-libdw-x86.o +perf-util-y +=3D unwind-libdw-arm.o +perf-util-y +=3D unwind-libdw-arm64.o +perf-util-y +=3D unwind-libdw-csky.o +perf-util-y +=3D unwind-libdw-loongarch.o +perf-util-y +=3D unwind-libdw-powerpc.o +perf-util-y +=3D unwind-libdw-riscv.o +perf-util-y +=3D unwind-libdw-s390.o diff --git a/tools/perf/arch/arm/util/unwind-libdw.c b/tools/perf/util/unwi= nd-libdw-arch/unwind-libdw-arm.c similarity index 80% rename from tools/perf/arch/arm/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-arm.c index fbb643f224ec..56e9b5975bcc 100644 --- a/tools/perf/arch/arm/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm.c @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #include -#include "perf_regs.h" -#include "../../../util/unwind-libdw.h" -#include "../../../util/perf_regs.h" -#include "../../../util/sample.h" +#include "../arch/arm/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_arm(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/util/un= wind-libdw-arch/unwind-libdw-arm64.c similarity index 87% rename from tools/perf/arch/arm64/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-arm64.c index b89b0a7e5ad9..29b6833e036c 100644 --- a/tools/perf/arch/arm64/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm64.c @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #include -#include "perf_regs.h" -#include "../../../util/unwind-libdw.h" -#include "../../../util/perf_regs.h" -#include "../../../util/sample.h" +#include "../arch/arm64/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_arm64(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/csky/util/unwind-libdw.c b/tools/perf/util/unw= ind-libdw-arch/unwind-libdw-csky.c similarity index 90% rename from tools/perf/arch/csky/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-csky.c index b20b1569783d..2556d034c32a 100644 --- a/tools/perf/arch/csky/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-csky.c @@ -2,12 +2,12 @@ // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. =20 #include -#include "perf_regs.h" -#include "../../util/unwind-libdw.h" -#include "../../util/perf_regs.h" -#include "../../util/event.h" +#include "../arch/csky/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_csky(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/loongarch/util/unwind-libdw.c b/tools/perf/uti= l/unwind-libdw-arch/unwind-libdw-loongarch.c similarity index 86% rename from tools/perf/arch/loongarch/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-loongarch.c index 60b1144bedd5..5fca673508be 100644 --- a/tools/perf/arch/loongarch/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-loongarch.c @@ -2,12 +2,12 @@ /* Copyright (C) 2020-2023 Loongson Technology Corporation Limited */ =20 #include -#include "perf_regs.h" -#include "../../util/unwind-libdw.h" -#include "../../util/perf_regs.h" -#include "../../util/sample.h" +#include "../arch/loongarch/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_loongarch(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/powerpc/util/unwind-libdw.c b/tools/perf/util/= unwind-libdw-arch/unwind-libdw-powerpc.c similarity index 89% rename from tools/perf/arch/powerpc/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c index 82d0c28ae345..1560db45e7b4 100644 --- a/tools/perf/arch/powerpc/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 #include #include -#include "perf_regs.h" -#include "../../../util/unwind-libdw.h" -#include "../../../util/perf_regs.h" -#include "../../../util/sample.h" +#include "../arch/powerpc/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 /* See backends/ppc_initreg.c and backends/ppc_regs.c in elfutils. */ static const int special_regs[3][2] =3D { @@ -13,7 +13,7 @@ static const int special_regs[3][2] =3D { { 109, PERF_REG_POWERPC_CTR }, }; =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_powerpc(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/riscv/util/unwind-libdw.c b/tools/perf/util/un= wind-libdw-arch/unwind-libdw-riscv.c similarity index 87% rename from tools/perf/arch/riscv/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c index dc1476e16321..c2e2c4b6b2e0 100644 --- a/tools/perf/arch/riscv/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c @@ -2,12 +2,12 @@ /* Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. */ =20 #include -#include "perf_regs.h" -#include "../../util/unwind-libdw.h" -#include "../../util/perf_regs.h" -#include "../../util/sample.h" +#include "../arch/riscv/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" +#include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_riscv(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/arch/s390/util/unwind-libdw.c b/tools/perf/util/unw= ind-libdw-arch/unwind-libdw-s390.c similarity index 84% rename from tools/perf/arch/s390/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c index c27c7a0d1076..1e05e9d9d95f 100644 --- a/tools/perf/arch/s390/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-s390.c @@ -1,14 +1,14 @@ #include #include -#include "../../util/unwind-libdw.h" -#include "../../util/perf_regs.h" -#include "../../util/event.h" -#include "../../util/sample.h" -#include "dwarf-regs-table.h" -#include "perf_regs.h" +#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" =20 =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +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); diff --git a/tools/perf/arch/x86/util/unwind-libdw.c b/tools/perf/util/unwi= nd-libdw-arch/unwind-libdw-x86.c similarity index 87% rename from tools/perf/arch/x86/util/unwind-libdw.c rename to tools/perf/util/unwind-libdw-arch/unwind-libdw-x86.c index 798493e887d7..dd27545a4a68 100644 --- a/tools/perf/arch/x86/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw-arch/unwind-libdw-x86.c @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #include -#include "perf_regs.h" -#include "../../../util/unwind-libdw.h" -#include "../../../util/perf_regs.h" +#include "../arch/x86/include/uapi/asm/perf_regs.h" +#include "util/unwind-libdw.h" +#include "util/perf_regs.h" #include "util/sample.h" =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +bool libdw_set_initial_registers_x86(Dwfl_Thread *thread, void *arg) { struct unwind_info *ui =3D arg; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index 3ff427a49e4c..b2e194a8be39 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -225,11 +225,45 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dw= arf_Addr addr, Dwarf_Word * return true; } =20 -static const Dwfl_Thread_Callbacks callbacks =3D { - .next_thread =3D next_thread, - .memory_read =3D memory_read, - .set_initial_registers =3D libdw__arch_set_initial_registers, -}; +#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, \ +} + +DEFINE_DWFL_THREAD_CALLBACKS(x86); +DEFINE_DWFL_THREAD_CALLBACKS(arm); +DEFINE_DWFL_THREAD_CALLBACKS(arm64); +DEFINE_DWFL_THREAD_CALLBACKS(csky); +DEFINE_DWFL_THREAD_CALLBACKS(loongarch); +DEFINE_DWFL_THREAD_CALLBACKS(powerpc); +DEFINE_DWFL_THREAD_CALLBACKS(riscv); +DEFINE_DWFL_THREAD_CALLBACKS(s390); + +static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) +{ + if (!strcmp(arch, "arm")) + return &callbacks_arm; + else if (!strcmp(arch, "arm64")) + return &callbacks_arm64; + else if (!strcmp(arch, "csky")) + return &callbacks_csky; + else if (!strcmp(arch, "loongarch")) + return &callbacks_loongarch; + else if (!strcmp(arch, "powerpc")) + return &callbacks_powerpc; + else if (!strcmp(arch, "riscv")) + return &callbacks_riscv; + else if (!strcmp(arch, "s390")) + return &callbacks_s390; + else if (!strcmp(arch, "x86")) + return &callbacks_x86; + + pr_err("Fail to get thread callbacks for arch %s, returns NULL\n", + arch); + return NULL; +} =20 static int frame_callback(Dwfl_Frame *state, void *arg) @@ -278,6 +312,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, const char *arch =3D perf_env__arch(ui_buf.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; @@ -300,7 +335,11 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *ar= g, if (err) goto out; =20 - err =3D !dwfl_attach_state(ui->dwfl, EM_NONE, thread__tid(thread), &callb= acks, ui); + callbacks =3D get_thread_callbacks(arch); + if (!callbacks) + goto out; + + err =3D !dwfl_attach_state(ui->dwfl, EM_NONE, thread__tid(thread), callba= cks, ui); if (err) goto out; =20 diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 8c88bc4f2304..574b29848cce 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,7 +9,15 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_x86(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_arm(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_arm64(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_csky(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_loongarch(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_powerpc(Dwfl_Thread *thread, void *arg); +bool libdw_set_initial_registers_riscv(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 From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (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 E04B7328B5D for ; Sat, 17 Jan 2026 05:29:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627770; cv=none; b=J3ab1wKdrRY/LkSUJzop2U6xhOR9OWLKrFtbJlI8Kk+mDd7Z3ngEEDavxAX/h4/wS5NYpb3OLuyWPP82B3LTmQPrIlyOVjUxR+KTy4MpC0x1ANxyAbn16LLGr7f/EWza+6GI+au+Luyx9IgxH9ThCZWbZzdU2pERfc+5wwzOlBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627770; c=relaxed/simple; bh=jfaOMIZp5WWV/XUuIQcu/j8yYwwDPuLLQ0zeJYIZN0I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=WH03gxzykRF44HA1yrQDSp00/9sIZwts+OxKKFwRlvJW4xwStc8RcAsfFWXBs9aqZKZV1mNoDardQOQM+XKU8+ectm9NXJzETGrRtwQuBlPdfawX5KF++5hHilBqo7BwtM8i6p/8ZFw4F38j8Mr/g5XK92fBLuEwW07asXJ+i/s= 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=XbtQeZAD; arc=none smtp.client-ip=74.125.82.201 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="XbtQeZAD" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2ae56205588so4575436eec.1 for ; Fri, 16 Jan 2026 21:29:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627768; x=1769232568; 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=QanJEL0okHblW7w6/vRkxVN/qYTBTTJdOuW3T6wN39U=; b=XbtQeZADhCi34N0wzrefecAMIgbsb8S6mmfSHX/UVUbE+MIakB5VpylKyXzE/yx4Kp F4WKv9bjIqgGnjq1iIB8D5U2pkL4yRIxYbgHU6/EBIPWxcLDKqnmBjANwVNgV83QKP4E 1Ym2j0QP2nrgDaVy6xhW7VIQ1E6PxGBQv8ypYOWIKyXuwNerZxQ49hZ92Vn0w3dqxORS PDH5R9Otflr2FmK99GcxDtik9UL154/+Gsx3dE6B8TseMwksCNKcmEwNtrt7dzpxKsaW zqHapetdZpEznHQMWyA/OdFxK+YvOyO8p+4J8FM9H5y4Q+xP3rT5gSYnt6Z8s2wc8tGJ YHBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627768; x=1769232568; 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=QanJEL0okHblW7w6/vRkxVN/qYTBTTJdOuW3T6wN39U=; b=hrYRMvy0Y2vWMwQMCIOW/XbjsmgT/GrzbKCwLREHNINQIzd/2l6TQ/wn87YS3QUGae 5sP09NeMIpNrsmvEOnIQsb6GJWi9Ey1U6tsLuUm52uS+1OwsXHzyx3gwyZN/6dKD37In arss2W1W32Lm/7Hc0TrQ3ZBoHwW1V5bL0BWMKxw1NXyzUBDnCgR9Yf/XHgR9B59ZlMYs bHDhpn+1WcP83eBvzPrY0VjQFrCGwGIbUKYVeGkTsZTYFwasWUw1sUSDvKqtb8ozktx9 uY0SVj3qgaR2uawvqRISz9ePDceGOXK9jdgEBbRLO6BRZIVpsyTjPkX+SZEOuq3ZW/Vi oUfw== X-Forwarded-Encrypted: i=1; AJvYcCVxkYXlATlmLawD5sbgeOoC9D3UzKGLRybAB999kqM8aCN0XyePBwgeqKo+GF7MJCdDFQMQyoxAL9QD6tg=@vger.kernel.org X-Gm-Message-State: AOJu0YxvpuxDeQuQkhOyyIFaMH0NKTYGwEl6LXA8Xg3BTwkqGNOpahJx /bZ3of3MjAKgXbi0fn6mZwdPAm3THX/5v9YiQlw5QC3sfQA3tEueGabyjH3meyWVyKFCnpCcr0n NGdxNIcl2gA== X-Received: from dlbcq13.prod.google.com ([2002:a05:7022:248d:b0:11d:cf4c:62ab]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:2487:b0:119:e56c:18a8 with SMTP id a92af1059eb24-1244a7257e1mr4331178c88.16.1768627767987; Fri, 16 Jan 2026 21:29:27 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:31 -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-6-irogers@google.com> Subject: [PATCH v1 05/23] perf libdw_addr2line: Fixes to srcline memory allocation 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" Some irregular stack traces are causing double frees and memory leaks. Make the code robust by proactively freeing and being more careful with the memory management of the leaf_srcline. Fixes: 88c51002d06f ("perf addr2line: Add a libdw implementation") Signed-off-by: Ian Rogers --- tools/perf/util/libdw.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/libdw.c b/tools/perf/util/libdw.c index e4bfd52bd172..b96c4e0d728f 100644 --- a/tools/perf/util/libdw.c +++ b/tools/perf/util/libdw.c @@ -42,16 +42,24 @@ static int libdw_a2l_cb(Dwarf_Die *die, void *_args) call_srcline =3D srcline_from_fileline(call_fname, die_get_call_lineno(d= ie)); =20 list_for_each_entry(ilist, &args->node->val, list) { + if (args->leaf_srcline =3D=3D ilist->srcline) + args->leaf_srcline_used =3D false; + else if (ilist->srcline !=3D srcline__unknown) + free(ilist->srcline); ilist->srcline =3D call_srcline; call_srcline =3D NULL; break; } - if (call_srcline && call_fname) + if (call_srcline && call_srcline !=3D srcline__unknown) free(call_srcline); =20 /* Add this symbol to the chain as the leaf. */ - inline_list__append_tail(inline_sym, args->leaf_srcline, args->node); - args->leaf_srcline_used =3D true; + if (!args->leaf_srcline_used) { + inline_list__append_tail(inline_sym, args->leaf_srcline, args->node); + args->leaf_srcline_used =3D true; + } else { + inline_list__append_tail(inline_sym, strdup(args->leaf_srcline), args->n= ode); + } return 0; } =20 --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 03CE6328B7D for ; Sat, 17 Jan 2026 05:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627772; cv=none; b=YOGOOcOWe7vP9vTuivfFJHPe/afsFjzQy8JsvT5cTmzXsR24SNujPBeQBTsPxqxUP9M0T1GMSp1/EfVwDWUZfEvyO290reUVbRez3SsMlRFcUfG1G3goag+jUF6M0M3PLmXJtuv/0F21JV5JoYBqmY6/sUYp16XclAy5uuDl4zI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627772; c=relaxed/simple; bh=EoPQ7WynTCg6GroJnz0Pg1g63qxtVub92bvS+5rAy78=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=a3dkWLOyngqQB1JUxnWYOdvdGtXhReYTKmnp9T79worPY5MEBKDAo8ULr0o70T3nH0SirBcTP/Xe8Qzpcu3AEltql03l+QFKz0U0h5h9++nRR3mzn9WxoABwrw2oPTlVrWRPnmjDA1WG11wnAzEpRN1vyWe9F6aujmvd8Fq0/J4= 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=1dgbXtye; arc=none smtp.client-ip=74.125.82.73 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="1dgbXtye" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1219f27037fso2971619c88.1 for ; Fri, 16 Jan 2026 21:29:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627770; x=1769232570; 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=Vqg+qXSoRLfoai7ZDLIZjszxPa5Zftw8iNvGyqINItg=; b=1dgbXtyeCh+P8pJeSq6juxC3XBAKygWW3t89wAYzoRifBoj1ANZul8nLmoFx00TC0r chMUnsQ8idwNDDw5WxEq+IDNDEyaZG5okG+7c+O++UZVJFW50OT1HTb9HF2KjDXaXtEV vS9Jn7/rRP/KqxeVRwWsw0USUBJELMqiw4qc98BPLAnX5GxQ2PGXWq9W7POdY/iU/Pcr SLG+v6uq+J3l4+9LRM3VqP5P48Su0MjraBRpz9oxFZTjbUMlJVquPiRr9R0Q/0GmxoA0 pVM6mA3b5iUikKGcU9AqLslQFmhcqezmsaooWHxGW3gD2Itsf2sG2MstzYqX6/OAmMUn Abag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627770; x=1769232570; 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=Vqg+qXSoRLfoai7ZDLIZjszxPa5Zftw8iNvGyqINItg=; b=NwD2chIwBv+52IYSmOGx8K12nM+OFzlkcK9A4JBR7oQXRXmShZf7whnETW1Dcow6GW Mqqn/c0fHHuEG9qKEPbU3XKV+hR5xx7mtX3Ebth65d9250q3OcC80VB3hxyK11CdHMgc fW7+je3Zyh+D99Oe2Ve6oQt92aQuO09ycn9OT9L0tQZyVeTTO5K4oUiTv/JuAlyFZ9gz ly3lXQwBqFxwCXwce5pis9Shh4Z18of1KwFeut11J8HSZEwA0oELNbboUKn3NbAH14gV 91H5LlnOiiCrl1x4v7LJrZoF/uOHhuufcoQvu5/yIqBbUfV6kL373AiyJVGk9iMbvROO 7WzQ== X-Forwarded-Encrypted: i=1; AJvYcCXQ33Z2lZ7ZggC6P7X41BjGHtVx5m0I8yC84WEtWamiJ2DT+EgBk8cdzcaXAANwaeL2ZriT7T0G9nVhW+M=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5sjXpNQL6J7BlP0vQA+Gkn4mwgDyMao9J9OZxj7zMXfhe2EWN lchZvTM3cKWBpbPJI4KTEJCP5BZCcKrzHpOiaRRezSdfy81mndZW7TZvlinSwwv54rMrQG9zz91 Di2NJ5SZN+Q== X-Received: from dlbui3.prod.google.com ([2002:a05:7022:3d03:b0:11d:cfca:1df5]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:438b:b0:11b:9386:7ecf with SMTP id a92af1059eb24-1244a75c5c6mr4763418c88.44.1768627770088; Fri, 16 Jan 2026 21:29:30 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:32 -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-7-irogers@google.com> Subject: [PATCH v1 06/23] perf unwind-libdw: Correct argument to dwfl_attach_state 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" Argument is a pointer but EM_NONE (0) was being passed. Correct by passing NULL. Signed-off-by: Ian Rogers --- tools/perf/util/unwind-libdw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index b2e194a8be39..dc882f17f52d 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -339,7 +339,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, if (!callbacks) goto out; =20 - err =3D !dwfl_attach_state(ui->dwfl, EM_NONE, thread__tid(thread), callba= cks, ui); + err =3D !dwfl_attach_state(ui->dwfl, /*elf=3D*/NULL, thread__tid(thread),= callbacks, ui); if (err) goto out; =20 --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (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 5FE38328B53 for ; Sat, 17 Jan 2026 05:29:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627775; cv=none; b=YYkI6hj1PVMH750MTqOHFgzoAcacXIwZRKUUoBcng0esjzwXUoft96tp99H3PsX3rcQTfibbduG/yGQbpQ8dxvDLpcqlqOJczQk9tBHNKgWUowh/WACmL/1+ebmbPJhJzXZRBN+eNU/2/y9rwtQcwL85ZONve2ecU6iHKxESCUQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627775; c=relaxed/simple; bh=J7SJzNVFcolihx4GCOyTmwzHjMz2mGYszNDbGlUyGUQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=JE9yU9EbYmEB0d8m9L1DytlBbMo+R1uk/BL6k6hmCYALms0b2t+aRNDY2ctP2uBw+aAmRCcwUTU7F2yc1GsJCQzosLZXbfkSD80AB/qjyd16RHJJbwjNmhsGb0j1lEhZZPI0KyCh+S6pjdXalE0uXOp8vJqgz9lbj1O7+d+LZNA= 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=FcM/9XYC; arc=none smtp.client-ip=74.125.82.201 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="FcM/9XYC" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2ae56205588so4575506eec.1 for ; Fri, 16 Jan 2026 21:29:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627772; x=1769232572; 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=6/1CoOR/LPq1QynD6bWy4/54n2aY1moOLrcvMLQ5c54=; b=FcM/9XYCexbnAI4yNoJd98z3iHKCa/HQPhdEmUVcC7O5MZKDorZubKESKIXsKSAqQ1 kWyWvR/E4N1XlBdXHHTOBy3svy2aWVhRkptXinDxdGJ1J0+frgQC7JSWf9FNMYxVhfb9 LMTgDVD1hv6hIN9EMS6I7h7epJROyBCf8jDICzBcWh15zSqRttJabuCCp44bt7lKSOdA nZigHzLiOcXRJUNDKEcrHHo1M6C5PwY6/oZFL8fABoMOVw/F5gBZZL3NyIVl7o9YYPmG CM6WmQm8o4jrmM+fgpV2WvaWq72oyjTdNdntEYytpk6DDAGQQ4/KnN0vIDXCmQpcRyWC t/Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627772; x=1769232572; 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=6/1CoOR/LPq1QynD6bWy4/54n2aY1moOLrcvMLQ5c54=; b=toYcyRPmEBxCj9zxAwgJtzDfN+hqC+qwqMrMVFp4JpNRjjy13c6dY09YcSd/LGceFd Gj0GUb6xVYvrfewd3iSYFIl7+gDSQ+Bklzihep5/zF3rgxU2YcZKkA8aZTUPz4qZvEzP qWRev6/8UvojexH+RqI2jft5ZBaFQ6LTZN3icmGDIs4hVIWdLnVvApJFz+iXbb2dO5F5 7Q4VtFlb6cWxvldkRT1eEwLIcPOL93bz9qAtLLNzGhSCeUHlAeizAemd7z42fgQ+OPd4 y9RNO0IBuDXdTDnkUHG1m4g2j8jYRyToFlQFXUTT24h9WLH+nrXVavYdgYu4gSmJHjuw sXnw== X-Forwarded-Encrypted: i=1; AJvYcCUgUbDqNtK6ConlmlLsA0fVrssOwJrgX9HVBTf5rMj9Oa0q06fdmaHghqLpjEoQvX2/6qaxEBSxi8cbHn8=@vger.kernel.org X-Gm-Message-State: AOJu0YzVSLLn1n9J7b84BQccZCr3UhKbwTwA1mBshWg+CPZIabsLcEHi FYKXBihEDm7R0tmXrsDTb/pCPh3qyYYUK+j+5b3VMKxFafw8tlp+7D3F2+UaqKa1B3dtmj3OCnO VLlnbN3Bw4A== X-Received: from dyb28.prod.google.com ([2002:a05:693c:631c:b0:2b6:c268:19bc]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:b505:b0:2b0:5412:3ef with SMTP id 5a478bee46e88-2b6b412b810mr3937507eec.42.1768627772289; Fri, 16 Jan 2026 21:29:32 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:33 -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-8-irogers@google.com> Subject: [PATCH v1 07/23] perf powerpc: Unify the skip-callchain-idx libdw with that for addr2line 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" Rather than have 2 Dwfl unify the Dwfl in skip-callchain-idx with that is used by libdw__addr2line. Rename that variable in struct dso from a2l_libdw to just libdw as it is now used in more than addr2line. The Dwfl in skip-callchain-idx uses a map address when being read with dwfl_report_elf (rather than dwfl_report_offline that addr2line uses). skip-callchain-idx is wrong as the map address can vary between processes because of ASLR, ie it should need a different Dwfl per process. In the code after this patch the base address becomes 0 and the mapped PC is used with the dwfl functions. This should increase the accuracy of skip-callchain-idx, but the impact has only been build tested. Signed-off-by: Ian Rogers --- .../arch/powerpc/util/skip-callchain-idx.c | 52 ++------- tools/perf/util/dso.c | 2 +- tools/perf/util/dso.h | 23 ++-- tools/perf/util/libdw.c | 101 ++++++++++-------- tools/perf/util/libdw.h | 12 +-- tools/perf/util/srcline.c | 2 +- 6 files changed, 89 insertions(+), 103 deletions(-) diff --git a/tools/perf/arch/powerpc/util/skip-callchain-idx.c b/tools/perf= /arch/powerpc/util/skip-callchain-idx.c index 356786432fd3..e57f10798fa6 100644 --- a/tools/perf/arch/powerpc/util/skip-callchain-idx.c +++ b/tools/perf/arch/powerpc/util/skip-callchain-idx.c @@ -30,14 +30,6 @@ * The libdwfl code in this file is based on code from elfutils * (libdwfl/argp-std.c, libdwfl/tests/addrcfi.c, etc). */ -static char *debuginfo_path; - -static const Dwfl_Callbacks offline_callbacks =3D { - .debuginfo_path =3D &debuginfo_path, - .find_debuginfo =3D dwfl_standard_find_debuginfo, - .section_address =3D dwfl_offline_section_address, -}; - =20 /* * Use the DWARF expression for the Call-frame-address and determine @@ -149,44 +141,22 @@ static Dwarf_Frame *get_dwarf_frame(Dwfl_Module *mod,= Dwarf_Addr pc) * yet used) * -1 in case of errors */ -static int check_return_addr(struct dso *dso, u64 map_start, Dwarf_Addr pc) +static int check_return_addr(struct dso *dso, Dwarf_Addr mapped_pc) { int rc =3D -1; Dwfl *dwfl; Dwfl_Module *mod; Dwarf_Frame *frame; int ra_regno; - Dwarf_Addr start =3D pc; - Dwarf_Addr end =3D pc; + Dwarf_Addr start =3D mapped_pc; + Dwarf_Addr end =3D mapped_pc; bool signalp; - const char *exec_file =3D dso__long_name(dso); - - dwfl =3D RC_CHK_ACCESS(dso)->dwfl; - - if (!dwfl) { - dwfl =3D dwfl_begin(&offline_callbacks); - if (!dwfl) { - pr_debug("dwfl_begin() failed: %s\n", dwarf_errmsg(-1)); - return -1; - } - - mod =3D dwfl_report_elf(dwfl, exec_file, exec_file, -1, - map_start, false); - if (!mod) { - pr_debug("dwfl_report_elf() failed %s\n", - dwarf_errmsg(-1)); - /* - * We normally cache the DWARF debug info and never - * call dwfl_end(). But to prevent fd leak, free in - * case of error. - */ - dwfl_end(dwfl); - goto out; - } - RC_CHK_ACCESS(dso)->dwfl =3D dwfl; - } =20 - mod =3D dwfl_addrmodule(dwfl, pc); + dwfl =3D dso__libdw_dwfl(dso); + if (!dwfl) + return -1; + + mod =3D dwfl_addrmodule(dwfl, mapped_pc); if (!mod) { pr_debug("dwfl_addrmodule() failed, %s\n", dwarf_errmsg(-1)); goto out; @@ -196,9 +166,9 @@ static int check_return_addr(struct dso *dso, u64 map_s= tart, Dwarf_Addr pc) * To work with split debug info files (eg: glibc), check both * .eh_frame and .debug_frame sections of the ELF header. */ - frame =3D get_eh_frame(mod, pc); + frame =3D get_eh_frame(mod, mapped_pc); if (!frame) { - frame =3D get_dwarf_frame(mod, pc); + frame =3D get_dwarf_frame(mod, mapped_pc); if (!frame) goto out; } @@ -264,7 +234,7 @@ int arch_skip_callchain_idx(struct thread *thread, stru= ct ip_callchain *chain) return skip_slot; } =20 - rc =3D check_return_addr(dso, map__start(al.map), ip); + rc =3D check_return_addr(dso, map__map_ip(al.map, ip)); =20 pr_debug("[DSO %s, sym %s, ip 0x%" PRIx64 "] rc %d\n", dso__long_name(dso), al.sym->name, ip, rc); diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 143720d1ecb1..dce207c7f862 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -1612,7 +1612,7 @@ void dso__delete(struct dso *dso) auxtrace_cache__free(RC_CHK_ACCESS(dso)->auxtrace_cache); dso_cache__free(dso); dso__free_a2l(dso); - dso__free_a2l_libdw(dso); + dso__free_libdw(dso); dso__free_symsrc_filename(dso); nsinfo__zput(RC_CHK_ACCESS(dso)->nsinfo); mutex_destroy(dso__lock(dso)); diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 4aee23775054..295388085031 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -268,11 +268,8 @@ DECLARE_RC_STRUCT(dso) { const char *short_name; const char *long_name; void *a2l; - void *a2l_libdw; + void *libdw; char *symsrc_filename; -#if defined(__powerpc__) - void *dwfl; /* DWARF debug info */ -#endif struct nsinfo *nsinfo; struct auxtrace_cache *auxtrace_cache; union { /* Tool specific area */ @@ -335,16 +332,26 @@ static inline void dso__set_a2l(struct dso *dso, void= *val) RC_CHK_ACCESS(dso)->a2l =3D val; } =20 -static inline void *dso__a2l_libdw(const struct dso *dso) +static inline void *dso__libdw(const struct dso *dso) { - return RC_CHK_ACCESS(dso)->a2l_libdw; + return RC_CHK_ACCESS(dso)->libdw; } =20 -static inline void dso__set_a2l_libdw(struct dso *dso, void *val) +static inline void dso__set_libdw(struct dso *dso, void *val) { - RC_CHK_ACCESS(dso)->a2l_libdw =3D val; + RC_CHK_ACCESS(dso)->libdw =3D val; } =20 +struct Dwfl; +#ifdef HAVE_LIBDW_SUPPORT +struct Dwfl *dso__libdw_dwfl(struct dso *dso); +#else +static inline struct Dwfl *dso__libdw_dwfl(struct dso *dso __maybe_unused) +{ + return NULL; +} +#endif + static inline unsigned int dso__a2l_fails(const struct dso *dso) { return RC_CHK_ACCESS(dso)->a2l_fails; diff --git a/tools/perf/util/libdw.c b/tools/perf/util/libdw.c index b96c4e0d728f..216977884103 100644 --- a/tools/perf/util/libdw.c +++ b/tools/perf/util/libdw.c @@ -8,14 +8,62 @@ #include #include =20 -void dso__free_a2l_libdw(struct dso *dso) +static const Dwfl_Callbacks offline_callbacks =3D { + .find_debuginfo =3D dwfl_standard_find_debuginfo, + .section_address =3D dwfl_offline_section_address, + .find_elf =3D dwfl_build_id_find_elf, +}; + +void dso__free_libdw(struct dso *dso) { - Dwfl *dwfl =3D dso__a2l_libdw(dso); + Dwfl *dwfl =3D dso__libdw(dso); =20 if (dwfl) { dwfl_end(dwfl); - dso__set_a2l_libdw(dso, NULL); + dso__set_libdw(dso, NULL); + } +} + +struct Dwfl *dso__libdw_dwfl(struct dso *dso) +{ + Dwfl *dwfl =3D dso__libdw(dso); + const char *dso_name; + Dwfl_Module *mod; + int fd; + + if (dwfl) + return dwfl; + + dso_name =3D dso__long_name(dso); + /* + * Initialize Dwfl session. + * We need to open the DSO file to report it to libdw. + */ + fd =3D open(dso_name, O_RDONLY); + if (fd < 0) + return NULL; + + dwfl =3D dwfl_begin(&offline_callbacks); + if (!dwfl) { + close(fd); + return NULL; + } + + /* + * If the report is successful, the file descriptor fd is consumed + * and closed by the Dwfl. If not, it is not closed. + */ + mod =3D dwfl_report_offline(dwfl, dso_name, dso_name, fd); + if (!mod) { + dwfl_end(dwfl); + close(fd); + return NULL; } + + dwfl_report_end(dwfl, /*removed=3D*/NULL, /*arg=3D*/NULL); + dso__set_libdw(dso, dwfl); + + return dwfl; } =20 struct libdw_a2l_cb_args { @@ -63,58 +111,21 @@ static int libdw_a2l_cb(Dwarf_Die *die, void *_args) return 0; } =20 -int libdw__addr2line(const char *dso_name, u64 addr, - char **file, unsigned int *line_nr, +int libdw__addr2line(u64 addr, char **file, unsigned int *line_nr, struct dso *dso, bool unwind_inlines, struct inline_node *node, struct symbol *sym) { - static const Dwfl_Callbacks offline_callbacks =3D { - .find_debuginfo =3D dwfl_standard_find_debuginfo, - .section_address =3D dwfl_offline_section_address, - .find_elf =3D dwfl_build_id_find_elf, - }; - Dwfl *dwfl =3D dso__a2l_libdw(dso); + Dwfl *dwfl =3D dso__libdw_dwfl(dso); Dwfl_Module *mod; Dwfl_Line *dwline; Dwarf_Addr bias; const char *src; int lineno =3D 0; =20 - if (!dwfl) { - /* - * Initialize Dwfl session. - * We need to open the DSO file to report it to libdw. - */ - int fd; - - fd =3D open(dso_name, O_RDONLY); - if (fd < 0) - return 0; - - dwfl =3D dwfl_begin(&offline_callbacks); - if (!dwfl) { - close(fd); - return 0; - } - - /* - * If the report is successful, the file descriptor fd is consumed - * and closed by the Dwfl. If not, it is not closed. - */ - mod =3D dwfl_report_offline(dwfl, dso_name, dso_name, fd); - if (!mod) { - dwfl_end(dwfl); - close(fd); - return 0; - } - - dwfl_report_end(dwfl, /*removed=3D*/NULL, /*arg=3D*/NULL); - dso__set_a2l_libdw(dso, dwfl); - } else { - /* Dwfl session already initialized, get module for address. */ - mod =3D dwfl_addrmodule(dwfl, addr); - } + if (!dwfl) + return 0; =20 + mod =3D dwfl_addrmodule(dwfl, addr); if (!mod) return 0; =20 diff --git a/tools/perf/util/libdw.h b/tools/perf/util/libdw.h index 0f8d7b4a11a5..b12094737415 100644 --- a/tools/perf/util/libdw.h +++ b/tools/perf/util/libdw.h @@ -11,7 +11,6 @@ struct symbol; #ifdef HAVE_LIBDW_SUPPORT /* * libdw__addr2line - Convert address to source location using libdw - * @dso_name: Name of the DSO * @addr: Address to resolve * @file: Pointer to return filename (caller must free) * @line_nr: Pointer to return line number @@ -26,23 +25,22 @@ struct symbol; * * Returns 1 on success (found), 0 on failure (not found). */ -int libdw__addr2line(const char *dso_name, u64 addr, char **file, +int libdw__addr2line(u64 addr, char **file, unsigned int *line_nr, struct dso *dso, bool unwind_inlines, struct inline_node *node, struct symbol *sym); =20 /* - * dso__free_a2l_libdw - Free libdw resources associated with the DSO + * dso__free_libdw - Free libdw resources associated with the DSO * @dso: The dso to free resources for * * This function cleans up the Dwfl context used for addr2line lookups. */ -void dso__free_a2l_libdw(struct dso *dso); +void dso__free_libdw(struct dso *dso); =20 #else /* HAVE_LIBDW_SUPPORT */ =20 -static inline int libdw__addr2line(const char *dso_name __maybe_unused, - u64 addr __maybe_unused, char **file __maybe_unused, +static inline int libdw__addr2line(u64 addr __maybe_unused, char **file __= maybe_unused, unsigned int *line_nr __maybe_unused, struct dso *dso __maybe_unused, bool unwind_inlines __maybe_unused, @@ -52,7 +50,7 @@ static inline int libdw__addr2line(const char *dso_name _= _maybe_unused, return 0; } =20 -static inline void dso__free_a2l_libdw(struct dso *dso __maybe_unused) +static inline void dso__free_libdw(struct dso *dso __maybe_unused) { } #endif /* HAVE_LIBDW_SUPPORT */ diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 28fa1abd1fd3..9be42f398440 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -161,7 +161,7 @@ static int addr2line(const char *dso_name, u64 addr, ch= ar **file, unsigned int * for (size_t i =3D 0; i < ARRAY_SIZE(symbol_conf.addr2line_style); i++) { switch (symbol_conf.addr2line_style[i]) { case A2L_STYLE_LIBDW: - ret =3D libdw__addr2line(dso_name, addr, file, line_nr, dso, unwind_inl= ines, + ret =3D libdw__addr2line(addr, file, line_nr, dso, unwind_inlines, node, sym); break; case A2L_STYLE_LLVM: --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 3F48132AAD4 for ; Sat, 17 Jan 2026 05:29:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627779; cv=none; b=tpqtP/dv+Mq/uHxuWdXgjRjFfyyOsxiGia4Vz933VNP8EqVowLGdan0noLVg0klIOebWv2IGVAPA8FwY0kmpCJn/gjnULckS0pRWSv7mMZlws3SWUic/5orRYcEj/D/T2M2jFE9b4eDYE4GFhOZhpyM1lZ13pQntiOptiuC7gCs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627779; c=relaxed/simple; bh=KYMlIYaO4TFVGe4X8XgmkKM5kQetl6AIq2SNvs1o89Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=r+dZyq3dk4gngGa7UEhoBdu+hp6Ip3jF4YXclw44RrzDQ4HGZi6RJoQeKRnqh7PqZEnPw0y6KWkC2pld87AxSkXzUtjjkhHrKa2rIHRmlYwlCtXjOu7n3j/i2Za+HVXR1zHiODB1yCc/9zZxHvyAy1ZWz+VnI4w2xmR/4b49KOo= 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=etkslVtf; arc=none smtp.client-ip=74.125.82.73 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="etkslVtf" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-11b94abc09dso5088555c88.1 for ; Fri, 16 Jan 2026 21:29:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627774; x=1769232574; 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=1S66FILKRfXMvRmBPDp7wjeWNFb1HGCJm/Z2kIzT3UE=; b=etkslVtf+WabkqxmYU0hOpR+zkX8Vw5nHTrbcPa6GQt4QbTbomCCLjlP3qnQW3y/Bw 03hvruFfEqtgcK/11st2jj78BKjUgYA1opueROPJJ4VSA8u2iD34gacXcRZK1dEMqBq7 TYYTyniY+TE0DG3mkNRLlmf3oS3R1rfNnSTq0vCSyjqGQBNpWDypgEld4x2HHNyty7A1 OWWoVLzexmaLE2p2+qh3Y68dTKHNK2w8SXtkFJPZcieKXzzUjdP0fqhmoN+Scp259t5l djbXzoURbu9+wPvEITjIetiU3njp5uwSuYZp9UuP4wnUGFzdZHQZjld9A68GQUEW64Px Zggw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627774; x=1769232574; 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=1S66FILKRfXMvRmBPDp7wjeWNFb1HGCJm/Z2kIzT3UE=; b=HnYNrH8frVz9zRxFvgmfiK60PUDRH0MTwSvwlesZnfP1Jlv/GX4yla2AKtWFQj5akN XZdkcqEntnjvIb5xbD2b6+8+kgFEn+D2Ee2HzbuzSo9OdDDx/XvywkYQIYrAEe7KD/6y aJZAUVRnYhiL6UsmsOPJ6FwSl8SrgRVHFiUd9KpYRvITtufvcVCFiEtjQ2SIR+l+XDMU lvr5GxUt16aHg00Hqkvbm8AegNYyyoMwyvUt4BQlGgOOeTJ55q2hVBjlQnbWJPgJPL9w 6lSmO19sx1GogVvnAIqkLEOl76I443DEf2BOxjYF998y/UONhRxWAkKk8sTpYireilAs qM0A== X-Forwarded-Encrypted: i=1; AJvYcCW408+k+U3wNeCq4As21C909g1rXGBdwawNWmkz/95jB/MtlZkhBgKtbR0UbAHXIQsLuk+ipdwoSfl35Ro=@vger.kernel.org X-Gm-Message-State: AOJu0YzAUG3BfSw9NNfMg7IiAAspJ/lFZeu6J8fwz/XTdI2h8HsPhY1X +c84Qcrbx/gy0FnwbNTu3pFeBYyZW5S40OF6Utr4In8BnloWsea2KmEzMWFwTcE7vsTbpxm3rOY Wto77+W6gNg== X-Received: from dlag7.prod.google.com ([2002:a05:701b:2507:b0:11f:3043:2c7f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:b93:b0:123:3508:893f with SMTP id a92af1059eb24-1244a765c10mr3680068c88.31.1768627774218; Fri, 16 Jan 2026 21:29:34 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:34 -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-9-irogers@google.com> Subject: [PATCH v1 08/23] perf perf_regs: Switch from arch string to int e_machine 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" The arch string requires multiple strcmp to identify things like the IP and SP. Switch to passing in an e_machine that in the bulk of cases is computed using a current thread load. The e_machine also allows identification of 32-bit vs 64-bit processes. Signed-off-by: Ian Rogers --- tools/perf/builtin-script.c | 17 ++- tools/perf/util/evsel.c | 14 ++- tools/perf/util/perf_regs.c | 105 +++++++++++------- tools/perf/util/perf_regs.h | 10 +- .../scripting-engines/trace-event-python.c | 21 ++-- tools/perf/util/session.c | 65 ++++++++--- tools/perf/util/session.h | 1 + tools/perf/util/unwind-libdw.c | 12 +- tools/perf/util/unwind-libunwind-local.c | 7 +- 9 files changed, 164 insertions(+), 88 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 62e43d3c5ad7..372bede30230 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -717,7 +717,7 @@ static int perf_session__check_output_opt(struct perf_s= ession *session) return 0; } =20 -static int perf_sample__fprintf_regs(struct regs_dump *regs, uint64_t mask= , const char *arch, +static int perf_sample__fprintf_regs(struct regs_dump *regs, uint64_t mask= , uint16_t e_machine, FILE *fp) { unsigned i =3D 0, r; @@ -730,7 +730,7 @@ static int perf_sample__fprintf_regs(struct regs_dump *= regs, uint64_t mask, cons =20 for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) { u64 val =3D regs->regs[i++]; - printed +=3D fprintf(fp, "%5s:0x%"PRIx64" ", perf_reg_name(r, arch), val= ); + printed +=3D fprintf(fp, "%5s:0x%"PRIx64" ", perf_reg_name(r, e_machine)= , val); } =20 return printed; @@ -787,23 +787,23 @@ tod_scnprintf(struct perf_script *script, char *buf, = int buflen, } =20 static int perf_sample__fprintf_iregs(struct perf_sample *sample, - struct perf_event_attr *attr, const char *arch, FILE *fp) + struct perf_event_attr *attr, uint16_t e_machine, FILE *fp) { if (!sample->intr_regs) return 0; =20 return perf_sample__fprintf_regs(perf_sample__intr_regs(sample), - attr->sample_regs_intr, arch, fp); + attr->sample_regs_intr, e_machine, fp); } =20 static int perf_sample__fprintf_uregs(struct perf_sample *sample, - struct perf_event_attr *attr, const char *arch, FILE *fp) + struct perf_event_attr *attr, uint16_t e_machine, FILE *fp) { if (!sample->user_regs) return 0; =20 return perf_sample__fprintf_regs(perf_sample__user_regs(sample), - attr->sample_regs_user, arch, fp); + attr->sample_regs_user, e_machine, fp); } =20 static int perf_sample__fprintf_start(struct perf_script *script, @@ -2418,7 +2418,6 @@ static void process_event(struct perf_script *script, struct evsel_script *es =3D evsel->priv; FILE *fp =3D es->fp; char str[PAGE_SIZE_NAME_LEN]; - const char *arch =3D perf_env__arch(machine->env); =20 if (output[type].fields =3D=3D 0) return; @@ -2506,10 +2505,10 @@ static void process_event(struct perf_script *scrip= t, } =20 if (PRINT_FIELD(IREGS)) - perf_sample__fprintf_iregs(sample, attr, arch, fp); + perf_sample__fprintf_iregs(sample, attr, thread__e_machine(thread, machi= ne), fp); =20 if (PRINT_FIELD(UREGS)) - perf_sample__fprintf_uregs(sample, attr, arch, fp); + perf_sample__fprintf_uregs(sample, attr, thread__e_machine(thread, machi= ne), fp); =20 if (PRINT_FIELD(BRSTACK)) perf_sample__fprintf_brstack(sample, thread, evsel, fp); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 6d324141588c..5ac1a05601b1 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -34,6 +34,7 @@ #include "callchain.h" #include "cgroup.h" #include "counts.h" +#include "dwarf-regs.h" #include "event.h" #include "evsel.h" #include "time-utils.h" @@ -1007,6 +1008,13 @@ int evsel__group_desc(struct evsel *evsel, char *buf= , size_t size) return ret; } =20 +static uint16_t evsel__e_machine(struct evsel *evsel) +{ + struct perf_session *session =3D evsel__session(evsel); + + return session ? perf_session__e_machine(session) : EM_HOST; +} + static void __evsel__config_callchain(struct evsel *evsel, struct record_o= pts *opts, struct callchain_param *param) { @@ -1042,13 +1050,13 @@ static void __evsel__config_callchain(struct evsel = *evsel, struct record_opts *o =20 if (param->record_mode =3D=3D CALLCHAIN_DWARF) { if (!function) { - const char *arch =3D perf_env__arch(evsel__env(evsel)); + uint16_t e_machine =3D evsel__e_machine(evsel); =20 evsel__set_sample_bit(evsel, REGS_USER); evsel__set_sample_bit(evsel, STACK_USER); if (opts->sample_user_regs && - DWARF_MINIMAL_REGS(arch) !=3D arch__user_reg_mask()) { - attr->sample_regs_user |=3D DWARF_MINIMAL_REGS(arch); + DWARF_MINIMAL_REGS(e_machine) !=3D arch__user_reg_mask()) { + attr->sample_regs_user |=3D DWARF_MINIMAL_REGS(e_machine); pr_warning("WARNING: The use of --call-graph=3Ddwarf may require all t= he user registers, " "specifying a subset with --user-regs may render DWARF unwinding u= nreliable, " "so the minimal registers set (IP, SP) is explicitly forced.\n"); diff --git a/tools/perf/util/perf_regs.c b/tools/perf/util/perf_regs.c index 44b90bbf2d07..b58d59b84fb1 100644 --- a/tools/perf/util/perf_regs.c +++ b/tools/perf/util/perf_regs.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include "perf_regs.h" @@ -30,30 +31,48 @@ const struct sample_reg * __weak arch__sample_reg_masks= (void) return sample_reg_masks; } =20 -const char *perf_reg_name(int id, const char *arch) +const char *perf_reg_name(int id, uint16_t e_machine) { const char *reg_name =3D NULL; =20 - if (!strcmp(arch, "csky")) + switch (e_machine) { + case EM_ARM: + reg_name =3D __perf_reg_name_arm(id); + break; + case EM_AARCH64: + reg_name =3D __perf_reg_name_arm64(id); + break; + case EM_CSKY: reg_name =3D __perf_reg_name_csky(id); - else if (!strcmp(arch, "loongarch")) + break; + case EM_LOONGARCH: reg_name =3D __perf_reg_name_loongarch(id); - else if (!strcmp(arch, "mips")) + break; + case EM_MIPS: reg_name =3D __perf_reg_name_mips(id); - else if (!strcmp(arch, "powerpc")) + break; + case EM_PPC: + case EM_PPC64: reg_name =3D __perf_reg_name_powerpc(id); - else if (!strcmp(arch, "riscv")) + break; + case EM_RISCV: reg_name =3D __perf_reg_name_riscv(id); - else if (!strcmp(arch, "s390")) + break; + case EM_S390: reg_name =3D __perf_reg_name_s390(id); - else if (!strcmp(arch, "x86")) + break; + case EM_386: + case EM_X86_64: reg_name =3D __perf_reg_name_x86(id); - else if (!strcmp(arch, "arm")) - reg_name =3D __perf_reg_name_arm(id); - else if (!strcmp(arch, "arm64")) - reg_name =3D __perf_reg_name_arm64(id); + break; + default: + break; + } + if (reg_name) + return reg_name; =20 - return reg_name ?: "unknown"; + pr_debug("Failed to find register %d for ELF machine type %u\n", id, e_ma= chine); + return "unknown"; } =20 int perf_reg_value(u64 *valp, struct regs_dump *regs, int id) @@ -83,52 +102,60 @@ int perf_reg_value(u64 *valp, struct regs_dump *regs, = int id) return 0; } =20 -uint64_t perf_arch_reg_ip(const char *arch) +uint64_t perf_arch_reg_ip(uint16_t e_machine) { - if (!strcmp(arch, "arm")) + switch (e_machine) { + case EM_ARM: return __perf_reg_ip_arm(); - else if (!strcmp(arch, "arm64")) + case EM_AARCH64: return __perf_reg_ip_arm64(); - else if (!strcmp(arch, "csky")) + case EM_CSKY: return __perf_reg_ip_csky(); - else if (!strcmp(arch, "loongarch")) + case EM_LOONGARCH: return __perf_reg_ip_loongarch(); - else if (!strcmp(arch, "mips")) + case EM_MIPS: return __perf_reg_ip_mips(); - else if (!strcmp(arch, "powerpc")) + case EM_PPC: + case EM_PPC64: return __perf_reg_ip_powerpc(); - else if (!strcmp(arch, "riscv")) + case EM_RISCV: return __perf_reg_ip_riscv(); - else if (!strcmp(arch, "s390")) + case EM_S390: return __perf_reg_ip_s390(); - else if (!strcmp(arch, "x86")) + case EM_386: + case EM_X86_64: return __perf_reg_ip_x86(); - - pr_err("Fail to find IP register for arch %s, returns 0\n", arch); - return 0; + default: + pr_err("Failed to find IP register for ELF machine type %u\n", e_machine= ); + return 0; + } } =20 -uint64_t perf_arch_reg_sp(const char *arch) +uint64_t perf_arch_reg_sp(uint16_t e_machine) { - if (!strcmp(arch, "arm")) + switch (e_machine) { + case EM_ARM: return __perf_reg_sp_arm(); - else if (!strcmp(arch, "arm64")) + case EM_AARCH64: return __perf_reg_sp_arm64(); - else if (!strcmp(arch, "csky")) + case EM_CSKY: return __perf_reg_sp_csky(); - else if (!strcmp(arch, "loongarch")) + case EM_LOONGARCH: return __perf_reg_sp_loongarch(); - else if (!strcmp(arch, "mips")) + case EM_MIPS: return __perf_reg_sp_mips(); - else if (!strcmp(arch, "powerpc")) + case EM_PPC: + case EM_PPC64: return __perf_reg_sp_powerpc(); - else if (!strcmp(arch, "riscv")) + case EM_RISCV: return __perf_reg_sp_riscv(); - else if (!strcmp(arch, "s390")) + case EM_S390: return __perf_reg_sp_s390(); - else if (!strcmp(arch, "x86")) + case EM_386: + case EM_X86_64: return __perf_reg_sp_x86(); - - pr_err("Fail to find SP register for arch %s, returns 0\n", arch); - return 0; + default: + pr_err("Failed to find SP register for ELF machine type %u\n", e_machine= ); + return 0; + } } diff --git a/tools/perf/util/perf_regs.h b/tools/perf/util/perf_regs.h index f2d0736d65cc..7bfc6a34c02b 100644 --- a/tools/perf/util/perf_regs.h +++ b/tools/perf/util/perf_regs.h @@ -28,10 +28,10 @@ uint64_t arch__intr_reg_mask(void); uint64_t arch__user_reg_mask(void); const struct sample_reg *arch__sample_reg_masks(void); =20 -const char *perf_reg_name(int id, const char *arch); +const char *perf_reg_name(int id, uint16_t e_machine); int perf_reg_value(u64 *valp, struct regs_dump *regs, int id); -uint64_t perf_arch_reg_ip(const char *arch); -uint64_t perf_arch_reg_sp(const char *arch); +uint64_t perf_arch_reg_ip(uint16_t e_machine); +uint64_t perf_arch_reg_sp(uint16_t e_machine); const char *__perf_reg_name_arm64(int id); uint64_t __perf_reg_ip_arm64(void); uint64_t __perf_reg_sp_arm64(void); @@ -60,9 +60,9 @@ const char *__perf_reg_name_x86(int id); uint64_t __perf_reg_ip_x86(void); uint64_t __perf_reg_sp_x86(void); =20 -static inline uint64_t DWARF_MINIMAL_REGS(const char *arch) +static inline uint64_t DWARF_MINIMAL_REGS(uint16_t e_machine) { - return (1ULL << perf_arch_reg_ip(arch)) | (1ULL << perf_arch_reg_sp(arch)= ); + return (1ULL << perf_arch_reg_ip(e_machine)) | (1ULL << perf_arch_reg_sp(= e_machine)); } =20 #endif /* __PERF_REGS_H */ diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 6655c0bbe0d8..b90edc147796 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -50,6 +50,7 @@ #include "../thread-stack.h" #include "../trace-event.h" #include "../call-path.h" +#include "dwarf-regs.h" #include "map.h" #include "symbol.h" #include "thread_map.h" @@ -713,7 +714,7 @@ static void set_sample_datasrc_in_dict(PyObject *dict, _PyUnicode_FromString(decode)); } =20 -static void regs_map(struct regs_dump *regs, uint64_t mask, const char *ar= ch, char *bf, int size) +static void regs_map(struct regs_dump *regs, uint64_t mask, uint16_t e_mac= hine, char *bf, int size) { unsigned int i =3D 0, r; int printed =3D 0; @@ -731,7 +732,7 @@ static void regs_map(struct regs_dump *regs, uint64_t m= ask, const char *arch, ch =20 printed +=3D scnprintf(bf + printed, size - printed, "%5s:0x%" PRIx64 " ", - perf_reg_name(r, arch), val); + perf_reg_name(r, e_machine), val); } } =20 @@ -739,10 +740,10 @@ static void regs_map(struct regs_dump *regs, uint64_t= mask, const char *arch, ch =20 static int set_regs_in_dict(PyObject *dict, struct perf_sample *sample, - struct evsel *evsel) + struct evsel *evsel, + uint16_t e_machine) { struct perf_event_attr *attr =3D &evsel->core.attr; - const char *arch =3D perf_env__arch(evsel__env(evsel)); =20 int size =3D (__sw_hweight64(attr->sample_regs_intr) * MAX_REG_SIZE) + 1; char *bf =3D NULL; @@ -752,7 +753,7 @@ static int set_regs_in_dict(PyObject *dict, if (!bf) return -1; =20 - regs_map(sample->intr_regs, attr->sample_regs_intr, arch, bf, size); + regs_map(sample->intr_regs, attr->sample_regs_intr, e_machine, bf, size); =20 pydict_set_item_string_decref(dict, "iregs", _PyUnicode_FromString(bf)); @@ -764,7 +765,7 @@ static int set_regs_in_dict(PyObject *dict, if (!bf) return -1; } - regs_map(sample->user_regs, attr->sample_regs_user, arch, bf, size); + regs_map(sample->user_regs, attr->sample_regs_user, e_machine, bf, size); =20 pydict_set_item_string_decref(dict, "uregs", _PyUnicode_FromString(bf)); @@ -834,6 +835,8 @@ static PyObject *get_perf_sample_dict(struct perf_sampl= e *sample, PyObject *callchain) { PyObject *dict, *dict_sample, *brstack, *brstacksym; + struct machine *machine; + uint16_t e_machine =3D EM_HOST; =20 dict =3D PyDict_New(); if (!dict) @@ -920,7 +923,11 @@ static PyObject *get_perf_sample_dict(struct perf_samp= le *sample, PyLong_FromUnsignedLongLong(sample->cyc_cnt)); } =20 - if (set_regs_in_dict(dict, sample, evsel)) + if (al->thread) { + machine =3D maps__machine(thread__maps(al->thread)); + e_machine =3D thread__e_machine(al->thread, machine); + } + if (set_regs_in_dict(dict, sample, evsel, e_machine)) Py_FatalError("Failed to setting regs in dict"); =20 return dict; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 922ef6577bbb..d7b28cb4e672 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -17,6 +17,7 @@ #include "map_symbol.h" #include "branch.h" #include "debug.h" +#include "dwarf-regs.h" #include "env.h" #include "evlist.h" #include "evsel.h" @@ -942,7 +943,7 @@ static void branch_stack__printf(struct perf_sample *sa= mple, } } =20 -static void regs_dump__printf(u64 mask, u64 *regs, const char *arch) +static void regs_dump__printf(u64 mask, u64 *regs, uint16_t e_machine) { unsigned rid, i =3D 0; =20 @@ -950,7 +951,7 @@ static void regs_dump__printf(u64 mask, u64 *regs, cons= t char *arch) u64 val =3D regs[i++]; =20 printf(".... %-5s 0x%016" PRIx64 "\n", - perf_reg_name(rid, arch), val); + perf_reg_name(rid, e_machine), val); } } =20 @@ -968,7 +969,7 @@ static inline const char *regs_dump_abi(struct regs_dum= p *d) return regs_abi[d->abi]; } =20 -static void regs__printf(const char *type, struct regs_dump *regs, const c= har *arch) +static void regs__printf(const char *type, struct regs_dump *regs, uint16_= t e_machine) { u64 mask =3D regs->mask; =20 @@ -977,10 +978,10 @@ static void regs__printf(const char *type, struct reg= s_dump *regs, const char *a mask, regs_dump_abi(regs)); =20 - regs_dump__printf(mask, regs->regs, arch); + regs_dump__printf(mask, regs->regs, e_machine); } =20 -static void regs_user__printf(struct perf_sample *sample, const char *arch) +static void regs_user__printf(struct perf_sample *sample, uint16_t e_machi= ne) { struct regs_dump *user_regs; =20 @@ -990,10 +991,10 @@ static void regs_user__printf(struct perf_sample *sam= ple, const char *arch) user_regs =3D perf_sample__user_regs(sample); =20 if (user_regs->regs) - regs__printf("user", user_regs, arch); + regs__printf("user", user_regs, e_machine); } =20 -static void regs_intr__printf(struct perf_sample *sample, const char *arch) +static void regs_intr__printf(struct perf_sample *sample, uint16_t e_machi= ne) { struct regs_dump *intr_regs; =20 @@ -1003,7 +1004,7 @@ static void regs_intr__printf(struct perf_sample *sam= ple, const char *arch) intr_regs =3D perf_sample__intr_regs(sample); =20 if (intr_regs->regs) - regs__printf("intr", intr_regs, arch); + regs__printf("intr", intr_regs, e_machine); } =20 static void stack_user__printf(struct stack_dump *dump) @@ -1092,21 +1093,28 @@ char *get_page_size_name(u64 size, char *str) return str; } =20 -static void dump_sample(struct evsel *evsel, union perf_event *event, - struct perf_sample *sample, const char *arch) +static void dump_sample(struct machine *machine, struct evsel *evsel, unio= n perf_event *event, + struct perf_sample *sample) { u64 sample_type; char str[PAGE_SIZE_NAME_LEN]; + uint16_t e_machine =3D EM_NONE; =20 if (!dump_trace) return; =20 + sample_type =3D evsel->core.attr.sample_type; + + if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_REGS_INTR)) { + struct thread *thread =3D machine__find_thread(machine, sample->pid, sam= ple->pid); + + e_machine =3D thread__e_machine(thread, machine); + } + printf("(IP, 0x%x): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRI= x64 "\n", event->header.misc, sample->pid, sample->tid, sample->ip, sample->period, sample->addr); =20 - sample_type =3D evsel->core.attr.sample_type; - if (evsel__has_callchain(evsel)) callchain__printf(evsel, sample); =20 @@ -1114,10 +1122,10 @@ static void dump_sample(struct evsel *evsel, union = perf_event *event, branch_stack__printf(sample, evsel); =20 if (sample_type & PERF_SAMPLE_REGS_USER) - regs_user__printf(sample, arch); + regs_user__printf(sample, e_machine); =20 if (sample_type & PERF_SAMPLE_REGS_INTR) - regs_intr__printf(sample, arch); + regs_intr__printf(sample, e_machine); =20 if (sample_type & PERF_SAMPLE_STACK_USER) stack_user__printf(&sample->user_stack); @@ -1432,10 +1440,10 @@ static int machines__deliver_event(struct machines = *machines, } if (machine =3D=3D NULL) { ++evlist->stats.nr_unprocessable_samples; - dump_sample(evsel, event, sample, perf_env__arch(NULL)); + dump_sample(machine, evsel, event, sample); return 0; } - dump_sample(evsel, event, sample, perf_env__arch(machine->env)); + dump_sample(machine, evsel, event, sample); if (sample->deferred_callchain && tool->merge_deferred_callchains) { struct deferred_event *de =3D malloc(sizeof(*de)); size_t sz =3D event->header.size; @@ -2928,3 +2936,28 @@ struct perf_env *perf_session__env(struct perf_sessi= on *session) { return &session->header.env; } + +static int perf_session__e_machine_cb(struct thread *thread, + void *arg __maybe_unused) +{ + uint16_t *result =3D arg; + struct machine *machine =3D maps__machine(thread__maps(thread)); + + *result =3D thread__e_machine(thread, machine); + return *result !=3D EM_NONE ? 1 : 0; +} + +/* + * Note, a machine may have mixed 32-bit and 64-bit processes and so mixed + * e_machines. Use thread__e_machine when this matters. + */ +uint16_t perf_session__e_machine(struct perf_session *session) +{ + uint16_t e_machine =3D EM_NONE; + + machines__for_each_thread(&session->machines, + perf_session__e_machine_cb, + &e_machine); + + return e_machine =3D=3D EM_NONE ? EM_HOST : e_machine; +} diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 22d3ff877e83..eddc4c630b33 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -211,5 +211,6 @@ int perf_event__process_finished_round(const struct per= f_tool *tool, struct ordered_events *oe); =20 struct perf_env *perf_session__env(struct perf_session *session); +uint16_t perf_session__e_machine(struct perf_session *session); =20 #endif /* __PERF_SESSION_H */ diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index dc882f17f52d..c25190cdceb4 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -187,7 +187,7 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwar= f_Addr addr, Dwarf_Word * void *arg) { struct unwind_info *ui =3D arg; - const char *arch =3D perf_env__arch(ui->machine->env); + uint16_t e_machine =3D thread__e_machine(ui->thread, ui->machine); struct stack_dump *stack =3D &ui->sample->user_stack; u64 start, end; int offset; @@ -197,7 +197,7 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwar= f_Addr addr, Dwarf_Word * return false; =20 ret =3D perf_reg_value(&start, ui->sample->user_regs, - perf_arch_reg_sp(arch)); + perf_arch_reg_sp(e_machine)); if (ret) return false; =20 @@ -300,16 +300,18 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *a= rg, int max_stack, bool best_effort) { + struct machine *machine =3D maps__machine(thread__maps(thread)); struct unwind_info *ui, ui_buf =3D { .sample =3D data, .thread =3D thread, - .machine =3D maps__machine((thread__maps(thread))), + .machine =3D machine, .cb =3D cb, .arg =3D arg, .max_stack =3D max_stack, .best_effort =3D best_effort }; - const char *arch =3D perf_env__arch(ui_buf.machine->env); + uint16_t e_machine =3D thread__e_machine(thread, machine); + const char *arch =3D perf_env__arch(machine->env); Dwarf_Word ip; int err =3D -EINVAL, i; const Dwfl_Thread_Callbacks *callbacks; @@ -327,7 +329,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, if (!ui->dwfl) goto out; =20 - err =3D perf_reg_value(&ip, data->user_regs, perf_arch_reg_ip(arch)); + err =3D perf_reg_value(&ip, data->user_regs, perf_arch_reg_ip(e_machine)); if (err) goto out; =20 diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unw= ind-libunwind-local.c index 0b037e7389a0..a24b45106acd 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c @@ -572,7 +572,6 @@ static int access_mem(unw_addr_space_t __maybe_unused a= s, int __write, void *arg) { struct unwind_info *ui =3D arg; - const char *arch =3D perf_env__arch(ui->machine->env); struct stack_dump *stack =3D &ui->sample->user_stack; u64 start, end; int offset; @@ -585,7 +584,7 @@ static int access_mem(unw_addr_space_t __maybe_unused a= s, } =20 ret =3D perf_reg_value(&start, perf_sample__user_regs(ui->sample), - perf_arch_reg_sp(arch)); + perf_arch_reg_sp(thread__e_machine(ui->thread, ui->machine))); if (ret) return ret; =20 @@ -734,7 +733,7 @@ static void _unwind__finish_access(struct maps *maps) static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, void *arg, int max_stack) { - const char *arch =3D perf_env__arch(ui->machine->env); + uint16_t e_machine =3D thread__e_machine(ui->thread, ui->machine); u64 val; unw_word_t ips[max_stack]; unw_addr_space_t addr_space; @@ -742,7 +741,7 @@ static int get_entries(struct unwind_info *ui, unwind_e= ntry_cb_t cb, int ret, i =3D 0; =20 ret =3D perf_reg_value(&val, perf_sample__user_regs(ui->sample), - perf_arch_reg_ip(arch)); + perf_arch_reg_ip(e_machine)); if (ret) return ret; =20 --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 A0AD6329C69 for ; Sat, 17 Jan 2026 05:29:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627779; cv=none; b=bd4l+MKgQlBG+DEsQqG6/WOUwga3qNF4qIw3b35OLTp1Sp4xeW0SiOo51rfefUTnqVcjcCLC4Y3nMBN5l9hD+xMAKvRsjFEuAKBGkdOKfh2rPS3cii8m/bx036E7E1ypEETHsUuTFq+m2ocGmy4jLh4fZj+N+3VRvoSCBxKKXCg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627779; c=relaxed/simple; bh=MGf9/co0ByLS5RAptUdqGlKafVazCJHcso+1xccCN4Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=RnoEzVs9RTpculamGBWVIGseIq29Gcew817/r+jWdhOv6u39fHtuq3Fe5V98LSvtyIDt1QF1ZFaI9hZaNQORxcxX2bg9aKHoTCeNT4RwX6iGjgSxEgC7O4CvmA6CXXobExd+7C66+mfYZeOyNZpZyYxk7ocXe5k6Y5u8q67jYDw= 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=4X8FJQxr; arc=none smtp.client-ip=74.125.82.202 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="4X8FJQxr" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6af3eb78dso8725585eec.0 for ; Fri, 16 Jan 2026 21:29:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627776; x=1769232576; 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=4TCvh4Vl2F2EFt/f91KAA0cLNnhh1VtUSP6qDYdHXzE=; b=4X8FJQxrbBns0sfNzAJvxisb2QMVjihCq0Y9IV6ARbP3+Y3L2S9NeIoYbrlE10GUdG 2pY8L8723Ih+Eg9H7cHUocrF3Sq8LNOzH11z+M700SN7p9h/oTpaxMQQcN47COvkF2HB OM8RRFQ87PFC1dW4beF4EY0/vmQeYrvif1Wf5TS3eK8uDwVaHP2BAeUByrZoE4bSBmHF eZTO7UUazxhTyZ13q7HGQ8YqBFdJ5WJm9vQiVETaE+DJu83ZhutT78Q4QvZEAq0PhPPW pIKLnvJ48OiwBpxbV9SDgFu3BEjrcOIeC4JarlqLMCl2l/goaOoRGc0rX41Ddmzuw0wN FH3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627776; x=1769232576; 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=4TCvh4Vl2F2EFt/f91KAA0cLNnhh1VtUSP6qDYdHXzE=; b=E9lMQTiQh1TzLW4R9QC0p10C7XZU3JK2C/ol7xX49Qs8ZxJCoYO4JVHJ783GkJ9imc a5TcupYJ7w+VzlVKWtvNzwP3ZnaXrvvpKcu6PsaNfFR5IYg8TM4WxCpqmYNoCJA8F/KT IxzarsbTxDm1q+34TbRIn07RU69pRDpGfgku0uBjU6BHR/0DTaGySzp+v1Q/dd72OS8T Ntd5ndvPe8CzYHRtq8NMlxtAfNv1Fz37tcU/Rh8U0YQfz28qiVU2VAxXOL1/HYfWJDYE 8RHMQI5R/KSJtn3xONzhbJtE8jeaQBO4TOejvGxWPslaj9abwY2O3oJ9bLs4C4P4D5N5 MclA== X-Forwarded-Encrypted: i=1; AJvYcCXidWJhsRp7HAkYVb2Y0nMI2A6ty8vKTd64wDomYI+WNqDn3UBMnAOrnyODFJaDJ20Y8lroX6vJMNZ5vaE=@vger.kernel.org X-Gm-Message-State: AOJu0Ywp+LHBSHpdcAcq1YAM/71mVJNBty37Emy3KkTTtIt+WA1ortEW DxR9OgSnQew6P6CdKl1/MwQHjW+TSivHYAAx9/DC+aHb4JHwk0QHuXlPAC/zyU6KZmpl2+vgfJ5 I0b+7wfCAjQ== X-Received: from dybut9.prod.google.com ([2002:a05:7301:e0c9:b0:2b6:c085:52ca]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:50c:b0:2b0:4c56:be16 with SMTP id 5a478bee46e88-2b6b41016d0mr4300841eec.29.1768627775839; Fri, 16 Jan 2026 21:29:35 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:35 -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-10-irogers@google.com> Subject: [PATCH v1 09/23] perf dwarf-regs: Add util/dwarf-regs-arch for consistency with perf-regs 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" perf_regs.h has cross architecture functions for operating with the differing perf register constants. dwarf-regs.h is similar but for cross architecture dwarf notions of registers. For consistency move the arch parts of dwarf-regs out of util and into its own directory. Signed-off-by: Ian Rogers --- tools/perf/util/Build | 4 +--- tools/perf/util/dwarf-regs-arch/Build | 3 +++ tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-csky.c | 0 tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-powerpc.c | 0 tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-x86.c | 0 5 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/Build rename tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-csky.c (100%) rename tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-powerpc.c (100%) rename tools/perf/util/{ =3D> dwarf-regs-arch}/dwarf-regs-x86.c (100%) diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 5efec73be474..3cb1edd263cf 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -219,9 +219,7 @@ endif perf-util-$(CONFIG_LIBDW) +=3D probe-finder.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-aux.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs.o -perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-csky.o -perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-powerpc.o -perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-x86.o +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arch/ perf-util-$(CONFIG_LIBDW) +=3D debuginfo.o perf-util-$(CONFIG_LIBDW) +=3D annotate-data.o perf-util-$(CONFIG_LIBDW) +=3D libdw.o diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build new file mode 100644 index 000000000000..98bec0032606 --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -0,0 +1,3 @@ +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-csky.o +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-powerpc.o +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-x86.o diff --git a/tools/perf/util/dwarf-regs-csky.c b/tools/perf/util/dwarf-regs= -arch/dwarf-regs-csky.c similarity index 100% rename from tools/perf/util/dwarf-regs-csky.c rename to tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c diff --git a/tools/perf/util/dwarf-regs-powerpc.c b/tools/perf/util/dwarf-r= egs-arch/dwarf-regs-powerpc.c similarity index 100% rename from tools/perf/util/dwarf-regs-powerpc.c rename to tools/perf/util/dwarf-regs-arch/dwarf-regs-powerpc.c diff --git a/tools/perf/util/dwarf-regs-x86.c b/tools/perf/util/dwarf-regs-= arch/dwarf-regs-x86.c similarity index 100% rename from tools/perf/util/dwarf-regs-x86.c rename to tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 B2B39329C70 for ; Sat, 17 Jan 2026 05:29:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627780; cv=none; b=ozmAu5Fj2JG0QIDDBz/nE4qhA3CC2Jp5MoRmCvyR99EBShLdyz/aGzFfcXJooKQnCWlJZQQUWjeMMXV+T+HxbnOJ9ZPG8gmG9ORM+ARl1yw+wnSC4XVnRm96urPo9GuswYfFJ899aujV3K1Z6BnX7jpbkxAN5ezRbkw7JM+N/SE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627780; c=relaxed/simple; bh=iRDRnUQwVJu5Bqid8SR9afHsHWUbRSRMziCdqch7Y6M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=FvGxVizYzIM8LmiaofTHJMAaEmUTuEjICAMUR5fU7yIBHZHmm49njW6UN+xp/zF0tctrRf/RUtN6VVmnMDHfHg3/fla3gHXiyPXmFfp4UrJSNWrf0KlJlVMfUG9HxO10vIGqNJsE9BGvLrOncrN1X//ZX7fJwMyZkz60sTZIlVM= 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=EEgFMXMJ; arc=none smtp.client-ip=74.125.82.73 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="EEgFMXMJ" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1233b91de6bso5020948c88.1 for ; Fri, 16 Jan 2026 21:29:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627778; x=1769232578; 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=1r7j6oxFgC0ngZMI9Q8295mOsi/2CMN4d5P2svdjAjA=; b=EEgFMXMJxPu6MHpW2utjDUY3OqLzCWVdiv0rmX1iEkmjNS5STVw6h2I92iIxv8qQdO Gh6SHj4BiA63LMqMRSv4vu2ZgExzyMtQyiSt1D7KKt41z04Fmr/bajlqDi7kPNaSWluc 6WywTRkk6J6kmHTH0yzN6oEzyBhqwCwW8jI1KEefAjDN+OwRcQB8bWKqFzEC6LmALwdi gxkqf6Ii7k3mWpz05PFqHjuVG55MISb+EfSRtGHLqtYBWNrsSHrmE1wmilIKM5iblexl ud9DFMLEj9OUTdZkMk1PhzTJwfwGn3CVjo7M6A197ZGEv/Q/7U9zZGEfDs1bufbnu99O JaVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627778; x=1769232578; 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=1r7j6oxFgC0ngZMI9Q8295mOsi/2CMN4d5P2svdjAjA=; b=YyDkDx5DfEAtvUmYyuBcdHIGUUY3VTchM4xpqbfRWpGVAw6luz7DXizQ5kWt4+e+e5 yDCrYRk7i1ALdCKWtq+WG3EWdI4FsHZnbqYj6NsYc9Wre+M2Dg28biD/5NweEa2D/4KA WX3FKfsOGsCuVFw7ZuNY7HbPkG63uSmcNYazIJqXM41VveI2/ndiGDq8KuejUKSYw5CQ 8TDPaEY35KVBRahKwEEp2DrBTtDBYqjvyOQxXL/Jp5dPUap9tzqmIgy/566f+YBwN/lx ZIg2etVZC8IS1nMc4w8MxCBzI2ovBxhz7GPB7bYNb1CK8eOz2+yUA0MUJ/RDSolgB9fj QDCA== X-Forwarded-Encrypted: i=1; AJvYcCUUT+jBGxeryzL1HkT3UoDsiNwuPen/qddb3n0ZPxhcfu1Cf6IMDUxY+egpcc1HUHedMs6sIohxIgigrzE=@vger.kernel.org X-Gm-Message-State: AOJu0YzIhUMeuumBVOM0HCudRjhhiqaMUrL7vUjab62uSudGrNnagwqo uN6uRe2Rn22S4jqSh9c8iRFZBe7exbsiC4gXIU1qOQh61knHrlfPdoTYREjg/j08X4aMWUvuAPs I5vDwcvgGCQ== X-Received: from dlbto2.prod.google.com ([2002:a05:7022:3b02:b0:119:9f33:34ae]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:670b:b0:11d:fc64:9562 with SMTP id a92af1059eb24-1244b30826dmr3833057c88.1.1768627777697; Fri, 16 Jan 2026 21:29:37 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:36 -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-11-irogers@google.com> Subject: [PATCH v1 10/23] perf dwarf-regs: Remove get_arch_regnum 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" Except in dwarf-regs the function is never called. The weak function has no strong arch implementations. Remove so that the fall-through case applies. Signed-off-by: Ian Rogers --- tools/perf/util/dwarf-regs.c | 12 ------------ tools/perf/util/include/dwarf-regs.h | 4 ---- 2 files changed, 16 deletions(-) diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 28a1cfdf26d4..b2f37299147e 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -71,13 +71,6 @@ const char *get_dwarf_regstr(unsigned int n, unsigned in= t machine, unsigned int return NULL; } =20 -#if EM_HOST !=3D EM_X86_64 && EM_HOST !=3D EM_386 -__weak int get_arch_regnum(const char *name __maybe_unused) -{ - return -ENOTSUP; -} -#endif - /* Return DWARF register number from architecture register name */ int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int = flags __maybe_unused) { @@ -98,11 +91,6 @@ int get_dwarf_regnum(const char *name, unsigned int mach= ine, unsigned int flags machine =3D EM_HOST; } switch (machine) { -#if EM_HOST !=3D EM_X86_64 && EM_HOST !=3D EM_386 - case EM_HOST: - reg =3D get_arch_regnum(regname); - break; -#endif case EM_X86_64: fallthrough; case EM_386: diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index 6f1b9f6b2466..015d1ade645f 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -101,10 +101,6 @@ const char *get_dwarf_regstr(unsigned int n, unsigned = int machine, unsigned int =20 int get_x86_regnum(const char *name); =20 -#if !defined(__x86_64__) && !defined(__i386__) -int get_arch_regnum(const char *name); -#endif - /* * get_dwarf_regnum - Returns DWARF regnum from register name * name: architecture register name --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 3E64132938A for ; Sat, 17 Jan 2026 05:29:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627782; cv=none; b=cWjipYyYA1aTIOOT3iTqd5qW+Q+BnUfSDNuF5v4i61nuuaU3kkzykpbmSyDn1H4DvDcA/AMUrw3f+HkPlC4GunTDWRhVENMvRKzf5qMXh+YF0xrAWug1nourUqoLQjM3mgP0ODll63UA1KmHHomNo8I2q+Af+O79HNJCWxsWRWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627782; c=relaxed/simple; bh=nIrLmNfp55tNV+HKhG9M98ESmoytOBcqlzY1w/8OB5Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=b5rNGL3E7Yme7yWDIV0rDguMZYnveGjBlN4w5SPRTrqjUDpnk9InWBS+tla7/g7bfNKNl+nDKZsDuoBqc9cg5j/YmrMU20jxv2sI2z1Vj5Mwm5JTIkJQ1HzMJaE5TaNi/9STBRUEaYtETvThh085daEnfdV3tcL0VTRb2kaJRh0= 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=VsZG3E6f; arc=none smtp.client-ip=74.125.82.202 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="VsZG3E6f" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6ad399cd8so4788574eec.1 for ; Fri, 16 Jan 2026 21:29:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627779; x=1769232579; 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=ZVnccFhyVIdPmX1GN08af1KDJO30zSaL9HTGsky0Apo=; b=VsZG3E6f2XT1kRCHIAJREoWLO8guo5IuGmPXrYCQuKLuNL5uM8renh3vERwtp2tEiV Nh2S5EH1h+5P5u4yjca4qIkpNdKHJmxJltOuJK0+qAHUon1GiS5pf3qlP8zlBDP0mgOW kC+1ilTwc+oOUsI5wTf/enHUya+6T0ngD+NvNMZqpJUdJixfWcoNODTMoJKt0iVk5JMe THg7TNshQNS1KGE1Fv9EDT4ObXhOuEcgqbcvejFXD4LEY6rmgUyd+xaSMyGr6Jwo9d9N Wn/A11201lp0lEqKwADqX//dSnBKhYWGUa8lFe7ozhKRxmpuegdG6igvadBrMxX/EP3u ObmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627779; x=1769232579; 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=ZVnccFhyVIdPmX1GN08af1KDJO30zSaL9HTGsky0Apo=; b=qK6LUuAicDkpgMtVLhhrGXHcAjmxWchcRMveFRKTrkCmVecjnlekGBG8TQ+878KqmQ ywE+fqGnHW3GgqtJftTrdkvEWFLpi9TArEp/XRydHIz+4Y4CXPuub8Ce9p/oy2VZEKpY pM5iPlGOq7FqtrOJoRxEqsE/mkmN6Cr5eArUtVCLuWiT5zbBQL+9PjF/3D0RHv1ck90k qFc5V5AM5fn882a4T997Ok0fipdhwkCKpfUvBlFhqiRA+j50AHK1FJPE81kj13bntNQv THTTzPcN4MfQoMxcGnTDVq99nbAqvppy3ZZZ2GjW9uquKe/HzGFojjDhP/cbbJ9ekNWQ 8pmw== X-Forwarded-Encrypted: i=1; AJvYcCXpYOA2CF/6T+5O1J/xGuOoAZZcpR5Rzkm7yAd72XCI47s9E4awxx3HIGT/rjfsV9Lo9glJ7CcaygF75/0=@vger.kernel.org X-Gm-Message-State: AOJu0YxgTJcfCN99a7pmo9ckRU5CkVOzATb1kbU34kWejBfm3uKVAoi2 mZ9R7OWoFUv2p4Lf6vnneqOwysOYpIFjWe/yO43iZebTi9QZYhvmqNjO1C9zg4/6Vh+/et+vBsH OQzqkneTbcA== X-Received: from dybqu3.prod.google.com ([2002:a05:7301:6583:b0:2b6:b139:8515]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:cc14:b0:2b0:5696:26c0 with SMTP id 5a478bee46e88-2b6b4e28165mr5422981eec.2.1768627779350; Fri, 16 Jan 2026 21:29:39 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:37 -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-12-irogers@google.com> Subject: [PATCH v1 11/23] perf dwarf-regs: Clean up x86 dwarf_regnum code 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" The i386 and x86-64 register numbers differ on x86, but previously x86 was a single arch string and so this couldn't be handled. The transition to using ELF EM_* values means we can translate x86 registers correctly for either the x86-64 dwarf register mappings (from the System V ABI) or i386 register mappings. Correct the mappings. Signed-off-by: Ian Rogers --- .../util/dwarf-regs-arch/dwarf-regs-x86.c | 133 ++++++++++++++++-- tools/perf/util/dwarf-regs.c | 5 +- tools/perf/util/include/dwarf-regs.h | 3 +- 3 files changed, 129 insertions(+), 12 deletions(-) diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c b/tools/perf/= util/dwarf-regs-arch/dwarf-regs-x86.c index 7a55c65e8da6..f0c42e4d7423 100644 --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c @@ -13,10 +13,65 @@ =20 struct dwarf_regs_idx { const char *name; - int idx; + int dwarf_regnum; }; =20 -static const struct dwarf_regs_idx x86_regidx_table[] =3D { +static const struct dwarf_regs_idx i386_regidx_table[] =3D { + { "eax", 0 }, { "ax", 0 }, { "al", 0 }, + { "ecx", 1 }, { "cx", 1 }, { "cl", 1 }, + { "edx", 2 }, { "dx", 2 }, { "dl", 2 }, + { "ebx", 3 }, { "bx", 3 }, { "bl", 3 }, + { "esp", 4 }, { "sp", 4 }, { "$stack", 4}, + { "ebp", 5 }, { "bp", 5 }, + { "esi", 6 }, { "si", 6 }, + { "edi", 7 }, { "di", 7 }, + // 8 - Return Address RA + { "eflags", 9}, { "flags", 9}, + // 10 - reserved + { "st0", 11}, + { "st1", 12}, + { "st2", 13}, + { "st3", 14}, + { "st4", 15}, + { "st5", 16}, + { "st6", 17}, + { "st7", 18}, + // 19-20 - reserved + { "xmm0", 21}, + { "xmm1", 22}, + { "xmm2", 23}, + { "xmm3", 24}, + { "xmm4", 25}, + { "xmm5", 26}, + { "xmm6", 27}, + { "xmm7", 28}, + { "mm0", 29}, + { "mm1", 30}, + { "mm2", 31}, + { "mm3", 32}, + { "mm4", 33}, + { "mm5", 34}, + { "mm6", 35}, + { "mm7", 36}, + // 37-38 - unknown + { "mxcsr", 39}, // 128-bit Media Control and Status + { "es", 40}, + { "cs", 41}, + { "ss", 42}, + { "ds", 43}, + { "fs", 44}, + { "gs", 45}, + // 46-47 - reserved + { "tr", 48}, // Task Register + { "ldtr", 49}, // LDT Register + // 50-92 - reserved + { "fs.base", 92}, + { "gs.base", 93}, + // End of regular dwarf registers. + { "eip", DWARF_REG_PC }, { "ip", DWARF_REG_PC }, +}; + +static const struct dwarf_regs_idx x86_64_regidx_table[] =3D { { "rax", 0 }, { "eax", 0 }, { "ax", 0 }, { "al", 0 }, { "rdx", 1 }, { "edx", 1 }, { "dx", 1 }, { "dl", 1 }, { "rcx", 2 }, { "ecx", 2 }, { "cx", 2 }, { "cl", 2 }, @@ -33,18 +88,78 @@ static const struct dwarf_regs_idx x86_regidx_table[] = =3D { { "r13", 13 }, { "r13d", 13 }, { "r13w", 13 }, { "r13b", 13 }, { "r14", 14 }, { "r14d", 14 }, { "r14w", 14 }, { "r14b", 14 }, { "r15", 15 }, { "r15d", 15 }, { "r15w", 15 }, { "r15b", 15 }, - { "rip", DWARF_REG_PC }, + // 16 - Return Address RA + { "xmm0", 17}, + { "xmm1", 18}, + { "xmm2", 19}, + { "xmm3", 20}, + { "xmm4", 21}, + { "xmm5", 22}, + { "xmm6", 23}, + { "xmm7", 24}, + { "xmm8", 25}, + { "xmm9", 26}, + { "xmm10", 27}, + { "xmm11", 28}, + { "xmm12", 29}, + { "xmm13", 30}, + { "xmm14", 31}, + { "xmm15", 32}, + { "st0", 33}, + { "st1", 34}, + { "st2", 35}, + { "st3", 36}, + { "st4", 37}, + { "st5", 38}, + { "st6", 39}, + { "st7", 40}, + { "mm0", 41}, + { "mm1", 42}, + { "mm2", 43}, + { "mm3", 44}, + { "mm4", 45}, + { "mm5", 46}, + { "mm6", 47}, + { "mm7", 48}, + { "rflags", 49}, { "eflags", 49}, { "flags", 49}, + { "es", 50}, + { "cs", 51}, + { "ss", 52}, + { "ds", 53}, + { "fs", 54}, + { "gs", 55}, + // 56-47 - reserved + { "fs.base", 58}, + { "gs.base", 59}, + // 60-61 - reserved + { "tr", 62}, // Task Register + { "ldtr", 63}, // LDT Register + { "mxcsr", 64}, // 128-bit Media Control and Status + { "fcw", 65}, // x87 Control Word + { "fsw", 66}, // x87 Status Word + // End of regular dwarf registers. + { "rip", DWARF_REG_PC }, { "eip", DWARF_REG_PC }, { "ip", DWARF_REG_PC }, }; =20 -int get_x86_regnum(const char *name) +static int get_regnum(const struct dwarf_regs_idx *entries, size_t num_ent= ries, const char *name) { - unsigned int i; - if (*name !=3D '%') return -EINVAL; =20 - for (i =3D 0; i < ARRAY_SIZE(x86_regidx_table); i++) - if (!strcmp(x86_regidx_table[i].name, name + 1)) - return x86_regidx_table[i].idx; + name++; + for (size_t i =3D 0; i < num_entries; i++) { + if (!strcmp(entries[i].name, name)) + return entries[i].dwarf_regnum; + } return -ENOENT; } + +int __get_dwarf_regnum_i386(const char *name) +{ + return get_regnum(i386_regidx_table, ARRAY_SIZE(i386_regidx_table), name); +} + +int __get_dwarf_regnum_x86_64(const char *name) +{ + return get_regnum(x86_64_regidx_table, ARRAY_SIZE(x86_64_regidx_table), n= ame); +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index b2f37299147e..ef249dd589e3 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -92,9 +92,10 @@ int get_dwarf_regnum(const char *name, unsigned int mach= ine, unsigned int flags } switch (machine) { case EM_X86_64: - fallthrough; + reg =3D __get_dwarf_regnum_x86_64(name); + break; case EM_386: - reg =3D get_x86_regnum(regname); + reg =3D __get_dwarf_regnum_i386(name); break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index 015d1ade645f..bb5413b0fee4 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -99,7 +99,8 @@ const char *get_csky_regstr(unsigned int n, unsigned int = flags); */ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigne= d int flags); =20 -int get_x86_regnum(const char *name); +int __get_dwarf_regnum_i386(const char *name); +int __get_dwarf_regnum_x86_64(const char *name); =20 /* * get_dwarf_regnum - Returns DWARF regnum from register name --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (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 6D01732B9BC for ; Sat, 17 Jan 2026 05:29:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627784; cv=none; b=T9vB+gFVnUH/j4v/xsLRhiGwPYvFGEvrFvDoay7S6pcDRpEloc0o/j4o0jYeiVLaiS1wYEZLfayNB4EZCRiyedS/wQrr4b3U0p2Z6/7BzcvIlhHieu8w6ZcWQKfF1+Ea9d+lXyQVgVGPTDVrmvvuoBkwliv6ZcR7YEgcydg5tf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627784; c=relaxed/simple; bh=rUvI1Qb97pub0GL8ptyOPPqUXRm0+59YXuX5c9irLLA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=cqUe2Ei7vaIrA9Qs5fyixSzeF1ZQEnJElAZEP3KzrLXT94z5qCkRs6idYAABy2F2byuOqNNig2DpyJvevMjxYqmwp+ur+KuBWRwRwYTkKQ3dN+b9mxEG1h0htL2D8WvThuZW7T8Fv8ECCBetB+7giDeooF8nKh7t/Frq6loAx+g= 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=aOp/aQ82; arc=none smtp.client-ip=74.125.82.201 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="aOp/aQ82" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2ae26a77b76so4881009eec.0 for ; Fri, 16 Jan 2026 21:29:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627782; x=1769232582; 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=j0hLW1UHbXT+qiQ2vPFChWMybpQvL2qtJZcRy5QYVbE=; b=aOp/aQ82IUKD6C71x5Mo3JQ8/GVI9Zf3XzoD7wcOtccBjsCSpxyEeiB2epjkcSObzG +j1Prvmvw41ddG+C/5wy8fz86lgQWae4c4YMLDUoXfBD03611CQErgjeMQ22etQUzx1G ZneGHKqf6HtsC1qqgJGCCSUBZb9H4M50nsg+2FBo/q4UDcXHxVIPHndFZ0Qo4gzspEwX 4wHcyBBc/y8oEcAnkPb43d7nqLSp2/hCyhsOuDMofcMtu4DUjeQy/Z5t297yQt+a6h1r d6JGZB7e0dAT8dY0GUvJuS85Rn9+L18scARv+QczdqazUVNEwbyJM92dJsg4GCreeNH2 3izw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627782; x=1769232582; 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=j0hLW1UHbXT+qiQ2vPFChWMybpQvL2qtJZcRy5QYVbE=; b=jVBlcUOiAfni9QcIOgpD5jZVurucALyG5Nshk9eaZIAABAUZHU8kh4lsO7/HsRKG8L OOZATxQTVZ8MgB20syoJt48hPajUd4dtCCwaQWeX3ThITLfbMNQX2ZMgYbYp6s6lhlQ3 bDa7kDJ2QmIbiI86GSH+1SRUSISw3NlEctUNuysvPg2Z3lSg7NYSvksCvULjb2KWW2lg NHBqswA0RQQxX+RT9UId/h4PfmkuFIkFwXRjXce6iuZLOng0riR67IeWzUfOcbzoBD4T gghZebS4hnbfnEl3b89eaiUlzNMR5cShsQuDa2oBKkpIZEohsooi38S+cIadz6T4/9nh 3lQA== X-Forwarded-Encrypted: i=1; AJvYcCWHONqijPB18XTzAd4BO61K2wNFxl4UirjvizNxI98OQUBk/wwuoEECNY7AtAtW95S7/0AAuLje0TsMN14=@vger.kernel.org X-Gm-Message-State: AOJu0YzAvbXcBJfyuwy2SWFw/YyEzzpWg4LPlNZ/GRk9OOEebUQR4wBD vQPWHIWPOjHiUYFROOiRwJIHP0sE67SRfyxFYW5soiVKPmuAZhAVJLweZWgo/oriNRP4K95sssd EU/eiM1PAgQ== X-Received: from dlbqq14.prod.google.com ([2002:a05:7022:ed0e:b0:119:78ff:fe0f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6089:b0:11b:9386:8268 with SMTP id a92af1059eb24-1244b37c27fmr3504641c88.45.1768627781426; Fri, 16 Jan 2026 21:29:41 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:38 -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-13-irogers@google.com> Subject: [PATCH v1 12/23] perf dwarf-regs: Add get_dwarf_regnum_for_perf_regnum and use for x86 unwinding 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" Add a utility to map a perf register number to a dwarf register number for a particular ELF machine type. Create a generic unwind-libdw initial register initialization routine that uses this function and thereby avoids arch specific initialization. The unwind-libdw code does: 1) compute the maximum dwarf register from the set of sampled user register= s, 2) allocates a set of dwarf registers, 3) copies the sample registers into the appropriate dwarf registers. This generic solution is initially implemented for use with x86 as only get_dwarf_regnum_for_perf_regnum support for x86 is currently present. Signed-off-by: Ian Rogers --- .../util/dwarf-regs-arch/dwarf-regs-x86.c | 95 +++++++++++++++++++ tools/perf/util/dwarf-regs.c | 55 +++++++++++ tools/perf/util/include/dwarf-regs.h | 8 ++ tools/perf/util/unwind-libdw-arch/Build | 1 - .../util/unwind-libdw-arch/unwind-libdw-x86.c | 54 ----------- tools/perf/util/unwind-libdw.c | 70 ++++++++++++-- tools/perf/util/unwind-libdw.h | 2 +- 7 files changed, 222 insertions(+), 63 deletions(-) delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-x86.c diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c b/tools/perf/= util/dwarf-regs-arch/dwarf-regs-x86.c index f0c42e4d7423..cadef120aeb4 100644 --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-x86.c @@ -10,6 +10,7 @@ #include /* for strcmp */ #include /* for ARRAY_SIZE */ #include +#include "../../../arch/x86/include/uapi/asm/perf_regs.h" =20 struct dwarf_regs_idx { const char *name; @@ -163,3 +164,97 @@ int __get_dwarf_regnum_x86_64(const char *name) { return get_regnum(x86_64_regidx_table, ARRAY_SIZE(x86_64_regidx_table), n= ame); } + +int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum) +{ + static const int dwarf_i386_regnums[] =3D { + [PERF_REG_X86_AX] =3D 0, + [PERF_REG_X86_BX] =3D 3, + [PERF_REG_X86_CX] =3D 1, + [PERF_REG_X86_DX] =3D 2, + [PERF_REG_X86_SI] =3D 6, + [PERF_REG_X86_DI] =3D 7, + [PERF_REG_X86_BP] =3D 5, + [PERF_REG_X86_SP] =3D 4, + [PERF_REG_X86_IP] =3D 8, + [PERF_REG_X86_FLAGS] =3D 9, + [PERF_REG_X86_CS] =3D 41, + [PERF_REG_X86_SS] =3D 42, + [PERF_REG_X86_DS] =3D 43, + [PERF_REG_X86_ES] =3D 40, + [PERF_REG_X86_FS] =3D 44, + [PERF_REG_X86_GS] =3D 45, + [PERF_REG_X86_XMM0] =3D 21, + [PERF_REG_X86_XMM1] =3D 22, + [PERF_REG_X86_XMM2] =3D 23, + [PERF_REG_X86_XMM3] =3D 24, + [PERF_REG_X86_XMM4] =3D 25, + [PERF_REG_X86_XMM5] =3D 26, + [PERF_REG_X86_XMM6] =3D 27, + [PERF_REG_X86_XMM7] =3D 28, + }; + + if (perf_regnum =3D=3D 0) + return 0; + + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_i386_regnums)= || + dwarf_i386_regnums[perf_regnum] =3D=3D 0) + return -ENOENT; + + return dwarf_i386_regnums[perf_regnum]; +} + +int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum) +{ + static const int dwarf_x86_64_regnums[] =3D { + [PERF_REG_X86_AX] =3D 0, + [PERF_REG_X86_BX] =3D 3, + [PERF_REG_X86_CX] =3D 2, + [PERF_REG_X86_DX] =3D 1, + [PERF_REG_X86_SI] =3D 4, + [PERF_REG_X86_DI] =3D 5, + [PERF_REG_X86_BP] =3D 6, + [PERF_REG_X86_SP] =3D 7, + [PERF_REG_X86_IP] =3D 16, + [PERF_REG_X86_FLAGS] =3D 49, + [PERF_REG_X86_CS] =3D 51, + [PERF_REG_X86_SS] =3D 52, + [PERF_REG_X86_DS] =3D 53, + [PERF_REG_X86_ES] =3D 50, + [PERF_REG_X86_FS] =3D 54, + [PERF_REG_X86_GS] =3D 55, + [PERF_REG_X86_R8] =3D 8, + [PERF_REG_X86_R9] =3D 9, + [PERF_REG_X86_R10] =3D 10, + [PERF_REG_X86_R11] =3D 11, + [PERF_REG_X86_R12] =3D 12, + [PERF_REG_X86_R13] =3D 13, + [PERF_REG_X86_R14] =3D 14, + [PERF_REG_X86_R15] =3D 15, + [PERF_REG_X86_XMM0] =3D 17, + [PERF_REG_X86_XMM1] =3D 18, + [PERF_REG_X86_XMM2] =3D 19, + [PERF_REG_X86_XMM3] =3D 20, + [PERF_REG_X86_XMM4] =3D 21, + [PERF_REG_X86_XMM5] =3D 22, + [PERF_REG_X86_XMM6] =3D 23, + [PERF_REG_X86_XMM7] =3D 24, + [PERF_REG_X86_XMM8] =3D 25, + [PERF_REG_X86_XMM9] =3D 26, + [PERF_REG_X86_XMM10] =3D 27, + [PERF_REG_X86_XMM11] =3D 28, + [PERF_REG_X86_XMM12] =3D 29, + [PERF_REG_X86_XMM13] =3D 30, + [PERF_REG_X86_XMM14] =3D 31, + [PERF_REG_X86_XMM15] =3D 32, + }; + + if (perf_regnum =3D=3D 0) + return 0; + + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_x86_64_regnum= s) || + dwarf_x86_64_regnums[perf_regnum] =3D=3D 0) + return -ENOENT; + + return dwarf_x86_64_regnums[perf_regnum]; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index ef249dd589e3..1f7d892612df 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -103,3 +103,58 @@ int get_dwarf_regnum(const char *name, unsigned int ma= chine, unsigned int flags free(regname); return reg; } + +static int get_libdw_frame_nregs(unsigned int machine, unsigned int flags = __maybe_unused) +{ + switch (machine) { + case EM_X86_64: + return 17; + case EM_386: + return 9; + case EM_ARM: + return 16; + case EM_AARCH64: + return 97; + case EM_CSKY: + return 38; + case EM_S390: + return 32; + case EM_PPC: + case EM_PPC64: + return 145; + case EM_RISCV: + return 66; + case EM_SPARC: + case EM_SPARCV9: + return 103; + case EM_LOONGARCH: + return 74; + default: + return 0; + } +} + +int get_dwarf_regnum_for_perf_regnum(int perf_regnum, unsigned int machine, + unsigned int flags, bool only_libdw_supported) +{ + int reg; + + switch (machine) { + case EM_X86_64: + reg =3D __get_dwarf_regnum_for_perf_regnum_x86_64(perf_regnum); + break; + case EM_386: + reg =3D __get_dwarf_regnum_for_perf_regnum_i386(perf_regnum); + break; + default: + pr_err("ELF MACHINE %x is not supported.\n", machine); + return -ENOENT; + } + if (reg >=3D 0 && only_libdw_supported) { + int nregs =3D get_libdw_frame_nregs(machine, flags); + + if (reg >=3D nregs) + reg =3D -ENOENT; + } + return reg; +} diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index bb5413b0fee4..00881f1d45d6 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -101,6 +101,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned i= nt machine, unsigned int =20 int __get_dwarf_regnum_i386(const char *name); int __get_dwarf_regnum_x86_64(const char *name); +int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum); +int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum); =20 /* * get_dwarf_regnum - Returns DWARF regnum from register name @@ -109,6 +111,12 @@ int __get_dwarf_regnum_x86_64(const char *name); */ int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int = flags); =20 +/* + * get_dwarf_regnum - Returns DWARF regnum from perf register number. + */ +int get_dwarf_regnum_for_perf_regnum(int perf_regnum, unsigned int machine= , unsigned int flags, + bool only_libdw_supported); + void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc= *op_loc); =20 #else /* HAVE_LIBDW_SUPPORT */ diff --git a/tools/perf/util/unwind-libdw-arch/Build b/tools/perf/util/unwi= nd-libdw-arch/Build index ef17a83a7813..5b5682029953 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,4 +1,3 @@ -perf-util-y +=3D unwind-libdw-x86.o perf-util-y +=3D unwind-libdw-arm.o perf-util-y +=3D unwind-libdw-arm64.o perf-util-y +=3D unwind-libdw-csky.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-x86.c b/tools/p= erf/util/unwind-libdw-arch/unwind-libdw-x86.c deleted file mode 100644 index dd27545a4a68..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-x86.c +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include "../arch/x86/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_x86(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[17]; - unsigned nregs; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_X86_##r); \ - val; \ -}) - - if (user_regs->abi =3D=3D PERF_SAMPLE_REGS_ABI_32) { - dwarf_regs[0] =3D REG(AX); - dwarf_regs[1] =3D REG(CX); - dwarf_regs[2] =3D REG(DX); - dwarf_regs[3] =3D REG(BX); - dwarf_regs[4] =3D REG(SP); - dwarf_regs[5] =3D REG(BP); - dwarf_regs[6] =3D REG(SI); - dwarf_regs[7] =3D REG(DI); - dwarf_regs[8] =3D REG(IP); - nregs =3D 9; - } else { - dwarf_regs[0] =3D REG(AX); - dwarf_regs[1] =3D REG(DX); - dwarf_regs[2] =3D REG(CX); - dwarf_regs[3] =3D REG(BX); - dwarf_regs[4] =3D REG(SI); - dwarf_regs[5] =3D REG(DI); - dwarf_regs[6] =3D REG(BP); - dwarf_regs[7] =3D REG(SP); - 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(IP); - nregs =3D 17; - } - - return dwfl_thread_state_registers(thread, 0, nregs, dwarf_regs); -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index c25190cdceb4..055dab921442 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -6,6 +6,7 @@ #include #include "debug.h" #include "dso.h" +#include #include "unwind.h" #include "unwind-libdw.h" #include "machine.h" @@ -225,6 +226,59 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwa= rf_Addr addr, Dwarf_Word * return true; } =20 +static bool libdw_set_initial_registers_generic(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; + int max_dwarf_reg =3D 0; + bool ret; + uint16_t e_machine =3D ui->e_machine; + int e_flags =3D 0; + uint64_t ip_perf_reg =3D perf_arch_reg_ip(e_machine); + Dwarf_Word val =3D 0; + + + /* + * For every possible perf register in the bitmap determine the dwarf + * register and use to compute the max. + */ + for (int perf_reg =3D 0; perf_reg < 64; perf_reg++) { + if (user_regs->mask & (1ULL << perf_reg)) { + int dwarf_reg =3D + get_dwarf_regnum_for_perf_regnum(perf_reg, e_machine, + e_flags, + /*only_libdw_supported=3D*/true); + if (dwarf_reg > max_dwarf_reg) + max_dwarf_reg =3D dwarf_reg; + } + } + + dwarf_regs =3D calloc(max_dwarf_reg + 1, sizeof(*dwarf_regs)); + if (!dwarf_regs) + return false; + + for (int perf_reg =3D 0; perf_reg < 64; perf_reg++) { + if (user_regs->mask & (1ULL << perf_reg)) { + int dwarf_reg =3D + get_dwarf_regnum_for_perf_regnum(perf_reg, e_machine, + e_flags, + /*only_libdw_supported=3D*/true); + if (dwarf_reg >=3D 0) { + val =3D 0; + if (perf_reg_value(&val, user_regs, perf_reg) =3D=3D 0) + dwarf_regs[dwarf_reg] =3D val; + } + } + } + if (perf_reg_value(&val, user_regs, ip_perf_reg) =3D=3D 0) + dwfl_thread_state_register_pc(thread, val); + + ret =3D dwfl_thread_state_registers(thread, 0, max_dwarf_reg + 1, dwarf_r= egs); + free(dwarf_regs); + return ret; +} + #define DEFINE_DWFL_THREAD_CALLBACKS(arch) \ static const Dwfl_Thread_Callbacks callbacks_##arch =3D { \ .next_thread =3D next_thread, \ @@ -232,7 +286,12 @@ static const Dwfl_Thread_Callbacks callbacks_##arch = =3D { \ .set_initial_registers =3D libdw_set_initial_registers_##arch, \ } =20 -DEFINE_DWFL_THREAD_CALLBACKS(x86); +static const Dwfl_Thread_Callbacks callbacks_generic =3D { + .next_thread =3D next_thread, + .memory_read =3D memory_read, + .set_initial_registers =3D libdw_set_initial_registers_generic, +}; + DEFINE_DWFL_THREAD_CALLBACKS(arm); DEFINE_DWFL_THREAD_CALLBACKS(arm64); DEFINE_DWFL_THREAD_CALLBACKS(csky); @@ -257,12 +316,8 @@ static const Dwfl_Thread_Callbacks *get_thread_callbac= ks(const char *arch) return &callbacks_riscv; else if (!strcmp(arch, "s390")) return &callbacks_s390; - else if (!strcmp(arch, "x86")) - return &callbacks_x86; =20 - pr_err("Fail to get thread callbacks for arch %s, returns NULL\n", - arch); - return NULL; + return &callbacks_generic; } =20 static int @@ -301,6 +356,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, bool best_effort) { struct machine *machine =3D maps__machine(thread__maps(thread)); + uint16_t e_machine =3D thread__e_machine(thread, machine); struct unwind_info *ui, ui_buf =3D { .sample =3D data, .thread =3D thread, @@ -308,9 +364,9 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, .cb =3D cb, .arg =3D arg, .max_stack =3D max_stack, + .e_machine =3D e_machine, .best_effort =3D best_effort }; - uint16_t e_machine =3D thread__e_machine(thread, machine); const char *arch =3D perf_env__arch(machine->env); Dwarf_Word ip; int err =3D -EINVAL, i; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 574b29848cce..496e5898e7ef 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,7 +9,6 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw_set_initial_registers_x86(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_arm(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_arm64(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_csky(Dwfl_Thread *thread, void *arg); @@ -28,6 +27,7 @@ struct unwind_info { void *arg; int max_stack; int idx; + uint16_t e_machine; bool best_effort; struct unwind_entry entries[]; }; --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 4097B32C92E for ; Sat, 17 Jan 2026 05:29:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627789; cv=none; b=HfWE/4pW3X84bucX2xrKwGdr0zHph5mhGnVqTbOAFd5EPm7b3hsCSCwXeowbTTbROz/Z5FNbe2fk/XAeQzUSOnrrLqN5FnhjcCMtEZYO2mdKNkdbsBAe/O+LO3s5ikrbD83kFxpdZ9Da/CihWaQ9s6atuVuhPtixdkHIlfwQHoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627789; c=relaxed/simple; bh=C1HaNvXTzDF+GFocEumuatdovRPHfAiSauX/HU1DN1Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GGRP9ntgtcHmfIGh2IsbszlJlsKJ34z8u/dxZ5uD8geC1CbKHvTjfbPNtaL3V0fNnfo+wHlTekYx9sYstff2DrFLpQTdPybAJp8nyhA7hq/oE6Ox33drzt2cukAXBSx3zFPIJCyYTI15IblxXE4TuXLGQPXtLoLsmaL3TTTz5Q8= 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=EFAd5D+M; arc=none smtp.client-ip=74.125.82.73 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="EFAd5D+M" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1233b91de6bso5021013c88.1 for ; Fri, 16 Jan 2026 21:29:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627783; x=1769232583; 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=uUzN9Y1aSzyUn7IkPpsP+ciLuVYqFUqLe8fSLq1UShc=; b=EFAd5D+Mjs9q8sHsrn/C4mPZqQFx3b/xoCj6bTlZ24qQ8cBHzg2IvgKztvrXmopBhC UWo6hO9PvwixlM/rCnBDoG3JuSxFK3ZX5uuohZGj1aopU2wc0WgGOF+Eh2BQsfYJabb6 yJvs3LcjVgb6EjK+bHUck7A+ZpoYg6n5cv2kUXsujlYPjlL5bTwN4hccuNwsJm/BEoLP J5lA49vvYhRNo6OyQPMbGXIriwe09BduSdNoqjg6ysU8H6HhXi4landYRyrqFdnOYQXz 5j12stSHn9EQPrmLO45m8i91n0MHmdp+9ESenQoyrZH6UCtPejisCIN//0/epXUKduVF M3ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627783; x=1769232583; 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=uUzN9Y1aSzyUn7IkPpsP+ciLuVYqFUqLe8fSLq1UShc=; b=Auj/vEFrVJxWrTaScz4q2cHsqHshV/7jzZDNCRln+GPhrtZ5ykI+rf3RBs1FDi8kEQ G+S1pHtrGOSQtxcuXP4upMLQpZS/bjJGoqFouBf4gLhrdsXqQ8XKPPGXbo6WYSYLvh5g igpl9nxrYH2ZWYjCz0QWvPeg0TssVgqxgBshJ5aNpk7FUul7Fr+aDFLRTP5wtjUlu5Cz HmF/mddPnYCCoedsbYBRtEJe+Xn97zXsJ/xX/ueEscdF6VXfOfQuxG7ZgGu78UtJ2+dx Z2izwHZ8/UMHk8ofLM1wqo/5Q/1KjV0GvcJYyn8ki59/2fmo/eqaPK1jz4Ol0Xa/6t1Y XQxA== X-Forwarded-Encrypted: i=1; AJvYcCXTcnta9x9POCJ+pWX49sNC68Mu1hbRalP8l6fdIdVs5XvmwTH3gbS66WWThXjqMt8kuddvx63Fb/QQZWE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8bNyDHFVpRGELm64ZzDi6zgqlRnk+Pnwid83rOFcDXdc+AJuZ eHp4Vvamf9GGCeM7LL8oaEiGeNYDFpVAk0e6+L+Gczw2gD1nUNxHhHVZYIjg8hLtd9ZBMpoavT7 K+Bdygtv7iQ== X-Received: from dlae5.prod.google.com ([2002:a05:701b:2305:b0:123:2aa4:47a4]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:660f:b0:123:2d00:1668 with SMTP id a92af1059eb24-1244b37f8bdmr4510370c88.49.1768627783323; Fri, 16 Jan 2026 21:29:43 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:39 -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-14-irogers@google.com> Subject: [PATCH v1 13/23] perf dwarf-regs: Add basic get_dwarf_regnum for most architectures 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" Add a basic get_dwarf_regnum implementation for most architectures by using the get_dwarf_regstr tables and returning the index of the name within the table. Some minor name and constification clean up for csky. Signed-off-by: Ian Rogers --- .../util/dwarf-regs-arch/dwarf-regs-csky.c | 24 +++++++- tools/perf/util/dwarf-regs.c | 58 +++++++++++++++++-- tools/perf/util/include/dwarf-regs.h | 5 +- 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c b/tools/perf= /util/dwarf-regs-arch/dwarf-regs-csky.c index d38ef1f07f3e..86394ed46397 100644 --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c @@ -2,11 +2,12 @@ // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. // Mapping of DWARF debug register numbers into register names. =20 +#include #include #include =20 #define CSKY_ABIV2_MAX_REGS 73 -const char *csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS] =3D { +static const char * const csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS]= =3D { /* r0 ~ r8 */ "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", "%regs2", "%regs3", /* r9 ~ r15 */ @@ -27,7 +28,7 @@ const char *csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_RE= GS] =3D { }; =20 #define CSKY_ABIV1_MAX_REGS 57 -const char *csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS] =3D { +static const char * const csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS]= =3D { /* r0 ~ r8 */ "%sp", "%regs9", "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", /* r9 ~ r15 */ @@ -41,10 +42,27 @@ const char *csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_= REGS] =3D { "%epc", }; =20 -const char *get_csky_regstr(unsigned int n, unsigned int flags) +const char *__get_csky_regstr(unsigned int n, unsigned int flags) { if (flags & EF_CSKY_ABIV2) return (n < CSKY_ABIV2_MAX_REGS) ? csky_dwarf_regs_table_abiv2[n] : NULL; =20 return (n < CSKY_ABIV1_MAX_REGS) ? csky_dwarf_regs_table_abiv1[n] : NULL; } + +static int __get_dwarf_regnum(const char *const *regstr, size_t num_regstr= , const char *name) +{ + for (size_t i =3D 0; i < num_regstr; i++) { + if (regstr[i] && !strcmp(regstr[i], name)) + return i; + } + return -ENOENT; +} + +int __get_csky_regnum(const char *name, unsigned int flags) +{ + if (flags & EF_CSKY_ABIV2) + return __get_dwarf_regnum(csky_dwarf_regs_table_abiv2, CSKY_ABIV2_MAX_RE= GS, name); + + return __get_dwarf_regnum(csky_dwarf_regs_table_abiv1, CSKY_ABIV1_MAX_REG= S, name); +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 1f7d892612df..dffa0c8bdd14 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -27,11 +27,11 @@ #include "../arch/mips/include/dwarf-regs-table.h" #include "../arch/loongarch/include/dwarf-regs-table.h" =20 -#define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] := NULL) - /* Return architecture dependent register string (for kprobe-tracer) */ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigne= d int flags) { + #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] = : NULL) + if (machine =3D=3D EM_NONE) { /* Generic arch - use host arch */ machine =3D EM_HOST; @@ -46,7 +46,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int= machine, unsigned int case EM_AARCH64: return __get_dwarf_regstr(aarch64_regstr_tbl, n); case EM_CSKY: - return get_csky_regstr(n, flags); + return __get_csky_regstr(n, flags); case EM_SH: return __get_dwarf_regstr(sh_regstr_tbl, n); case EM_S390: @@ -69,15 +69,28 @@ const char *get_dwarf_regstr(unsigned int n, unsigned i= nt machine, unsigned int pr_err("ELF MACHINE %x is not supported.\n", machine); } return NULL; + + #undef __get_dwarf_regstr +} + +static int __get_dwarf_regnum(const char *const *regstr, size_t num_regstr= , const char *name) +{ + for (size_t i =3D 0; i < num_regstr; i++) { + if (regstr[i] && !strcmp(regstr[i], name)) + return i; + } + return -ENOENT; } =20 /* Return DWARF register number from architecture register name */ -int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int = flags __maybe_unused) +int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int = flags) { char *regname =3D strdup(name); int reg =3D -1; char *p; =20 + #define _get_dwarf_regnum(tbl, name) __get_dwarf_regnum(tbl, ARRAY_SIZE(t= bl), name) + if (regname =3D=3D NULL) return -EINVAL; =20 @@ -97,11 +110,48 @@ int get_dwarf_regnum(const char *name, unsigned int ma= chine, unsigned int flags case EM_386: reg =3D __get_dwarf_regnum_i386(name); break; + case EM_ARM: + reg =3D _get_dwarf_regnum(arm_regstr_tbl, name); + break; + case EM_AARCH64: + reg =3D _get_dwarf_regnum(aarch64_regstr_tbl, name); + break; + case EM_CSKY: + reg =3D __get_csky_regnum(name, flags); + break; + case EM_SH: + reg =3D _get_dwarf_regnum(sh_regstr_tbl, name); + break; + case EM_S390: + reg =3D _get_dwarf_regnum(s390_regstr_tbl, name); + break; + case EM_PPC: + case EM_PPC64: + reg =3D _get_dwarf_regnum(powerpc_regstr_tbl, name); + break; + case EM_RISCV: + reg =3D _get_dwarf_regnum(riscv_regstr_tbl, name); + break; + case EM_SPARC: + case EM_SPARCV9: + reg =3D _get_dwarf_regnum(sparc_regstr_tbl, name); + break; + case EM_XTENSA: + reg =3D _get_dwarf_regnum(xtensa_regstr_tbl, name); + break; + case EM_MIPS: + reg =3D _get_dwarf_regnum(mips_regstr_tbl, name); + break; + case EM_LOONGARCH: + reg =3D _get_dwarf_regnum(loongarch_regstr_tbl, name); + break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); } free(regname); return reg; + + #undef _get_dwarf_regnum } =20 static int get_libdw_frame_nregs(unsigned int machine, unsigned int flags = __maybe_unused) diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index 00881f1d45d6..a120c97a5fac 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -89,8 +89,6 @@ #define DWARF_REG_FB 0xd3affb /* random number */ =20 #ifdef HAVE_LIBDW_SUPPORT -const char *get_csky_regstr(unsigned int n, unsigned int flags); - /** * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum. * @n: DWARF register number. @@ -99,6 +97,9 @@ const char *get_csky_regstr(unsigned int n, unsigned int = flags); */ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigne= d int flags); =20 +const char *__get_csky_regstr(unsigned int n, unsigned int flags); +int __get_csky_regnum(const char *name, unsigned int flags); + int __get_dwarf_regnum_i386(const char *name); int __get_dwarf_regnum_x86_64(const char *name); int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum); --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (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 1D3F531C576 for ; Sat, 17 Jan 2026 05:29:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627787; cv=none; b=tukjTQBsBJpqNSgGc/1aiiz8sbiun8LhKd0pL1aBPBVks0sMnMyFBQb7MdJS8EeaDICf3p976wQhMfVc1LHLwIl+qd1eJUUvIBBszbJQ7G1uKSzde6j0km7b73Nnq6nR8jHdD+lmXAOwnPS3XhEjoA9zXjsIJcIuaC1+c3um0/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627787; c=relaxed/simple; bh=R1M3dDsAVl7DyE1NbBGh3oIiHphyh+StcvM6+r2grwc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=QIxmBrDRZxnbPylbCrIQytVzYMd9bkDDMKPDY386le3YmP1bWkkE3pfR3z/xvNyQLOuEhN53fx3DKnSK1HKXv7J1ltXtYI4cELzeSXDZev/f+NI768nOpiIirHQwLnCB+wmRri9pVjHQVEuOhRJteVpHv92PAgKxnpFWAinSD7o= 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=0++iWftb; arc=none smtp.client-ip=74.125.82.201 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="0++iWftb" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2ae56205588so4575584eec.1 for ; Fri, 16 Jan 2026 21:29:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627785; x=1769232585; 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=+mdebosKkRDkwjrbfsOd2ME6cbYys2wY/+PUeL1P9Rc=; b=0++iWftb/0iBcgaGSv9GzhKbUpXCLCbVD29aawI1xsPOwzy2JflIKPKbY3fC7CLF/8 MbCTpeQ9SUpNnFJnCZbtBYBcqQGx2f0aeRMjRZOXTmeCYKKTH7Yja/F3/Ey4kgsEdBQn iqSFQCv23w6RGI1ybEZr5kxIdgoBtya7SwAJjBzdgUX9xKJoR60ZF2ulm8NyIuDBCTRp UoQD6kZfTZWMu7/w2An9wYIWHvIZj/wtRy016prRzsIvH9Zw+WGM2doAFLL2gC2bN9V9 /HvY42L8bsFjfztzxQPf2K9ouUStzO03hKUEaiVZq3vOFrz7pXhyT2vhAZhwtEeZmwUi stzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627785; x=1769232585; 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=+mdebosKkRDkwjrbfsOd2ME6cbYys2wY/+PUeL1P9Rc=; b=aB/Po6u8DMIFqQHl4ZOLD2bWPxiu0Fwp/LqI2jng2XQ7C0JlVpx15ORzPbUN6AZoe9 ckgIT/DDUbLxO+mvkol8c39joBGyYQD9yRIJi/9iONHWIdGs7Cow9zWg6ABsvXI2JJrt 4TdFq3zCCxUbxZZCl9JX+pVGMRWSkrAE3lHWgirFTvGoTRnHK+KXetL1dVjhCsiRUF3N 9Ltl8KdklOVXysJrRMcyWG2Rtyn7Gzu+aS8sgb9rO9NmsCu8EDdfPiGqXpBsMsUgLuXf aOQthcIyXBOEx3QBbwRcn+5Hmw8vzKAXgmWyT+cbeAhy/B+PDyg7OPs6qsHIvCb2v7hh 1Gcg== X-Forwarded-Encrypted: i=1; AJvYcCVHr1dFatdM1gbX/w94EuCrhdesznfUfA/O5PEFLQ/2OYLGCN84yak4TRX0WWFcm9e2gaSTWbx+pxaC/bY=@vger.kernel.org X-Gm-Message-State: AOJu0YyG/xmgG4olfs1I4WgnMd8vmou9w8EQCS5g35LywZjh4ep0YQdg m4kdVAiHJsvXEtWshQJJTi0CK1/cl/jFRCLxzih6gpa0mksb9qy4EUxNXNPbLr0hHYxW7GGUrdr zx44MwQc2RA== X-Received: from dlag22.prod.google.com ([2002:a05:701b:2516:b0:124:4ff9:fb25]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:90b:b0:119:e56c:18a0 with SMTP id a92af1059eb24-1244a71467dmr4281835c88.8.1768627785240; Fri, 16 Jan 2026 21:29:45 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:40 -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-15-irogers@google.com> Subject: [PATCH v1 14/23] perf dwarf-regs: Add ARM 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. Signed-off-by: Ian Rogers --- tools/perf/util/dwarf-regs-arch/Build | 2 + .../util/dwarf-regs-arch/dwarf-regs-arm.c | 12 ++++ .../util/dwarf-regs-arch/dwarf-regs-arm64.c | 12 ++++ tools/perf/util/dwarf-regs.c | 6 ++ tools/perf/util/include/dwarf-regs.h | 3 + tools/perf/util/unwind-libdw-arch/Build | 2 - .../util/unwind-libdw-arch/unwind-libdw-arm.c | 39 ------------ .../unwind-libdw-arch/unwind-libdw-arm64.c | 61 ------------------- tools/perf/util/unwind-libdw.c | 8 +-- tools/perf/util/unwind-libdw.h | 2 - 10 files changed, 36 insertions(+), 111 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-arm.c create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-arm.c delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-arm64.c diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build index 98bec0032606..3f19a9ec47c7 100644 --- a/tools/perf/util/dwarf-regs-arch/Build +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -1,3 +1,5 @@ +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm64.o +perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-csky.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-powerpc.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-x86.o diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm.c b/tools/perf/= util/dwarf-regs-arch/dwarf-regs-arm.c new file mode 100644 index 000000000000..42c6c0635612 --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/arm/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum) +{ + if (perf_regnum < 0 || perf_regnum >=3D PERF_REG_ARM_MAX) + return -ENOENT; + + return perf_regnum; +} diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c b/tools/per= f/util/dwarf-regs-arch/dwarf-regs-arm64.c new file mode 100644 index 000000000000..593ca7d4fccc --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/arm64/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum) +{ + if (perf_regnum < 0 || perf_regnum >=3D PERF_REG_ARM64_MAX) + return -ENOENT; + + return perf_regnum; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index dffa0c8bdd14..c472ec5e4d1a 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -196,6 +196,12 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, = unsigned int machine, case EM_386: reg =3D __get_dwarf_regnum_for_perf_regnum_i386(perf_regnum); break; + case EM_ARM: + reg =3D __get_dwarf_regnum_for_perf_regnum_arm(perf_regnum); + break; + case EM_AARCH64: + reg =3D __get_dwarf_regnum_for_perf_regnum_arm64(perf_regnum); + break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); return -ENOENT; diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index a120c97a5fac..a52df8d1b138 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -105,6 +105,9 @@ int __get_dwarf_regnum_x86_64(const char *name); int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum); int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum); =20 +int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum); +int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum); + /* * get_dwarf_regnum - Returns DWARF regnum from register name * name: architecture register name diff --git a/tools/perf/util/unwind-libdw-arch/Build b/tools/perf/util/unwi= nd-libdw-arch/Build index 5b5682029953..79c3bbdc2dee 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,5 +1,3 @@ -perf-util-y +=3D unwind-libdw-arm.o -perf-util-y +=3D unwind-libdw-arm64.o perf-util-y +=3D unwind-libdw-csky.o perf-util-y +=3D unwind-libdw-loongarch.o perf-util-y +=3D unwind-libdw-powerpc.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm.c b/tools/p= erf/util/unwind-libdw-arch/unwind-libdw-arm.c deleted file mode 100644 index 56e9b5975bcc..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm.c +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include "../arch/arm/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_arm(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[PERF_REG_ARM_MAX]; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_ARM_##r); \ - val; \ -}) - - 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(FP); - dwarf_regs[12] =3D REG(IP); - dwarf_regs[13] =3D REG(SP); - dwarf_regs[14] =3D REG(LR); - dwarf_regs[15] =3D REG(PC); - - return dwfl_thread_state_registers(thread, 0, PERF_REG_ARM_MAX, - dwarf_regs); -} diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm64.c b/tools= /perf/util/unwind-libdw-arch/unwind-libdw-arm64.c deleted file mode 100644 index 29b6833e036c..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-arm64.c +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include "../arch/arm64/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_arm64(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[PERF_REG_ARM64_MAX], dwarf_pc; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \ - val; \ -}) - - dwarf_regs[0] =3D REG(X0); - dwarf_regs[1] =3D REG(X1); - dwarf_regs[2] =3D REG(X2); - dwarf_regs[3] =3D REG(X3); - dwarf_regs[4] =3D REG(X4); - dwarf_regs[5] =3D REG(X5); - dwarf_regs[6] =3D REG(X6); - dwarf_regs[7] =3D REG(X7); - dwarf_regs[8] =3D REG(X8); - dwarf_regs[9] =3D REG(X9); - dwarf_regs[10] =3D REG(X10); - dwarf_regs[11] =3D REG(X11); - dwarf_regs[12] =3D REG(X12); - dwarf_regs[13] =3D REG(X13); - dwarf_regs[14] =3D REG(X14); - dwarf_regs[15] =3D REG(X15); - dwarf_regs[16] =3D REG(X16); - dwarf_regs[17] =3D REG(X17); - dwarf_regs[18] =3D REG(X18); - dwarf_regs[19] =3D REG(X19); - dwarf_regs[20] =3D REG(X20); - dwarf_regs[21] =3D REG(X21); - dwarf_regs[22] =3D REG(X22); - dwarf_regs[23] =3D REG(X23); - dwarf_regs[24] =3D REG(X24); - dwarf_regs[25] =3D REG(X25); - dwarf_regs[26] =3D REG(X26); - dwarf_regs[27] =3D REG(X27); - dwarf_regs[28] =3D REG(X28); - dwarf_regs[29] =3D REG(X29); - dwarf_regs[30] =3D REG(LR); - dwarf_regs[31] =3D REG(SP); - - if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX, - dwarf_regs)) - return false; - - dwarf_pc =3D REG(PC); - dwfl_thread_state_register_pc(thread, dwarf_pc); - - return true; -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index 055dab921442..8f291f9f9469 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -292,8 +292,6 @@ static const Dwfl_Thread_Callbacks callbacks_generic = =3D { .set_initial_registers =3D libdw_set_initial_registers_generic, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(arm); -DEFINE_DWFL_THREAD_CALLBACKS(arm64); DEFINE_DWFL_THREAD_CALLBACKS(csky); DEFINE_DWFL_THREAD_CALLBACKS(loongarch); DEFINE_DWFL_THREAD_CALLBACKS(powerpc); @@ -302,11 +300,7 @@ DEFINE_DWFL_THREAD_CALLBACKS(s390); =20 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) { - if (!strcmp(arch, "arm")) - return &callbacks_arm; - else if (!strcmp(arch, "arm64")) - return &callbacks_arm64; - else if (!strcmp(arch, "csky")) + if (!strcmp(arch, "csky")) return &callbacks_csky; else if (!strcmp(arch, "loongarch")) return &callbacks_loongarch; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 496e5898e7ef..fe3ae2a768ad 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,8 +9,6 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw_set_initial_registers_arm(Dwfl_Thread *thread, void *arg); -bool libdw_set_initial_registers_arm64(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_csky(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_loongarch(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 BC67C32D7C7 for ; Sat, 17 Jan 2026 05:29:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627789; cv=none; b=AsLgGFXD6j2vI1JFuWdr62a85QqBhPbh16imKbMXhKGLpbtrb+MfzJMrZfxnUcnqqh8rco1fDs++NlFSOLrSvrd0FOI3Mn6ADyuAqAodgQAy9aN4CZpTw1IvIzDlbsnKoz5e+FGtVZlSFdlVXLVjXTkz5CTR7qnMmcg378hERV8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627789; c=relaxed/simple; bh=JGRW69Ebv9XpmUXKYhV6JdipsoyGaj5JSbeie+Z5J8A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=AvJADsAE0ln9UCX/igTqrFyhHznj4gBGwWAwP+Z2bq2dGxvoeDVcKYqrlU9d0lR2vi45g+GHcf32RyqXhZxNDeWnb3eOFfE/HpX0pFsujd0Q6tHcCrjWt/sPth+1kN4TE6yuPAiOKUM9qnd/4pNQLktkuRK3JrM9n/Zj6CEDMvo= 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=Y3IgMpwN; arc=none smtp.client-ip=74.125.82.202 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="Y3IgMpwN" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6af3eb78dso8726028eec.0 for ; Fri, 16 Jan 2026 21:29:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627787; x=1769232587; 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=eHsNO/7z8jjFX1Qc/WXEy+tfgyKsRWXmvXzihFXmRbQ=; b=Y3IgMpwNzeTtx4sNdwCF7CDGAlcZteG2gEWoeDrmfKZzJrNhjKPfo6LNT023FAdg8X nhrRKVcPnn9SmHto8elHJcEja/TGEM3mqvPcF5UjuU4qsta1tb+nNHLbrdErSySml4W/ +jVZbynwySmnpqz6mXiIIdikdAgfn6hd0UdBCfRDGf8B23JYFZXvRQr8ka+hm8425tY8 B0K+EF9yDAK0L8TKz+kimu+GRrfm51/BMfG20UjmppKQp0jypsMMwmFYdt5CoxpA5Xx6 Yv3UKjdFNtmDHtoveWMg6o+R1jMWmAUohnbCu9j+NR6cLOxK+OoQgZXgX+3U+Z6qmB4u PA1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627787; x=1769232587; 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=eHsNO/7z8jjFX1Qc/WXEy+tfgyKsRWXmvXzihFXmRbQ=; b=QNJx/1Lg/Y1XreoGKmcoRgyr/CXDw3zh2hmsGoPKJMzBxF+nviWvHr+Ux/2JNaKNoE J2O2coeL+ZLj5qFyRC8SFCUceJMIJK079iAVq6jzRy2bAEjcZmWjkUzz4MKHy7vnM9e3 vVQDZ6Apm5th3jbYJNFIBg2IG7c59UfUkJVeVYBc29n8D+uvEclou4jVMUSy2/gy0TS2 NRy2Lfyg8ZWSbmfCC4WHUKaKJzGmA4uovMVpUO5XrqIcukDfstuY/zqpc4AlpE2S9wxc 3Hsa6v0RPm8Ojnr/8UIzD7JCd/sgOg/w9boF5quvfpQOPcQ5OTNydGsa+luaJ4aZFm3q DqOA== X-Forwarded-Encrypted: i=1; AJvYcCVs7xk3cWn0qHLobewm18w0TpTb+KfH4Pvziz/G9tWEMJewIXcfz9bhN+jTheiJTLFQnGdF5KTrPMlglbg=@vger.kernel.org X-Gm-Message-State: AOJu0Yzps9n/y4RE0TR88cRa1btSjntUId3MBOJ6JTBYdaFtBgxnRn3d dMihX19cqG0yULkDK7qKhUKtnWkBwO9jc/TyIT9dhq7vmWcig8D3PZyQvV2u6khlrcpTC/0qg24 WQoY9+pKm+A== X-Received: from dycue5.prod.google.com ([2002:a05:7300:85:b0:2b6:c560:337]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7301:5787:b0:2ac:22ac:30 with SMTP id 5a478bee46e88-2b6b4103759mr4377004eec.34.1768627786832; Fri, 16 Jan 2026 21:29:46 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:41 -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-16-irogers@google.com> Subject: [PATCH v1 15/23] perf dwarf-regs: Add csky 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. Signed-off-by: Ian Rogers --- .../util/dwarf-regs-arch/dwarf-regs-csky.c | 58 ++++++++++++++ tools/perf/util/dwarf-regs.c | 3 + tools/perf/util/include/dwarf-regs.h | 2 + tools/perf/util/unwind-libdw-arch/Build | 1 - .../unwind-libdw-arch/unwind-libdw-csky.c | 78 ------------------- tools/perf/util/unwind-libdw.c | 5 +- tools/perf/util/unwind-libdw.h | 1 - 7 files changed, 64 insertions(+), 84 deletions(-) delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-csky.c diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c b/tools/perf= /util/dwarf-regs-arch/dwarf-regs-csky.c index 86394ed46397..cb44b774f8d9 100644 --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-csky.c @@ -5,6 +5,10 @@ #include #include #include +// Ensure the V2 perf reg definitions are included. +#undef __CSKYABIV2__ +#define __CSKYABIV2__ 1 +#include "../../../arch/csky/include/uapi/asm/perf_regs.h" =20 #define CSKY_ABIV2_MAX_REGS 73 static const char * const csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS]= =3D { @@ -66,3 +70,57 @@ int __get_csky_regnum(const char *name, unsigned int fla= gs) =20 return __get_dwarf_regnum(csky_dwarf_regs_table_abiv1, CSKY_ABIV1_MAX_REG= S, name); } + +int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int = flags) +{ + static const int dwarf_csky_regnums[][2] =3D { + [PERF_REG_CSKY_TLS] =3D {-ENOENT, 31}, + [PERF_REG_CSKY_LR] =3D {15, 15}, + [PERF_REG_CSKY_PC] =3D {-ENOENT, 32}, + /* TODO: PERF_REG_CSKY_SR */ + [PERF_REG_CSKY_SP] =3D {0, 14}, + /* TODO: PERF_REG_CSKY_ORIG_A0 */ + [PERF_REG_CSKY_A0] =3D {2, 0}, + [PERF_REG_CSKY_A1] =3D {3, 1}, + [PERF_REG_CSKY_A2] =3D {4, 2}, + [PERF_REG_CSKY_A3] =3D {5, 3}, + [PERF_REG_CSKY_REGS0] =3D {6, 4}, + [PERF_REG_CSKY_REGS1] =3D {7, 5}, + [PERF_REG_CSKY_REGS2] =3D {8, 6}, + [PERF_REG_CSKY_REGS3] =3D {9, 7}, + [PERF_REG_CSKY_REGS4] =3D {10, 8}, + [PERF_REG_CSKY_REGS5] =3D {11, 9}, + [PERF_REG_CSKY_REGS6] =3D {12, 10}, + [PERF_REG_CSKY_REGS7] =3D {13, 11}, + [PERF_REG_CSKY_REGS8] =3D {14, 12}, + [PERF_REG_CSKY_REGS9] =3D {1, 13}, + [PERF_REG_CSKY_EXREGS0] =3D {-ENOENT, 16}, + [PERF_REG_CSKY_EXREGS1] =3D {-ENOENT, 17}, + [PERF_REG_CSKY_EXREGS2] =3D {-ENOENT, 18}, + [PERF_REG_CSKY_EXREGS3] =3D {-ENOENT, 19}, + [PERF_REG_CSKY_EXREGS4] =3D {-ENOENT, 20}, + [PERF_REG_CSKY_EXREGS5] =3D {-ENOENT, 21}, + [PERF_REG_CSKY_EXREGS6] =3D {-ENOENT, 22}, + [PERF_REG_CSKY_EXREGS7] =3D {-ENOENT, 23}, + [PERF_REG_CSKY_EXREGS8] =3D {-ENOENT, 24}, + [PERF_REG_CSKY_EXREGS9] =3D {-ENOENT, 25}, + [PERF_REG_CSKY_EXREGS10] =3D {-ENOENT, 26}, + [PERF_REG_CSKY_EXREGS11] =3D {-ENOENT, 27}, + [PERF_REG_CSKY_EXREGS12] =3D {-ENOENT, 28}, + [PERF_REG_CSKY_EXREGS13] =3D {-ENOENT, 29}, + [PERF_REG_CSKY_EXREGS14] =3D {-ENOENT, 30}, + /* TODO: PERF_REG_CSKY_HI */ + /* TODO: PERF_REG_CSKY_LO */ + /* TODO: PERF_REG_CSKY_DCSR */ + }; + int idx =3D 0; + + if (flags & EF_CSKY_ABIV2) + idx++; + + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_csky_regnums)= || + dwarf_csky_regnums[perf_regnum][idx] =3D=3D 0) + return -ENOENT; + + return dwarf_csky_regnums[perf_regnum][idx]; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index c472ec5e4d1a..7fa0930fd298 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -202,6 +202,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, u= nsigned int machine, case EM_AARCH64: reg =3D __get_dwarf_regnum_for_perf_regnum_arm64(perf_regnum); break; + case EM_CSKY: + reg =3D __get_dwarf_regnum_for_perf_regnum_csky(perf_regnum, flags); + break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); return -ENOENT; diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index a52df8d1b138..7780bc07e70e 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -108,6 +108,8 @@ int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_= regnum); int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum); int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum); =20 +int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int = flags); + /* * get_dwarf_regnum - Returns DWARF regnum from register name * name: architecture register name diff --git a/tools/perf/util/unwind-libdw-arch/Build b/tools/perf/util/unwi= nd-libdw-arch/Build index 79c3bbdc2dee..5fa1754fca8d 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,4 +1,3 @@ -perf-util-y +=3D unwind-libdw-csky.o perf-util-y +=3D unwind-libdw-loongarch.o perf-util-y +=3D unwind-libdw-powerpc.o perf-util-y +=3D unwind-libdw-riscv.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-csky.c b/tools/= perf/util/unwind-libdw-arch/unwind-libdw-csky.c deleted file mode 100644 index 2556d034c32a..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-csky.c +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -// Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. - -#include -#include "../arch/csky/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_csky(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[PERF_REG_CSKY_MAX]; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_CSKY_##r); \ - val; \ -}) - -#if defined(__CSKYABIV2__) - dwarf_regs[0] =3D REG(A0); - dwarf_regs[1] =3D REG(A1); - dwarf_regs[2] =3D REG(A2); - dwarf_regs[3] =3D REG(A3); - dwarf_regs[4] =3D REG(REGS0); - dwarf_regs[5] =3D REG(REGS1); - dwarf_regs[6] =3D REG(REGS2); - dwarf_regs[7] =3D REG(REGS3); - dwarf_regs[8] =3D REG(REGS4); - dwarf_regs[9] =3D REG(REGS5); - dwarf_regs[10] =3D REG(REGS6); - dwarf_regs[11] =3D REG(REGS7); - dwarf_regs[12] =3D REG(REGS8); - dwarf_regs[13] =3D REG(REGS9); - dwarf_regs[14] =3D REG(SP); - dwarf_regs[15] =3D REG(LR); - dwarf_regs[16] =3D REG(EXREGS0); - dwarf_regs[17] =3D REG(EXREGS1); - dwarf_regs[18] =3D REG(EXREGS2); - dwarf_regs[19] =3D REG(EXREGS3); - dwarf_regs[20] =3D REG(EXREGS4); - dwarf_regs[21] =3D REG(EXREGS5); - dwarf_regs[22] =3D REG(EXREGS6); - dwarf_regs[23] =3D REG(EXREGS7); - dwarf_regs[24] =3D REG(EXREGS8); - dwarf_regs[25] =3D REG(EXREGS9); - dwarf_regs[26] =3D REG(EXREGS10); - dwarf_regs[27] =3D REG(EXREGS11); - dwarf_regs[28] =3D REG(EXREGS12); - dwarf_regs[29] =3D REG(EXREGS13); - dwarf_regs[30] =3D REG(EXREGS14); - dwarf_regs[31] =3D REG(TLS); - dwarf_regs[32] =3D REG(PC); -#else - dwarf_regs[0] =3D REG(SP); - dwarf_regs[1] =3D REG(REGS9); - dwarf_regs[2] =3D REG(A0); - dwarf_regs[3] =3D REG(A1); - dwarf_regs[4] =3D REG(A2); - dwarf_regs[5] =3D REG(A3); - dwarf_regs[6] =3D REG(REGS0); - dwarf_regs[7] =3D REG(REGS1); - dwarf_regs[8] =3D REG(REGS2); - dwarf_regs[9] =3D REG(REGS3); - dwarf_regs[10] =3D REG(REGS4); - dwarf_regs[11] =3D REG(REGS5); - dwarf_regs[12] =3D REG(REGS6); - dwarf_regs[13] =3D REG(REGS7); - dwarf_regs[14] =3D REG(REGS8); - dwarf_regs[15] =3D REG(LR); -#endif - dwfl_thread_state_register_pc(thread, REG(PC)); - - return dwfl_thread_state_registers(thread, 0, PERF_REG_CSKY_MAX, - dwarf_regs); -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index 8f291f9f9469..a193163da707 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -292,7 +292,6 @@ static const Dwfl_Thread_Callbacks callbacks_generic = =3D { .set_initial_registers =3D libdw_set_initial_registers_generic, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(csky); DEFINE_DWFL_THREAD_CALLBACKS(loongarch); DEFINE_DWFL_THREAD_CALLBACKS(powerpc); DEFINE_DWFL_THREAD_CALLBACKS(riscv); @@ -300,9 +299,7 @@ DEFINE_DWFL_THREAD_CALLBACKS(s390); =20 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) { - if (!strcmp(arch, "csky")) - return &callbacks_csky; - else if (!strcmp(arch, "loongarch")) + if (!strcmp(arch, "loongarch")) return &callbacks_loongarch; else if (!strcmp(arch, "powerpc")) return &callbacks_powerpc; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index fe3ae2a768ad..ee56f1e827e5 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,7 +9,6 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw_set_initial_registers_csky(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_loongarch(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_powerpc(Dwfl_Thread *thread, void *arg); --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 0438232A3DA for ; Sat, 17 Jan 2026 05:29:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627793; cv=none; b=lIDGPIGwNt98Hk8J3DRZ4ZTfGbOu+gxrolBs+07Lxx1RjE3FsS/oGVHEXV8lXkQfngrMx8eoSJ3KSkj4RyyarZAS8EMXwNqlI1IMmXmmyu+77rHfDuDD/0oBDaRPcZmidtn7IB2M0rk+nJLCQeYmtI5XrY+8JQHIqkt5TORagMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627793; c=relaxed/simple; bh=y+7xwECacuSecCHUYo0NfRyFbUfHA3IiYvvx0zQIYLg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=CkCqWw5LJWB0VPa0umflfx0vD732zov2JWe9jH8BKVmvu84KTGwZN/BfU7cr/LPSea0NI19Di4IxOkUx5vFlkwe4mZywOwBeegEVPovB3prkBUY1aQaNuExIMyZrnFaFC6N12WOqHfh9Jf/ZXy9kBvqk1uhEl274QMMAmO3LIOA= 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=bqrvWrE8; arc=none smtp.client-ip=74.125.82.73 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="bqrvWrE8" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1233893db9fso3556733c88.0 for ; Fri, 16 Jan 2026 21:29:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627789; x=1769232589; 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=6lN+KscSViLQGaAIPX8L5X1lA4liB4Ix5iRxCo6bIiA=; b=bqrvWrE8ZVN47imdOv26FYuG1P/Co382Zh+avN095lahKUODQItRD9u+n5dkO+tkem 7Y7hqULDi6TgiKMmnTKtFPgXZt0Ipd1zyitbgvfbApHk3g0eW9EgQ/vbOILJi9QFhS2S rthK7l/h6kSTwW2o0zHY6dpB1r3/4DhGXtRXNdZocHR6WhOuAgHolV5UBkUsfXI5sBFt PJHNw8iIW+Ap5yvvTm74dAB6M6f6i3gOz1pRVOU6t3a4oXap5cEDCLQ0kwXOIaPtABNx nHkdoFrYZURr8idx7ofb4IXgSBNd3qWCtvVQtgt9FbE53yKwPdofq5k1TWHF2P6sMj8v 6DRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627789; x=1769232589; 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=6lN+KscSViLQGaAIPX8L5X1lA4liB4Ix5iRxCo6bIiA=; b=Q2t69z+HCEA+HmHW+4M4Ns9lh4ohfO2LLXDzwHyX/PoTD96bcTlAkKkoU/2dhG16V7 7o/9b62MXCgLHVuuLTH4M4RLqXPMPTe+p3Hradsz49UWQwXYmcov9rCIzdDMKQQ7UHSD scOgPAjRqJOaSJxfuMU5o1BX06amPd8ULO7zf6pJaHLUuNVqiTutjVtaBbmIqhRoCUCv kiGepZnnm1Q3fs7FRfFisXY46TLGhAKz7VsCd1h85y38kfNggKBACO037RYODUZBOWMy E9DoFC8U11mt8sb+3N/My6iTxicwG0oxt/2VC3VWuUKPHRZg4xQQuzMaIQvQi/E7kodg J5gw== X-Forwarded-Encrypted: i=1; AJvYcCV9dV/2ZG5L3bDlGDmS7ZjD0htd0J7v1INrCa+e8WvXuuMYJ3v7N+yo3HEBRqrBhlRxklnONe2AdAvM9tI=@vger.kernel.org X-Gm-Message-State: AOJu0YwH5g6Cs2q7s6PtweuK6TugwKylVl1TBFbWLjU548JNwVCylkQs 6Dr547Iy3SkYSKy19zhB7RHyWX9/UXC4/jTuHBOnd5Dz/94XuoUsMXJTcc05wE5FzkF61UQtwP4 xEt41zEdgmA== X-Received: from dlad21.prod.google.com ([2002:a05:701b:2215:b0:119:49ca:6ba4]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:a82:b0:11e:f6ef:4988 with SMTP id a92af1059eb24-1244a768b4fmr4946929c88.36.1768627788672; Fri, 16 Jan 2026 21:29:48 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:42 -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-17-irogers@google.com> Subject: [PATCH v1 16/23] perf dwarf-regs: Add loongarch 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. Signed-off-by: Ian Rogers --- tools/perf/util/dwarf-regs-arch/Build | 1 + .../dwarf-regs-arch/dwarf-regs-loongarch.c | 12 ++++ 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-loongarch.c | 57 ------------------- tools/perf/util/unwind-libdw.c | 5 +- tools/perf/util/unwind-libdw.h | 1 - 8 files changed, 18 insertions(+), 63 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-loongarch.c delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-loongarc= h.c diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build index 3f19a9ec47c7..188359376ea5 100644 --- a/tools/perf/util/dwarf-regs-arch/Build +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -1,5 +1,6 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm64.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm.o 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-x86.o diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-loongarch.c b/tools= /perf/util/dwarf-regs-arch/dwarf-regs-loongarch.c new file mode 100644 index 000000000000..203077b740a0 --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-loongarch.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/loongarch/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_loongarch(int perf_regnum) +{ + if (perf_regnum < 0 || perf_regnum >=3D PERF_REG_LOONGARCH_MAX) + return -ENOENT; + + return perf_regnum; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 7fa0930fd298..033218f14b36 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -205,6 +205,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, u= nsigned int machine, case EM_CSKY: reg =3D __get_dwarf_regnum_for_perf_regnum_csky(perf_regnum, flags); break; + case EM_LOONGARCH: + reg =3D __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum); + break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); return -ENOENT; diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index 7780bc07e70e..bec15fb53e73 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -109,6 +109,7 @@ int __get_dwarf_regnum_for_perf_regnum_arm(int perf_reg= num); int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum); =20 int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, unsigned int = flags); +int __get_dwarf_regnum_for_perf_regnum_loongarch(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 index 5fa1754fca8d..62a4cbf2dca8 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,4 +1,3 @@ -perf-util-y +=3D unwind-libdw-loongarch.o perf-util-y +=3D unwind-libdw-powerpc.o perf-util-y +=3D unwind-libdw-riscv.o perf-util-y +=3D unwind-libdw-s390.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-loongarch.c b/t= ools/perf/util/unwind-libdw-arch/unwind-libdw-loongarch.c deleted file mode 100644 index 5fca673508be..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-loongarch.c +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (C) 2020-2023 Loongson Technology Corporation Limited */ - -#include -#include "../arch/loongarch/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_loongarch(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[PERF_REG_LOONGARCH_MAX]; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_LOONGARCH_##r); \ - val; \ -}) - - dwarf_regs[0] =3D 0; - 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(R16); - dwarf_regs[17] =3D REG(R17); - dwarf_regs[18] =3D REG(R18); - dwarf_regs[19] =3D REG(R19); - dwarf_regs[20] =3D REG(R20); - dwarf_regs[21] =3D REG(R21); - dwarf_regs[22] =3D REG(R22); - dwarf_regs[23] =3D REG(R23); - dwarf_regs[24] =3D REG(R24); - dwarf_regs[25] =3D REG(R25); - dwarf_regs[26] =3D REG(R26); - dwarf_regs[27] =3D REG(R27); - dwarf_regs[28] =3D REG(R28); - dwarf_regs[29] =3D REG(R29); - dwarf_regs[30] =3D REG(R30); - dwarf_regs[31] =3D REG(R31); - dwfl_thread_state_register_pc(thread, REG(PC)); - - return dwfl_thread_state_registers(thread, 0, PERF_REG_LOONGARCH_MAX, dwa= rf_regs); -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index a193163da707..9c8dad643cd0 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -292,16 +292,13 @@ static const Dwfl_Thread_Callbacks callbacks_generic = =3D { .set_initial_registers =3D libdw_set_initial_registers_generic, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(loongarch); DEFINE_DWFL_THREAD_CALLBACKS(powerpc); DEFINE_DWFL_THREAD_CALLBACKS(riscv); DEFINE_DWFL_THREAD_CALLBACKS(s390); =20 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) { - if (!strcmp(arch, "loongarch")) - return &callbacks_loongarch; - else if (!strcmp(arch, "powerpc")) + if (!strcmp(arch, "powerpc")) return &callbacks_powerpc; else if (!strcmp(arch, "riscv")) return &callbacks_riscv; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index ee56f1e827e5..9d177d70f15c 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,7 +9,6 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw_set_initial_registers_loongarch(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_powerpc(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_riscv(Dwfl_Thread *thread, void *arg); --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 B0E8532E721 for ; Sat, 17 Jan 2026 05:29:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627795; cv=none; b=rhhbZ4JPaysriMD9TPYD9n5CE4Yikt2Xtp9xkfvee9oJPpa2Q0ILS1xY3BlX0fqJ7RUfiW9Cd44klvWM34abOJoqLi10qZmHGjP9wXAe03PTXzx22MtCtqyssXlaLjSTlNKfRDrWxks0QPmyClMgDwEJGTDC+7+hYp9qvyT+c8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627795; c=relaxed/simple; bh=xvrfmRGwN50DWc39nR8IudM0hWgXMsfj7kakQ4UFT3A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=C7aHjA7DbE49EKSFkSE789SpPtAYWDkAfKZG09xLRAvEttVVF15PBh9yPDZx3fd1qcuOWXnREHBd7Zn3pMDsopYTgmW1NrNUcs3AkapZVP0TyMIsaySKnVhQBjN80piaeGKO4J521AaQEVSp+6zFNBywDfH+VvzVTNWz4wExjoE= 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=mA56SJad; arc=none smtp.client-ip=74.125.82.73 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="mA56SJad" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-11b9786fb51so17153205c88.1 for ; Fri, 16 Jan 2026 21:29:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627791; x=1769232591; 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=iYVgloMaIeMWmcnEWxnIXuJDky8ZiRg8gWqhum1bLc0=; b=mA56SJadBdtnWOFIURo+7nIIjZWkzNXrCee1UXz2Fq4eC2RpjTBT83NLssGMd5dnv+ iyL58PCPxjLpnq5UvIJ88z5HyoYumi4jfKlEGeHGx1HZz/ar841mihn+UwkmAkqyirOF 46rAZy7HiH+kYza3WLNnGaHrLQ5pHnL2eTQZt1lgbe7sQQdSwOjsJNg3Tf3jKQFuK6kl 5gkGpNJPKuwXrt0SoLDf3b7ZH4WmlL/81+MkQ+zhYX1AfdRvz/tDwbw5Mvj3Pczw3ljh khe5n5b3y9a83pWEt5m1rWGhnc6KJ2jXj6O6oDz9nKq1t9SS56MWRH11lPYE8BNfEirB rsbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627791; x=1769232591; 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=iYVgloMaIeMWmcnEWxnIXuJDky8ZiRg8gWqhum1bLc0=; b=lAwhKx8GITj7xumqUDCKHR5iPTLllZ0Q0QOa3q/k/MGIgEZSdvK3fm+m02rNSSQK9z SAxmj4qBUiMK8lwsZDuL4F8QMADLngiKQVjxyF+Qi7nSuY3A2GQ3RT7VIV4EZrIdPRr9 bKnMVYjmPxzTZUNNmlnbaMfXaW5chBzBlMkG5NRxKvcL4GCoqoHTsi37jEq5DpP3GzWa oQK3Xj/sAQamu/4b+0f1J+2FMgzrF8R1ZK9VwhZk6fhqktM3Kgo6MPpQIDhZb4m4eGF7 wx9qcpDgqFkyDiJWA30Ni/h8H3srWH9JgHIbVekKphIuC1izOcxea5ltoE4TLFaQn6gP k0Hw== X-Forwarded-Encrypted: i=1; AJvYcCVaeefUiiJKOVmHSlPxBWjDVjYp2LiINnwJqMXsBlotcMHk1uLD6zAPNzO2rCLBxLFlbPyGJc4CUjg8ZQo=@vger.kernel.org X-Gm-Message-State: AOJu0YwwYICdGvTfUhAoOLGUDNJ1pYUpX8LmaWG7dMXbpva70U+fdpry 9+TfVhQIZGVJZzY2TJOBQ9gXUEf6md2EUbPzYIhTdU0ogLvhEk8SrluPKXm3YJtHGbCx3W05iDY fQ0Sjv9fxHg== X-Received: from dlaj19.prod.google.com ([2002:a05:701b:2813:b0:119:49ca:6bae]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6990:b0:11f:2c69:32 with SMTP id a92af1059eb24-1244a717f0amr3961097c88.7.1768627790635; Fri, 16 Jan 2026 21:29:50 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:43 -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-18-irogers@google.com> Subject: [PATCH v1 17/23] perf dwarf-regs: Add powerpc 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. Note, the link register was being coped to dwarf register 65 that the SysV ABI spec claims is FPSCR. It is corrected here to 108, but this is unlikely to matter as FPSCR has little to no impact on unwinding. Signed-off-by: Ian Rogers --- .../util/dwarf-regs-arch/dwarf-regs-powerpc.c | 77 ++++++++++++++++++- tools/perf/util/dwarf-regs.c | 4 + tools/perf/util/include/dwarf-regs.h | 1 + tools/perf/util/unwind-libdw-arch/Build | 1 - .../unwind-libdw-arch/unwind-libdw-powerpc.c | 76 ------------------ tools/perf/util/unwind-libdw.c | 5 +- tools/perf/util/unwind-libdw.h | 1 - 7 files changed, 82 insertions(+), 83 deletions(-) delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-powerpc.c b/tools/p= erf/util/dwarf-regs-arch/dwarf-regs-powerpc.c index caf77a234c78..51892a09725b 100644 --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-powerpc.c +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-powerpc.c @@ -4,8 +4,9 @@ * * Copyright (C) 2010 Ian Munsie, IBM Corporation. */ - +#include #include +#include "../../../arch/powerpc/include/uapi/asm/perf_regs.h" =20 #define PPC_OP(op) (((op) >> 26) & 0x3F) #define PPC_RA(a) (((a) >> 16) & 0x1f) @@ -59,3 +60,77 @@ void get_powerpc_regs(u32 raw_insn, int is_source, if ((op_loc->mem_ref) && (PPC_OP(raw_insn) !=3D 31)) op_loc->offset =3D get_offset_opcode(raw_insn); } + +int __get_dwarf_regnum_for_perf_regnum_powerpc(int perf_regnum) +{ + static const int dwarf_powerpc_regnums[] =3D { + [PERF_REG_POWERPC_R0] =3D 0, + [PERF_REG_POWERPC_R1] =3D 1, + [PERF_REG_POWERPC_R2] =3D 2, + [PERF_REG_POWERPC_R3] =3D 3, + [PERF_REG_POWERPC_R4] =3D 4, + [PERF_REG_POWERPC_R5] =3D 5, + [PERF_REG_POWERPC_R6] =3D 6, + [PERF_REG_POWERPC_R7] =3D 7, + [PERF_REG_POWERPC_R8] =3D 8, + [PERF_REG_POWERPC_R9] =3D 9, + [PERF_REG_POWERPC_R10] =3D 10, + [PERF_REG_POWERPC_R11] =3D 11, + [PERF_REG_POWERPC_R12] =3D 12, + [PERF_REG_POWERPC_R13] =3D 13, + [PERF_REG_POWERPC_R14] =3D 14, + [PERF_REG_POWERPC_R15] =3D 15, + [PERF_REG_POWERPC_R16] =3D 16, + [PERF_REG_POWERPC_R17] =3D 17, + [PERF_REG_POWERPC_R18] =3D 18, + [PERF_REG_POWERPC_R19] =3D 19, + [PERF_REG_POWERPC_R20] =3D 20, + [PERF_REG_POWERPC_R21] =3D 21, + [PERF_REG_POWERPC_R22] =3D 22, + [PERF_REG_POWERPC_R23] =3D 23, + [PERF_REG_POWERPC_R24] =3D 24, + [PERF_REG_POWERPC_R25] =3D 25, + [PERF_REG_POWERPC_R26] =3D 26, + [PERF_REG_POWERPC_R27] =3D 27, + [PERF_REG_POWERPC_R28] =3D 28, + [PERF_REG_POWERPC_R29] =3D 29, + [PERF_REG_POWERPC_R30] =3D 30, + [PERF_REG_POWERPC_R31] =3D 31, + /* TODO: PERF_REG_POWERPC_NIP */ + [PERF_REG_POWERPC_MSR] =3D 66, + /* TODO: PERF_REG_POWERPC_ORIG_R3 */ + [PERF_REG_POWERPC_CTR] =3D 109, + [PERF_REG_POWERPC_LINK] =3D 108, /* Note, previously in perf encoded as = 65? */ + [PERF_REG_POWERPC_XER] =3D 101, + /* TODO: PERF_REG_POWERPC_CCR */ + /* TODO: PERF_REG_POWERPC_SOFTE */ + /* TODO: PERF_REG_POWERPC_TRAP */ + /* TODO: PERF_REG_POWERPC_DAR */ + /* TODO: PERF_REG_POWERPC_DSISR */ + /* TODO: PERF_REG_POWERPC_SIER */ + /* TODO: PERF_REG_POWERPC_MMCRA */ + /* TODO: PERF_REG_POWERPC_MMCR0 */ + /* TODO: PERF_REG_POWERPC_MMCR1 */ + /* TODO: PERF_REG_POWERPC_MMCR2 */ + /* TODO: PERF_REG_POWERPC_MMCR3 */ + /* TODO: PERF_REG_POWERPC_SIER2 */ + /* TODO: PERF_REG_POWERPC_SIER3 */ + /* TODO: PERF_REG_POWERPC_PMC1 */ + /* TODO: PERF_REG_POWERPC_PMC2 */ + /* TODO: PERF_REG_POWERPC_PMC3 */ + /* TODO: PERF_REG_POWERPC_PMC4 */ + /* TODO: PERF_REG_POWERPC_PMC5 */ + /* TODO: PERF_REG_POWERPC_PMC6 */ + /* TODO: PERF_REG_POWERPC_SDAR */ + /* TODO: PERF_REG_POWERPC_SIAR */ + }; + + if (perf_regnum =3D=3D 0) + return 0; + + if (perf_regnum < 0 || perf_regnum > (int)ARRAY_SIZE(dwarf_powerpc_regnu= ms) || + dwarf_powerpc_regnums[perf_regnum] =3D=3D 0) + return -ENOENT; + + return dwarf_powerpc_regnums[perf_regnum]; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 033218f14b36..3b1c2a436806 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -205,6 +205,10 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, = unsigned int machine, case EM_CSKY: reg =3D __get_dwarf_regnum_for_perf_regnum_csky(perf_regnum, flags); break; + case EM_PPC: + case EM_PPC64: + reg =3D __get_dwarf_regnum_for_perf_regnum_powerpc(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 bec15fb53e73..9ebb3ba33fba 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -110,6 +110,7 @@ int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_r= egnum); =20 int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, 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); =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 index 62a4cbf2dca8..e6c97e842cd6 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,3 +1,2 @@ -perf-util-y +=3D unwind-libdw-powerpc.o perf-util-y +=3D unwind-libdw-riscv.o perf-util-y +=3D unwind-libdw-s390.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c b/too= ls/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c deleted file mode 100644 index 1560db45e7b4..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-powerpc.c +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include "../arch/powerpc/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -/* See backends/ppc_initreg.c and backends/ppc_regs.c in elfutils. */ -static const int special_regs[3][2] =3D { - { 65, PERF_REG_POWERPC_LINK }, - { 101, PERF_REG_POWERPC_XER }, - { 109, PERF_REG_POWERPC_CTR }, -}; - -bool libdw_set_initial_registers_powerpc(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[32], dwarf_nip; - size_t i; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_POWERPC_##r); \ - val; \ -}) - - 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(R16); - dwarf_regs[17] =3D REG(R17); - dwarf_regs[18] =3D REG(R18); - dwarf_regs[19] =3D REG(R19); - dwarf_regs[20] =3D REG(R20); - dwarf_regs[21] =3D REG(R21); - dwarf_regs[22] =3D REG(R22); - dwarf_regs[23] =3D REG(R23); - dwarf_regs[24] =3D REG(R24); - dwarf_regs[25] =3D REG(R25); - dwarf_regs[26] =3D REG(R26); - dwarf_regs[27] =3D REG(R27); - dwarf_regs[28] =3D REG(R28); - dwarf_regs[29] =3D REG(R29); - dwarf_regs[30] =3D REG(R30); - dwarf_regs[31] =3D REG(R31); - if (!dwfl_thread_state_registers(thread, 0, 32, dwarf_regs)) - return false; - - dwarf_nip =3D REG(NIP); - dwfl_thread_state_register_pc(thread, dwarf_nip); - for (i =3D 0; i < ARRAY_SIZE(special_regs); i++) { - Dwarf_Word val =3D 0; - perf_reg_value(&val, user_regs, special_regs[i][1]); - if (!dwfl_thread_state_registers(thread, - special_regs[i][0], 1, - &val)) - return false; - } - - return true; -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index 9c8dad643cd0..e9ba050e7ab1 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -292,15 +292,12 @@ static const Dwfl_Thread_Callbacks callbacks_generic = =3D { .set_initial_registers =3D libdw_set_initial_registers_generic, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(powerpc); DEFINE_DWFL_THREAD_CALLBACKS(riscv); DEFINE_DWFL_THREAD_CALLBACKS(s390); =20 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) { - if (!strcmp(arch, "powerpc")) - return &callbacks_powerpc; - else if (!strcmp(arch, "riscv")) + if (!strcmp(arch, "riscv")) return &callbacks_riscv; else if (!strcmp(arch, "s390")) return &callbacks_s390; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 9d177d70f15c..0ec1abdabbe7 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_powerpc(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_riscv(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg); =20 --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (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 92D3A32ED42 for ; Sat, 17 Jan 2026 05:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627795; cv=none; b=mhq/G+j2SjC4BfnlGcvA0izwef940RhrmeQITZT0I8wTdZZU2a52nHXyE0UUEgTBgz9vDHn9Hydf5Mt/1mftf4/sIEqa7tcKaY7AgcSJGiUEi8/Y0LboVZ+gXym+fKmgHjFYDjvaVwhcv+Y2e4Q+C+5GKezSg29zY6gLjNuFXEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627795; c=relaxed/simple; bh=u+b3O63vZvH1AQEyJ0ZNvbCIwQXEG3+oVy3wGQYabO4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=bcbQYglf6uAYyF+Tp+G/9rD7peykYecg527YmS2cplUUZ/2FA8Ae/wp4bgRT3bmAfu/4a43077NCXEu2FG37CnWOIhtdzo6rRY8cV8vEE+BgZs70x+tIoAS5E0t/hlA6SP9TQJeKpcRcCaHBDcjo0hTxLwZvxvCwrdvZiW1H2SE= 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=k+R2B3G8; arc=none smtp.client-ip=74.125.82.201 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="k+R2B3G8" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2b6a8afb513so3064624eec.0 for ; Fri, 16 Jan 2026 21:29:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627793; x=1769232593; 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=Gu6Ay1rV/hnUCdAd59fcfxBvScqY/4/I5R48NWueiwM=; b=k+R2B3G8D7bSs5DKZojLZbHZF1BA0Ja5uh3vbC5cLvPkaEdAwn5IlE70xh9mAiAupu ATYZF5KUbtsxI8gU0ahmYpJGeWbC+UPiaLVHAzzbgXkBC3Lfdad4y7uPgiW42KlX6I8u h2QXNV8VvwGzAq67bRQoUtfHRBukUS9HdX56vyd83Y1Z87UrNBnArnH7DLYFCac2o49I wf3JSls5Eh2HN5vm+uy19JPtqr2p4+VyJysS/cbQD0BeMqZLcjySDpk3sT5ToUNbnWXF 1RWAUt59CI7W4CxSoooA5EhYplU3YeZ5dY3Any4PEBYz6ew57Hr2XG0vocjKtC90ToiI mzaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627793; x=1769232593; 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=Gu6Ay1rV/hnUCdAd59fcfxBvScqY/4/I5R48NWueiwM=; b=LqMzj/dZd6/zAuPHYIGnq2z0jDOlVH+RRANzBws7z/x90i+9YtJe7RYz4GKLXTwrH6 no0Vo9792enxsoBt2GweWCrIRdZnkCrfK1iyxmDiubduK55wsDqh6a0ErUL6JC9YfCPL 0Th9m/aj3ENyg2sWoBLpeNeu2IptHzBKGQSLZxWn+AqaYO6OCsokUSZs+GmphCPsKZ4c CYgff8qlklmIfucYXacX5BT58GDRTMQAAZWg0+Bv+qFMxWYZEYNnRRhTCJvXn6wT/5uN E4UN1s9y2g2mDotMjqSX98NlgJ0Tx3Oa8Ab1lQxore1FXOqQNWkazFsWIbazrz58BUrl SivQ== X-Forwarded-Encrypted: i=1; AJvYcCVslTdIZgVMpCqCabZ35p8vrxOg4mGJLnr4FK/jNIaJ90eqP93mZzXNqq/xk5dMpUsEKofEjuC2I1R0kBk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/vTGYTA37xFMqwM3MU3uOZSxzxr1h+HIKWwZaJ56xQCDDuX1B b8G630tLgsIYFhR0AAYiNmaah0e2k9RI+eDUpvK3LNiIgHx2W/IrzYEu7zPcVdL8TQqpU1bQ9Pe 3jAKdU+1xuQ== X-Received: from dycnr20-n2.prod.google.com ([2002:a05:7300:e9d4:20b0:2b0:5541:d643]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:693c:2d93:b0:2b0:5028:bafd with SMTP id 5a478bee46e88-2b6b46c68femr3497511eec.8.1768627792479; Fri, 16 Jan 2026 21:29:52 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:44 -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-19-irogers@google.com> Subject: [PATCH v1 18/23] perf dwarf-regs: Add RISC-V 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. Signed-off-by: Ian Rogers --- tools/perf/util/dwarf-regs-arch/Build | 1 + .../util/dwarf-regs-arch/dwarf-regs-riscv.c | 12 ++++ 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-riscv.c | 58 ------------------- tools/perf/util/unwind-libdw.c | 5 +- tools/perf/util/unwind-libdw.h | 1 - 8 files changed, 18 insertions(+), 64 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-riscv.c delete mode 100644 tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build index 188359376ea5..94e4dfceb4d1 100644 --- a/tools/perf/util/dwarf-regs-arch/Build +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -3,4 +3,5 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm.o 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-x86.o diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-riscv.c b/tools/per= f/util/dwarf-regs-arch/dwarf-regs-riscv.c new file mode 100644 index 000000000000..090db51aba41 --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-riscv.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/riscv/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_riscv(int perf_regnum) +{ + if (perf_regnum < 0 || perf_regnum >=3D PERF_REG_RISCV_MAX) + return -ENOENT; + + return perf_regnum; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 3b1c2a436806..137568e15018 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -209,6 +209,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, u= nsigned int machine, case EM_PPC64: reg =3D __get_dwarf_regnum_for_perf_regnum_powerpc(perf_regnum); break; + case EM_RISCV: + reg =3D __get_dwarf_regnum_for_perf_regnum_riscv(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 9ebb3ba33fba..ae76608da110 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -111,6 +111,7 @@ int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_r= egnum); int __get_dwarf_regnum_for_perf_regnum_csky(int perf_regnum, 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); =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 index e6c97e842cd6..6d6e319e1201 100644 --- a/tools/perf/util/unwind-libdw-arch/Build +++ b/tools/perf/util/unwind-libdw-arch/Build @@ -1,2 +1 @@ -perf-util-y +=3D unwind-libdw-riscv.o perf-util-y +=3D unwind-libdw-s390.o diff --git a/tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c b/tools= /perf/util/unwind-libdw-arch/unwind-libdw-riscv.c deleted file mode 100644 index c2e2c4b6b2e0..000000000000 --- a/tools/perf/util/unwind-libdw-arch/unwind-libdw-riscv.c +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. */ - -#include -#include "../arch/riscv/include/uapi/asm/perf_regs.h" -#include "util/unwind-libdw.h" -#include "util/perf_regs.h" -#include "util/sample.h" - -bool libdw_set_initial_registers_riscv(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[32]; - -#define REG(r) ({ \ - Dwarf_Word val =3D 0; \ - perf_reg_value(&val, user_regs, PERF_REG_RISCV_##r); \ - val; \ -}) - - dwarf_regs[0] =3D 0; - dwarf_regs[1] =3D REG(RA); - dwarf_regs[2] =3D REG(SP); - dwarf_regs[3] =3D REG(GP); - dwarf_regs[4] =3D REG(TP); - dwarf_regs[5] =3D REG(T0); - dwarf_regs[6] =3D REG(T1); - dwarf_regs[7] =3D REG(T2); - dwarf_regs[8] =3D REG(S0); - dwarf_regs[9] =3D REG(S1); - dwarf_regs[10] =3D REG(A0); - dwarf_regs[11] =3D REG(A1); - dwarf_regs[12] =3D REG(A2); - dwarf_regs[13] =3D REG(A3); - dwarf_regs[14] =3D REG(A4); - dwarf_regs[15] =3D REG(A5); - dwarf_regs[16] =3D REG(A6); - dwarf_regs[17] =3D REG(A7); - dwarf_regs[18] =3D REG(S2); - dwarf_regs[19] =3D REG(S3); - dwarf_regs[20] =3D REG(S4); - dwarf_regs[21] =3D REG(S5); - dwarf_regs[22] =3D REG(S6); - dwarf_regs[23] =3D REG(S7); - dwarf_regs[24] =3D REG(S8); - dwarf_regs[25] =3D REG(S9); - dwarf_regs[26] =3D REG(S10); - dwarf_regs[27] =3D REG(S11); - dwarf_regs[28] =3D REG(T3); - dwarf_regs[29] =3D REG(T4); - dwarf_regs[30] =3D REG(T5); - dwarf_regs[31] =3D REG(T6); - dwfl_thread_state_register_pc(thread, REG(PC)); - - return dwfl_thread_state_registers(thread, 0, PERF_REG_RISCV_MAX, - dwarf_regs); -} diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index e9ba050e7ab1..b3c4380d40b6 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -292,14 +292,11 @@ static const Dwfl_Thread_Callbacks callbacks_generic = =3D { .set_initial_registers =3D libdw_set_initial_registers_generic, }; =20 -DEFINE_DWFL_THREAD_CALLBACKS(riscv); DEFINE_DWFL_THREAD_CALLBACKS(s390); =20 static const Dwfl_Thread_Callbacks *get_thread_callbacks(const char *arch) { - if (!strcmp(arch, "riscv")) - return &callbacks_riscv; - else if (!strcmp(arch, "s390")) + if (!strcmp(arch, "s390")) return &callbacks_s390; =20 return &callbacks_generic; diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 0ec1abdabbe7..5c23080cb6c1 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_riscv(Dwfl_Thread *thread, void *arg); bool libdw_set_initial_registers_s390(Dwfl_Thread *thread, void *arg); =20 struct unwind_info { --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 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 From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 5AE7F32D0C2 for ; Sat, 17 Jan 2026 05:29:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627800; cv=none; b=H6CgoNW6KdQVHR7Vao0NTjopYIV/GyOJh65A16B1JjwpMdekPTrxBD/SD/FVVaPBl4aKTKmQ9kGynQLw3tLRgqdHuOjZJrh9P1SuKCyJm1r3csr4hCJ823zZRMIzNuqzsnjWPhi0A0UwGmnz9E4l7EycQuoXHD3hW32dnq4p4d0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627800; c=relaxed/simple; bh=oeQCQhV1gWsBVZPKnHSQl0QIL9uhx6kX5TUrLYHHuBI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Bz+cRX8+2xJ/L8mnlTThECRZ0mlYoF7q7IhdUu7QIsINQE1aukK0OpP5c1AjZpl+RfAR95fIMCgttQvQrQszLNPtcIjBhLuFgllxYGCiUXR8xyb+JBPqNLdhlgyHHbckQ28nH5ZBCZHVupY8QTGSxiaGZArOgSU3veL8jLAoNa0= 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=tekPvgTg; arc=none smtp.client-ip=74.125.82.202 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="tekPvgTg" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6a8b32fa9so10173955eec.1 for ; Fri, 16 Jan 2026 21:29:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627796; x=1769232596; 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=E3ySt36B4ISR8ZRmDcInO2UVT50pnmB1ju9RDICGsEs=; b=tekPvgTgXYkZNJGh3YVCZXdAuCO6htTzV4N2l5yaHOAh7y0mi6MFKEPFtrf34qy+Qx gdl1Rf3NYMS+NhMaCXL++asdWHlTAUvdV9PJK9Tc/Tq2OkQ3XDO2iyXExYxppXLw6YZS j5PtKBPkZu9lM3JvZ3uzyxi2nzfUJRmiDKTS1MboSF3AsSrwDS5s/BEaSx+t5vWsdamu H3yJR7dqfURxb5q4TB+bsn62PF95qEv1gELC962RMz4qMyvwBGaZZUZNzFkhpAdj1Thb 4HTgoZMS5J+4C3/H4hYNbGdZaEoV+fDKGKRMk4HRGbV3I/6giCAgcjRcPkac5RlKGIcJ 4+hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627796; x=1769232596; 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=E3ySt36B4ISR8ZRmDcInO2UVT50pnmB1ju9RDICGsEs=; b=AzCM1miZvCgvTXCWb8IKLFg3CuY4CbB0z7BQIxNj0H6amqBAz9ii6Aul04lqY2Qzn7 zDsvl5DQGzyVM44MTlAp0Z9bSihUysoJTGfWuLmYUBkQMUCd1a+JTlKvorA/22apfl9R uFFlhCDyWz7ConFQLHFn8GM09nkHS9qi36MBgHfUV4nlPUXQQ/VOUdTWq1qRb8qDYaUo CRuqyVUMttA5AxVWnY5GJj5Zmt7snL/kYpuzFOo1zmCXlKRSx6VRpfZpTy9xnhPzCFnP vXcV87JS8pBAWlEcVqNPCrrLFtWOS/D2PSRSuotcxORwc2U5jB1AILIR1SnjDN7u3CVu 3XTg== X-Forwarded-Encrypted: i=1; AJvYcCWkyoDG0NpfbxHjIlxrFjsbnq2HvmOCHKk5AFKQEc/v+O+X9pYKWIM5OigQfP9W8LKNslgobV7xZXZ/A7Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwSEZPLuWH04xeCvZexL7G9adftwSixwkYx1rei4RukVIY+kWS1 EeU88Z2v/nATFjmBC6NPjTn5rLYO4hkMA0YZltULQifh/O2f/9VY9DPnyVMu0Ydvpjj5rrnZxP2 Gk6qlI2BNgw== X-Received: from dycnp4.prod.google.com ([2002:a05:7301:1484:b0:2af:dc89:507f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:e8a2:b0:2ae:5d5b:4ed0 with SMTP id 5a478bee46e88-2b6b40d9dadmr4094787eec.21.1768627796102; Fri, 16 Jan 2026 21:29:56 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:46 -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-21-irogers@google.com> Subject: [PATCH v1 20/23] perf dwarf-regs: Add MIPS 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" Despite an unused function declaration, there was no unwind-libdw for MIPS but there is a perf_regs.h and a libdw implementation. Fill in the pieces so hopefully MIPS unwinding with libdw works. Signed-off-by: Ian Rogers --- tools/perf/util/dwarf-regs-arch/Build | 1 + tools/perf/util/dwarf-regs-arch/dwarf-regs-mips.c | 14 ++++++++++++++ tools/perf/util/dwarf-regs.c | 5 +++++ tools/perf/util/include/dwarf-regs.h | 1 + tools/perf/util/unwind-libdw.h | 2 -- 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-mips.c diff --git a/tools/perf/util/dwarf-regs-arch/Build b/tools/perf/util/dwarf-= regs-arch/Build index 10c2af3d933a..ceb68ae86fd8 100644 --- a/tools/perf/util/dwarf-regs-arch/Build +++ b/tools/perf/util/dwarf-regs-arch/Build @@ -2,6 +2,7 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm64.o perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arm.o 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-mips.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 diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-mips.c b/tools/perf= /util/dwarf-regs-arch/dwarf-regs-mips.c new file mode 100644 index 000000000000..3bb916b45c66 --- /dev/null +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-mips.c @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include "../../../arch/mips/include/uapi/asm/perf_regs.h" + +int __get_dwarf_regnum_for_perf_regnum_mips(int perf_regnum) +{ + if (perf_regnum =3D=3D PERF_REG_MIPS_PC) + return 37; + if (perf_regnum < 0 || perf_regnum >=3D PERF_REG_MIPS_MAX) + return -ENOENT; + + return perf_regnum; +} diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index f86f76547592..797f455eba0d 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -179,6 +179,8 @@ static int get_libdw_frame_nregs(unsigned int machine, = unsigned int flags __mayb return 103; case EM_LOONGARCH: return 74; + case EM_MIPS: + return 71; default: return 0; } @@ -218,6 +220,9 @@ int get_dwarf_regnum_for_perf_regnum(int perf_regnum, u= nsigned int machine, case EM_LOONGARCH: reg =3D __get_dwarf_regnum_for_perf_regnum_loongarch(perf_regnum); break; + case EM_MIPS: + reg =3D __get_dwarf_regnum_for_perf_regnum_mips(perf_regnum); + break; default: pr_err("ELF MACHINE %x is not supported.\n", machine); return -ENOENT; diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include= /dwarf-regs.h index b95cf2d7b5b3..46a764cf322f 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -113,6 +113,7 @@ int __get_dwarf_regnum_for_perf_regnum_loongarch(int pe= rf_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); +int __get_dwarf_regnum_for_perf_regnum_mips(int perf_regnum); =20 /* * get_dwarf_regnum - Returns DWARF regnum from register name diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 20d63d881dff..9c5b5fcaaae8 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -9,8 +9,6 @@ struct machine; struct perf_sample; struct thread; =20 -bool libdw_set_initial_registers_mips(Dwfl_Thread *thread, void *arg); - struct unwind_info { Dwfl *dwfl; struct perf_sample *sample; --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 DFCAD330B15 for ; Sat, 17 Jan 2026 05:29:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627807; cv=none; b=dOSRFZWrO7eluMiKGCgmlVJZqqyeUGzKWpjYcE3rEP0/szTomkrCuYMz6iiuD/9wDUnYkWQuIQ4qv814F4dGUCRxaySbRQAW9k33SPS44FOTIp0RzF6dxfXT/R5zcSSMS30zVHei1AfjfKg6YjCdrXoVU/co810HiqaCoRCKFkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627807; c=relaxed/simple; bh=0CymPKudGe+KI6Wn4idJryFK+62VhKG4sXlkbqlHNWA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=pl0Zom3mEBXL373igw3rX41z1arKLlGNSj0IvOcxrQRvkcvETGe6PHsHxTBub0NMiM0q5UsP3s2cGu2RxJlkPFX2eo1chfRcxurfWJmkaW/rVYZhEuYyH8VRQ8CCI1sGawEalwgp/W9OmrUvtuCw/wWFaqrGHoAecp2T2wzcq6g= 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=dviA2s7A; arc=none smtp.client-ip=74.125.82.202 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="dviA2s7A" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b6a8afb513so3064656eec.0 for ; Fri, 16 Jan 2026 21:29:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627799; x=1769232599; 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=w/cI6wzc88dPba4Z3EWyEhx9YKJRNqyLJPumk+e8HfU=; b=dviA2s7AH5fqbMQ6hvsAk7KOaRULGBQ0N8z4yu8Ws4rg8x//KfiUTaf+LJ4w+LDOI5 b4/MDS1AbZrB0Vn/vTxE5M3xFaqQF2fEV5jcLxA1cqCuyW6BixNRlS5EREenT59ra+w/ KFKP0/7hvIGRYxYilpX+q0CL45R7V8h+FERgnL2IrathkiMQJgYFE5hbqEAXJHVKBQt+ rw+WYemS4wVFaX5gKeKGN12bG3wrMXWofKFJInTtViRR40DUbxNB+hCbGajzebql83/Y r65AjR30r0cor19+W3CC/3+iunaT5XubBYB4uSIdDmQnEPp3rnOlx9rLr5vJuHJXL/9F lyTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627799; x=1769232599; 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=w/cI6wzc88dPba4Z3EWyEhx9YKJRNqyLJPumk+e8HfU=; b=tj2624p7odE3+FxkRygm2PBEmNQ7A2Jf5fdTPizuOs9VLmFK2zWzqPsdO5hWaTTFgP 5/3C8s6IT8KndCfnr1WS/Ba6Pj/E9Rd4lvR63KkrfoMw4XcV3mONdtI0Q/vLa2daA5fZ t7Cg9OljqG9ASwGQnP/6Q+Cn9rtcctpN0KQegbvzlJHK9OauqrbSwril/N9XWzbql9qd r0/WsuDwn12yNWXNhK3DaKDqMyAx6DMcHSq08QpRO2EfLavNPe8wyrJ9eQyTq3ucd/// Lr4fW33AYs1yQ/kWEaIXckCopK7K3RYmtKuXhwziaJFu7Elttf6iFRGuH8rEGwFY+x9u Lxmw== X-Forwarded-Encrypted: i=1; AJvYcCVxWxA2GgUpBi6tgQ3BHVCJiqXQgPl70VpbU62R4NywW1GzCDCq+232brmDKNObePcdGQxLcS/I0HaQBKw=@vger.kernel.org X-Gm-Message-State: AOJu0YwhDeu0cSblPxQ/tOlC784hR4BxU2Dhtc2Yci+AfLbRVCxQqere 7XD80AhqD2VqXdJky/sOdYTRenYu8XLvR9+qD0AUM3V+p4wpePNv6xtl3iLtCUW1U1k2bmCRXDl 1sGHSW64eEw== X-Received: from dybmj1.prod.google.com ([2002:a05:7301:e01:b0:2ac:3545:743c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:6d1f:b0:2b0:4e86:8157 with SMTP id 5a478bee46e88-2b6b46eb100mr4487390eec.17.1768627798660; Fri, 16 Jan 2026 21:29:58 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:47 -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-22-irogers@google.com> Subject: [PATCH v1 21/23] perf build: Remove NO_LIBDW_DWARF_UNWIND option 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" Libdw unwinding support is present for every architecture that has a perf_regs.h - perf registers are needed for the initial frame to unwind. Elfutils also supports sparc, arc and m68k but there is no support in the Linux kernel for perf registers on these architectures. As the perf supported dwarf unwinding architectures are a subset of the elfutils ones, remove NO_LIBDW_DWARF_UNWIND as there isn't a case of elfutils lacking the support need for perf. Signed-off-by: Ian Rogers --- tools/perf/Makefile.config | 19 +------------------ tools/perf/tests/make | 3 +-- tools/perf/util/Build | 3 +-- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 6f2c7bd36e74..5e4ae775987f 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -118,14 +118,6 @@ ifeq ($(ARCH),mips) endif endif =20 -# So far there's only x86 and arm libdw unwind support merged in perf. -# Disable it on all other architectures in case libdw unwind -# support is detected in system. Add supported architectures -# to the check. -ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390 csky risc= v loongarch)) - NO_LIBDW_DWARF_UNWIND :=3D 1 -endif - ifneq ($(LIBUNWIND),1) NO_LIBUNWIND :=3D 1 endif @@ -456,7 +448,6 @@ endif ifdef NO_LIBELF NO_LIBDW :=3D 1 NO_LIBUNWIND :=3D 1 - NO_LIBDW_DWARF_UNWIND :=3D 1 NO_LIBBPF :=3D 1 NO_JVMTI :=3D 1 else @@ -504,10 +495,6 @@ ifeq ($(feature-libaio), 1) endif endif =20 -ifdef NO_LIBDW - NO_LIBDW_DWARF_UNWIND :=3D 1 -endif - ifeq ($(feature-scandirat), 1) # Ignore having scandirat with memory sanitizer that lacks an intercepto= r. ifeq ($(filter s% -fsanitize=3Dmemory%,$(EXTRA_CFLAGS),),) @@ -757,7 +744,7 @@ dwarf-post-unwind-text :=3D BUG =20 # setup DWARF post unwinder ifdef NO_LIBUNWIND - ifdef NO_LIBDW_DWARF_UNWIND + ifdef NO_LIBDW $(warning Disabling post unwind, no support found.) dwarf-post-unwind :=3D 0 else @@ -767,10 +754,6 @@ ifdef NO_LIBUNWIND else dwarf-post-unwind-text :=3D libunwind $(call detected,CONFIG_LIBUNWIND) - # Enable libunwind support by default. - ifndef NO_LIBDW_DWARF_UNWIND - NO_LIBDW_DWARF_UNWIND :=3D 1 - endif endif =20 ifeq ($(dwarf-post-unwind),1) diff --git a/tools/perf/tests/make b/tools/perf/tests/make index 36411b4b6d2b..767ad9e147a8 100644 --- a/tools/perf/tests/make +++ b/tools/perf/tests/make @@ -83,7 +83,6 @@ make_no_demangle :=3D NO_DEMANGLE=3D1 make_no_libelf :=3D NO_LIBELF=3D1 make_no_libdw :=3D NO_LIBDW=3D1 make_libunwind :=3D LIBUNWIND=3D1 -make_no_libdw_dwarf_unwind :=3D NO_LIBDW_DWARF_UNWIND=3D1 make_no_backtrace :=3D NO_BACKTRACE=3D1 make_no_libcapstone :=3D NO_CAPSTONE=3D1 make_no_libnuma :=3D NO_LIBNUMA=3D1 @@ -120,7 +119,7 @@ make_static :=3D LDFLAGS=3D-static NO_PERF_READ= _VDSO32=3D1 NO_PERF_READ_VDSOX3 make_minimal :=3D NO_LIBPYTHON=3D1 NO_GTK2=3D1 make_minimal +=3D NO_DEMANGLE=3D1 NO_LIBELF=3D1 NO_BACKTRACE=3D1 make_minimal +=3D NO_LIBNUMA=3D1 NO_LIBBIONIC=3D1 NO_LIBDW=3D1 -make_minimal +=3D NO_LIBDW_DWARF_UNWIND=3D1 NO_LIBBPF=3D1 +make_minimal +=3D NO_LIBBPF=3D1 make_minimal +=3D NO_SDT=3D1 NO_JVMTI=3D1 NO_LIBZSTD=3D1 make_minimal +=3D NO_LIBCAP=3D1 NO_CAPSTONE=3D1 =20 diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 3cb1edd263cf..c30ff257f8b4 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -223,9 +223,8 @@ perf-util-$(CONFIG_LIBDW) +=3D dwarf-regs-arch/ perf-util-$(CONFIG_LIBDW) +=3D debuginfo.o perf-util-$(CONFIG_LIBDW) +=3D annotate-data.o perf-util-$(CONFIG_LIBDW) +=3D libdw.o +perf-util-$(CONFIG_LIBDW) +=3D unwind-libdw.o =20 -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o -perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw-arch/ perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind-local.o perf-util-$(CONFIG_LIBUNWIND) +=3D unwind-libunwind.o perf-util-$(CONFIG_LIBUNWIND_X86) +=3D libunwind/x86_32.o --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 DFE6D330B25 for ; Sat, 17 Jan 2026 05:30:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627806; cv=none; b=GwxeM2Ei97mducJgeuKMQvQlMKgha9U8yGKkM1rON29kVgwFA2HDRhUgb1qzd4dreB6dNr5eCHbmtenUDJVrQfktPyOaO66YFfFvURO9lc2tZD9UvHegMZVTUASAykt6HO2VcHDzrwa/kfdWfBt1B8WIEHnib1zqYI+blW7Qf9E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627806; c=relaxed/simple; bh=59/fPmmIJ+wvu7jOaxWHkGNuTzrpNNBL4KSaqqptTOc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=dt/woBkFI11Sx5lc9Ns9wWujEc0kraV7fXc1h9GCQEqPZn2DvXUvTRPuG5yKXojVL41Sf9Sxcfc+gHRFta62C2L/Y3DHN3vHAUOAAWClCU53nzPZ0VpIVA0WIPzaauOQj3g9xsdm2+KKbwPprFFDRZjwqzG5oTyAZ0F/epEM/ss= 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=WLUKMSM3; arc=none smtp.client-ip=74.125.82.202 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="WLUKMSM3" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2ae26a77b76so4881122eec.0 for ; Fri, 16 Jan 2026 21:30:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627801; x=1769232601; 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=Ovty9hx/OhrSFGFh9FSlYP45sCJ4K4eUavVfI0lVQ/E=; b=WLUKMSM3K7eOHIle8IKSxQTS3dhQdB02YrU4oVM+rQ9B+X9zW2uNEv0M50U/UfokIC tCNrt85cU2Wu6ZgUhXWnjrug2fUKuaE1hZ48Zl99DPHmoX+2aPxI61zfGEfD5Y7fitvi nDLQeg1FiJHZxLuklE5d4fYEP8387jZSSLQjRaO3DnhQYz8NLr5mdZp6Zx7inp9QcwXW Cb0WWBDZZFFClI+agwaRge7mql0/T+D6lzuMErSkXswgkugQeUx2LWlIksmxnS+uDuz5 VmMB8LLJ12I7+XLTFUx+iGCXt7ImAVXoFiAH8U7/gCb0TBMvBEt2lgk2/eV/DMAdisyv e4og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627801; x=1769232601; 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=Ovty9hx/OhrSFGFh9FSlYP45sCJ4K4eUavVfI0lVQ/E=; b=SzUxaW16K4o2pT5qcO0o7D9nthJiVumvV1b3qQVAN1GZGQLwoTSbBQrX/0mk89U//p ecDEtRPhzC4djhOSegwhPjs2J+o/P/Lz3U3VYMOqeQOSx4uzEvCRixUZXtLh2bOA1ikh pP4gN55nsZsPC1p5qy5lXUa3rNpCQgv55DGkJuGjXwfXcZyZFsiYF/zT7D2sJYcAbWMm RC6Yceq9al++JGmMbaAEkZDGtRyKcNoQKnN6MHKhuxJDz7LcwYuA0UC8OEd+/XfsBlXv gdto7YZAgaIlAXR7vdu7gavMSENyhc0GvOjYKKR3cqP8/Se4c3Yiom5nuUiAO0H2aCXB slHw== X-Forwarded-Encrypted: i=1; AJvYcCV+5Ksejr+fSLpGbzsxYBtAO775XMyJ1iZxJoq6talvSdr3A2AONN6uwG4vi80Scn2V2tN4Yt0LV+4KAKM=@vger.kernel.org X-Gm-Message-State: AOJu0YzrO/KobTMf7m8CItoFsmeOY/I4xrlRZC2UTN5QW8YQviobv4uK s/SUfxdF0iY7VvyzdKdSyoaNpztxvPP56Ed7iEpZ89RX0LnoLFVLrHLZ68dh65KqNhaM6wglkL4 VX7jJz20zPg== X-Received: from dybpi1.prod.google.com ([2002:a05:7301:4201:b0:2b6:bfef:23fa]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:a883:b0:2ae:5424:e5a4 with SMTP id 5a478bee46e88-2b6b4eade90mr4086553eec.37.1768627800651; Fri, 16 Jan 2026 21:30:00 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:48 -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-23-irogers@google.com> Subject: [PATCH v1 22/23] perf unwind-libdw: Don't discard loaded ELF/Dwarf after every unwind 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" The unwind-libdw dwfl has ELF binaries associated with mmap addresses. Experimenting with using the per dso dwfl it is required to alter the address to be 0 based variant. Unfortunately libdwfl doesn't allow a single unwind and then an update to the return address to be 0 based as there are assertions that registers aren't updated once an unwind has started, etc. As removing the dwfl didn't prove possible, an alternative is to just not discard the dwfl when the unwind ends. The dwfl is valid for a process unless a dso is loaded at the same address as a previous one. So keep the dwfl with the maps, invalidate it if a map is removed (in case a new map replaces it) and recycle the dwfl in the unwinding code. A wrinkly in the implementation of this is that the attached thread argument is remembered by the dwfl and so it needs to be a pointer to memory that also persists with the dwfl (struct dwfl_ui_thread_info in the code). Recording 10 seconds of system wide data with --call-graph=3Ddwarf and then processing with perf report shows a total runtime improvement from 41.583s to 2.279s (an 18x speedup). Signed-off-by: Ian Rogers --- tools/perf/util/maps.c | 36 +++++++++++++- tools/perf/util/maps.h | 4 ++ tools/perf/util/unwind-libdw.c | 90 +++++++++++++++++++++++++--------- tools/perf/util/unwind-libdw.h | 9 +++- 4 files changed, 112 insertions(+), 27 deletions(-) diff --git a/tools/perf/util/maps.c b/tools/perf/util/maps.c index c321d4f4d846..8ccc46d515b6 100644 --- a/tools/perf/util/maps.c +++ b/tools/perf/util/maps.c @@ -10,6 +10,7 @@ #include "thread.h" #include "ui/ui.h" #include "unwind.h" +#include "unwind-libdw.h" #include =20 /* @@ -39,6 +40,9 @@ DECLARE_RC_STRUCT(maps) { #ifdef HAVE_LIBUNWIND_SUPPORT void *addr_space; const struct unwind_libunwind_ops *unwind_libunwind_ops; +#endif +#ifdef HAVE_LIBDW_SUPPORT + void *libdw_addr_space_dwfl; #endif refcount_t refcnt; /** @@ -203,6 +207,17 @@ void maps__set_unwind_libunwind_ops(struct maps *maps,= const struct unwind_libun RC_CHK_ACCESS(maps)->unwind_libunwind_ops =3D ops; } #endif +#ifdef HAVE_LIBDW_SUPPORT +void *maps__libdw_addr_space_dwfl(const struct maps *maps) +{ + return RC_CHK_ACCESS(maps)->libdw_addr_space_dwfl; +} + +void maps__set_libdw_addr_space_dwfl(struct maps *maps, void *dwfl) +{ + RC_CHK_ACCESS(maps)->libdw_addr_space_dwfl =3D dwfl; +} +#endif =20 static struct rw_semaphore *maps__lock(struct maps *maps) { @@ -218,6 +233,9 @@ static void maps__init(struct maps *maps, struct machin= e *machine) #ifdef HAVE_LIBUNWIND_SUPPORT RC_CHK_ACCESS(maps)->addr_space =3D NULL; RC_CHK_ACCESS(maps)->unwind_libunwind_ops =3D NULL; +#endif +#ifdef HAVE_LIBDW_SUPPORT + RC_CHK_ACCESS(maps)->libdw_addr_space_dwfl =3D NULL; #endif refcount_set(maps__refcnt(maps), 1); RC_CHK_ACCESS(maps)->nr_maps =3D 0; @@ -240,6 +258,9 @@ static void maps__exit(struct maps *maps) zfree(&maps_by_address); zfree(&maps_by_name); unwind__finish_access(maps); +#ifdef HAVE_LIBDW_SUPPORT + libdw__invalidate_dwfl(maps, maps__libdw_addr_space_dwfl(maps)); +#endif } =20 struct maps *maps__new(struct machine *machine) @@ -549,6 +570,9 @@ void maps__remove(struct maps *maps, struct map *map) __maps__remove(maps, map); check_invariants(maps); up_write(maps__lock(maps)); +#ifdef HAVE_LIBDW_SUPPORT + libdw__invalidate_dwfl(maps, maps__libdw_addr_space_dwfl(maps)); +#endif } =20 bool maps__empty(struct maps *maps) @@ -604,18 +628,26 @@ int maps__for_each_map(struct maps *maps, int (*cb)(s= truct map *map, void *data) void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void= *data), void *data) { struct map **maps_by_address; + bool removed =3D false; =20 down_write(maps__lock(maps)); =20 maps_by_address =3D maps__maps_by_address(maps); for (unsigned int i =3D 0; i < maps__nr_maps(maps);) { - if (cb(maps_by_address[i], data)) + if (cb(maps_by_address[i], data)) { __maps__remove(maps, maps_by_address[i]); - else + removed =3D true; + } else { i++; + } } check_invariants(maps); up_write(maps__lock(maps)); + if (removed) { +#ifdef HAVE_LIBDW_SUPPORT + libdw__invalidate_dwfl(maps, maps__libdw_addr_space_dwfl(maps)); +#endif + } } =20 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map *= *mapp) diff --git a/tools/perf/util/maps.h b/tools/perf/util/maps.h index d9aa62ed968a..20c52084ba9e 100644 --- a/tools/perf/util/maps.h +++ b/tools/perf/util/maps.h @@ -52,6 +52,10 @@ void maps__set_addr_space(struct maps *maps, void *addr_= space); const struct unwind_libunwind_ops *maps__unwind_libunwind_ops(const struct= maps *maps); void maps__set_unwind_libunwind_ops(struct maps *maps, const struct unwind= _libunwind_ops *ops); #endif +#ifdef HAVE_LIBDW_SUPPORT +void *maps__libdw_addr_space_dwfl(const struct maps *maps); +void maps__set_libdw_addr_space_dwfl(struct maps *maps, void *dwfl); +#endif =20 size_t maps__fprintf(struct maps *maps, FILE *fp); =20 diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index e0321043af88..c1646ef5f971 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c @@ -20,6 +20,17 @@ #include "callchain.h" #include "util/env.h" =20 +/* + * The dwfl thread argument passed to functions like memory_read. Memory h= as to + * be allocated to persist of multiple uses of the dwfl. + */ +struct dwfl_ui_thread_info { + /* Back link to the dwfl. */ + Dwfl *dwfl; + /* The current unwind info, only 1 is supported. */ + struct unwind_info *ui; +}; + static char *debuginfo_path; =20 static int __find_debuginfo(Dwfl_Module *mod __maybe_unused, void **userda= ta, @@ -35,6 +46,19 @@ static int __find_debuginfo(Dwfl_Module *mod __maybe_unu= sed, void **userdata, return -1; } =20 +void libdw__invalidate_dwfl(struct maps *maps, void *arg) +{ + struct dwfl_ui_thread_info *dwfl_ui_ti =3D arg; + + if (!dwfl_ui_ti) + return; + + assert(dwfl_ui_ti->ui =3D=3D NULL); + maps__set_libdw_addr_space_dwfl(maps, NULL); + dwfl_end(dwfl_ui_ti->dwfl); + free(dwfl_ui_ti); +} + static const Dwfl_Callbacks offline_callbacks =3D { .find_debuginfo =3D __find_debuginfo, .debuginfo_path =3D &debuginfo_path, @@ -187,7 +211,8 @@ static int access_dso_mem(struct unwind_info *ui, Dwarf= _Addr addr, static bool memory_read(Dwfl *dwfl __maybe_unused, Dwarf_Addr addr, Dwarf_= Word *result, void *arg) { - struct unwind_info *ui =3D arg; + struct dwfl_ui_thread_info *dwfl_ui_ti =3D arg; + struct unwind_info *ui =3D dwfl_ui_ti->ui; uint16_t e_machine =3D thread__e_machine(ui->thread, ui->machine); struct stack_dump *stack =3D &ui->sample->user_stack; u64 start, end; @@ -228,7 +253,8 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwar= f_Addr addr, Dwarf_Word * =20 static bool libdw_set_initial_registers(Dwfl_Thread *thread, void *arg) { - struct unwind_info *ui =3D arg; + struct dwfl_ui_thread_info *dwfl_ui_ti =3D arg; + struct unwind_info *ui =3D dwfl_ui_ti->ui; struct regs_dump *user_regs =3D perf_sample__user_regs(ui->sample); Dwarf_Word *dwarf_regs; int max_dwarf_reg =3D 0; @@ -320,33 +346,50 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *a= rg, int max_stack, bool best_effort) { - struct machine *machine =3D maps__machine(thread__maps(thread)); + struct maps *maps =3D thread__maps(thread); + struct machine *machine =3D maps__machine(maps); uint16_t e_machine =3D thread__e_machine(thread, machine); - struct unwind_info *ui, ui_buf =3D { - .sample =3D data, - .thread =3D thread, - .machine =3D machine, - .cb =3D cb, - .arg =3D arg, - .max_stack =3D max_stack, - .e_machine =3D e_machine, - .best_effort =3D best_effort - }; + struct dwfl_ui_thread_info *dwfl_ui_ti; + static struct unwind_info *ui; + Dwfl *dwfl; Dwarf_Word ip; int err =3D -EINVAL, i; =20 if (!data->user_regs || !data->user_regs->regs) return -EINVAL; =20 - ui =3D zalloc(sizeof(ui_buf) + sizeof(ui_buf.entries[0]) * max_stack); + ui =3D zalloc(sizeof(*ui) + sizeof(ui->entries[0]) * max_stack); if (!ui) return -ENOMEM; =20 - *ui =3D ui_buf; + *ui =3D (struct unwind_info){ + .sample =3D data, + .thread =3D thread, + .machine =3D machine, + .cb =3D cb, + .arg =3D arg, + .max_stack =3D max_stack, + .e_machine =3D e_machine, + .best_effort =3D best_effort + }; =20 - ui->dwfl =3D dwfl_begin(&offline_callbacks); - if (!ui->dwfl) - goto out; + dwfl_ui_ti =3D maps__libdw_addr_space_dwfl(maps); + if (dwfl_ui_ti) { + dwfl =3D dwfl_ui_ti->dwfl; + } else { + dwfl_ui_ti =3D zalloc(sizeof(*dwfl_ui_ti)); + dwfl =3D dwfl_begin(&offline_callbacks); + if (!dwfl) + goto out; + + dwfl_ui_ti->dwfl =3D dwfl; + maps__set_libdw_addr_space_dwfl(maps, dwfl_ui_ti); + } + assert(dwfl_ui_ti->ui =3D=3D NULL); + assert(dwfl_ui_ti->dwfl =3D=3D dwfl); + assert(dwfl_ui_ti =3D=3D maps__libdw_addr_space_dwfl(maps)); + dwfl_ui_ti->ui =3D ui; + ui->dwfl =3D dwfl; =20 err =3D perf_reg_value(&ip, data->user_regs, perf_arch_reg_ip(e_machine)); if (err) @@ -356,11 +399,12 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *a= rg, if (err) goto out; =20 - err =3D !dwfl_attach_state(ui->dwfl, /*elf=3D*/NULL, thread__tid(thread),= &callbacks, ui); - if (err) - goto out; + dwfl_attach_state(dwfl, /*elf=3D*/NULL, thread__tid(thread), &callbacks, + /* Dwfl thread function argument*/dwfl_ui_ti); + // Ignore thread already attached error. =20 - err =3D dwfl_getthread_frames(ui->dwfl, thread__tid(thread), frame_callba= ck, ui); + err =3D dwfl_getthread_frames(dwfl, thread__tid(thread), frame_callback, + /* Dwfl frame function argument*/ui); =20 if (err && ui->max_stack !=3D max_stack) err =3D 0; @@ -384,7 +428,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, for (i =3D 0; i < ui->idx; i++) map_symbol__exit(&ui->entries[i].ms); =20 - dwfl_end(ui->dwfl); + dwfl_ui_ti->ui =3D NULL; free(ui); return 0; } diff --git a/tools/perf/util/unwind-libdw.h b/tools/perf/util/unwind-libdw.h index 9c5b5fcaaae8..3dec0ab8bd50 100644 --- a/tools/perf/util/unwind-libdw.h +++ b/tools/perf/util/unwind-libdw.h @@ -2,15 +2,17 @@ #ifndef __PERF_UNWIND_LIBDW_H #define __PERF_UNWIND_LIBDW_H =20 -#include +#include #include "unwind.h" =20 struct machine; struct perf_sample; struct thread; =20 +#ifdef HAVE_LIBDW_SUPPORT + struct unwind_info { - Dwfl *dwfl; + void *dwfl; struct perf_sample *sample; struct machine *machine; struct thread *thread; @@ -23,4 +25,7 @@ struct unwind_info { struct unwind_entry entries[]; }; =20 +void libdw__invalidate_dwfl(struct maps *maps, void *dwfl); +#endif + #endif /* __PERF_UNWIND_LIBDW_H */ --=20 2.52.0.457.g6b5491de43-goog From nobody Sun Feb 8 01:31:10 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 9D0DD32ABD1 for ; Sat, 17 Jan 2026 05:30:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627814; cv=none; b=GlGUcKunV06rWiyUStXNzuiGdzuGN3kbN+K3Pq5mKZAF5nVrv0J97Fi76ILENPG/xtt4K9R/kjcQeqFtjio5PcgDmQDKZnTPs4skF5HJfQMjzgCVumk8YBGQiGNM292mASASrY9gpc+UlKtbEUp5LMTLf0RY04hVOM3U/W4VHX8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768627814; c=relaxed/simple; bh=gU0n23qpAYe89nfFHwGuwfku8H+eTwshuJOdnRwVnQg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=JwLRyRDuiXBDUE3YT8Dmrfu1dPmO44+HkYsHf87Mp4MdwLkConOcCOWVsbJu7kFMskVQzPCXJ4Xxj/Vn5PWYF83LdDJ1pCCeygGuzUGV4ztN4JuQGwUM+Smxxc/fSFpUOmV10sT3GQ78Gnk8+SJZe7qHw+fk31305MeozjTo5h8= 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=uTZZ+9sK; arc=none smtp.client-ip=74.125.82.73 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="uTZZ+9sK" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-12339eea50bso15301101c88.1 for ; Fri, 16 Jan 2026 21:30:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768627803; x=1769232603; 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=qJFJ/K9bRhHbh9aObqDCWyeE1pcCmkJcXdgq+xqodbk=; b=uTZZ+9sKmC9ZxfoZ1Q6d/OtlGlaJmFdzC6h4dHbvyp5rcfnz69IFKKlD5VO6Snaj9E h1rE97xqQZK3GuOWBrtI803sqpRY5EK2Wm40jVZWhKaMQLuebw+EWXzzDBpdF3Qfj85i qnRwkxcmcz657GHp2LyJV459+yhUg77Lf17L7N8nx3BqkgWGG36L+tt0x0zvblNySyCU ZwkOc+zYZTuIJ8y+8yW7shJ+gp26UZgy1pxEdMpHq6DwbCF4t2hppnEtZN9LZ2XCtEL5 d0tDzEN/TLlE1YIsjQwyl1aFYbQscfEJSOzExWRCs2DiYvDYTiLjI/C1YUa/q1w6PGrf pPww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768627803; x=1769232603; 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=qJFJ/K9bRhHbh9aObqDCWyeE1pcCmkJcXdgq+xqodbk=; b=o4Ai22jfDZMotvDsu5gYe7doI4h7fMebQTJEeDrTqlxvzpZ00OjQ25pvH95E7tGyuj 3pO6AamV3H9HqKmpx0skkMIhLnC0MUERlOXfKZNdKkoWt18f7DKTQ+alfvsNavlEwykx uELY1uxI0f2SPDfnwBDxd9ARyscnD8YLMsOyxMAyJ+kwcOhwlsGoO1Lfz5A7jSzqKDyJ 1KoI3bHsmwIs2IGWH3dma2KMc5TRrHHUtbHUxIN3aO17jvaRsnd+EB2WVE+w5j+ojN32 1bkvUQ2lz4aphBda1oKmngb3IwLMwxAZQqrdp1WySN15ryBfv1W8CZ6uTRa7agINvWdA mVXQ== X-Forwarded-Encrypted: i=1; AJvYcCWtXJtfaT1K6/zk9HLSv/R00B6d5HBKRE/vjdqIkcWV/JPpMLd4uuksPRbms9/a55dyjHNwgNhE9Q8ebaY=@vger.kernel.org X-Gm-Message-State: AOJu0YyKgg6X2/MB7U4lUf+th8IICQWuppcNtJ5kH4aEV608RiUAkaQw O1QWuRvtDYZUZZ79IURaEBTatLGktya4u3qew0aqIWei6Zd4tQFXcqla52N8OXhRTMpCkbbr1sv /YiI02QCgoA== X-Received: from dlbqc7.prod.google.com ([2002:a05:7023:a87:b0:11d:cfa0:5ddf]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6886:b0:11b:9386:a3c3 with SMTP id a92af1059eb24-1244b395f30mr4327064c88.46.1768627802526; Fri, 16 Jan 2026 21:30:02 -0800 (PST) Date: Fri, 16 Jan 2026 21:28:49 -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-24-irogers@google.com> Subject: [PATCH v1 23/23] perf machine: Add inline information to frame pointer and LBR callchains 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" Use append_inlines in frame pointer and LBR cases. Update the addr2line test to also test frame pointers. LBR is also updated but inaccuracy in the branched to IP means the inline information is missing in the leaf. Leave LBR callchains untested for now. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/addr2line_inlines.sh | 31 +++++- tools/perf/util/machine.c | 104 +++++++++++--------- 2 files changed, 86 insertions(+), 49 deletions(-) diff --git a/tools/perf/tests/shell/addr2line_inlines.sh b/tools/perf/tests= /shell/addr2line_inlines.sh index 4a5b6f5be23d..ce30d9c7e0bf 100755 --- a/tools/perf/tests/shell/addr2line_inlines.sh +++ b/tools/perf/tests/shell/addr2line_inlines.sh @@ -21,8 +21,28 @@ trap_cleanup() { } trap trap_cleanup EXIT TERM INT =20 -test_inlinedloop() { - echo "Inline unwinding verification test" +test_fp() { + echo "Inline unwinding fp verification test" + # Record data. Currently only dwarf callchains support inlined functio= ns. + perf record --call-graph fp -e task-clock:u -o "${perf_data}" -- perf = test -w inlineloop 1 + + # Check output with inline (default) and srcline + perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}" + + # Expect the leaf and middle functions to occur on lines in the 20s, w= ith + # the non-inlined parent function on a line in the 30s. + if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && + grep -q "inlineloop.c:3.$" "${perf_script_txt}" + then + echo "Inline unwinding fp verification test [Success]" + else + echo "Inline unwinding fp verification test [Failed missing inline= d functions]" + err=3D1 + fi +} + +test_dwarf() { + echo "Inline unwinding dwarf verification test" # Record data. Currently only dwarf callchains support inlined functio= ns. perf record --call-graph dwarf -e task-clock:u -o "${perf_data}" -- pe= rf test -w inlineloop 1 =20 @@ -34,14 +54,15 @@ test_inlinedloop() { if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && grep -q "inlineloop.c:3.$" "${perf_script_txt}" then - echo "Inline unwinding verification test [Success]" + echo "Inline unwinding dwarf verification test [Success]" else - echo "Inline unwinding verification test [Failed missing inlined f= unctions]" + echo "Inline unwinding dwarf verification test [Failed missing inl= ined functions]" err=3D1 fi } =20 -test_inlinedloop +test_fp +test_dwarf =20 cleanup exit $err diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 841b711d970e..30d606fbf040 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2090,6 +2090,59 @@ struct iterations { u64 cycles; }; =20 +static int append_inlines(struct callchain_cursor *cursor, struct map_symb= ol *ms, u64 ip, + bool branch, struct branch_flags *flags, int nr_loop_iter, + u64 iter_cycles, u64 branch_from) +{ + struct symbol *sym =3D ms->sym; + struct map *map =3D ms->map; + struct inline_node *inline_node; + struct inline_list *ilist; + struct dso *dso; + u64 addr; + int ret =3D 1; + struct map_symbol ilist_ms; + bool first =3D true; + + if (!symbol_conf.inline_name || !map || !sym) + return ret; + + addr =3D map__dso_map_ip(map, ip); + addr =3D map__rip_2objdump(map, addr); + dso =3D map__dso(map); + + inline_node =3D inlines__tree_find(dso__inlined_nodes(dso), addr); + if (!inline_node) { + inline_node =3D dso__parse_addr_inlines(dso, addr, sym); + if (!inline_node) + return ret; + inlines__tree_insert(dso__inlined_nodes(dso), inline_node); + } + + ilist_ms =3D (struct map_symbol) { + .maps =3D maps__get(ms->maps), + .map =3D map__get(map), + }; + list_for_each_entry(ilist, &inline_node->val, list) { + ilist_ms.sym =3D ilist->symbol; + if (first) { + ret =3D callchain_cursor_append(cursor, ip, &ilist_ms, + branch, flags, nr_loop_iter, + iter_cycles, branch_from, ilist->srcline); + } else { + ret =3D callchain_cursor_append(cursor, ip, &ilist_ms, false, + NULL, 0, 0, 0, ilist->srcline); + } + first =3D false; + + if (ret !=3D 0) + return ret; + } + map_symbol__exit(&ilist_ms); + + return ret; +} + static int add_callchain_ip(struct thread *thread, struct callchain_cursor *cursor, struct symbol **parent, @@ -2170,6 +2223,11 @@ static int add_callchain_ip(struct thread *thread, ms.maps =3D maps__get(al.maps); ms.map =3D map__get(al.map); ms.sym =3D al.sym; + + if (append_inlines(cursor, &ms, ip, branch, flags, nr_loop_iter, + iter_cycles, branch_from) =3D=3D 0) + goto out; + srcline =3D callchain_srcline(&ms, al.addr); err =3D callchain_cursor_append(cursor, ip, &ms, branch, flags, nr_loop_iter, @@ -2888,49 +2946,6 @@ static int thread__resolve_callchain_sample(struct t= hread *thread, return 0; } =20 -static int append_inlines(struct callchain_cursor *cursor, struct map_symb= ol *ms, u64 ip) -{ - struct symbol *sym =3D ms->sym; - struct map *map =3D ms->map; - struct inline_node *inline_node; - struct inline_list *ilist; - struct dso *dso; - u64 addr; - int ret =3D 1; - struct map_symbol ilist_ms; - - if (!symbol_conf.inline_name || !map || !sym) - return ret; - - addr =3D map__dso_map_ip(map, ip); - addr =3D map__rip_2objdump(map, addr); - dso =3D map__dso(map); - - inline_node =3D inlines__tree_find(dso__inlined_nodes(dso), addr); - if (!inline_node) { - inline_node =3D dso__parse_addr_inlines(dso, addr, sym); - if (!inline_node) - return ret; - inlines__tree_insert(dso__inlined_nodes(dso), inline_node); - } - - ilist_ms =3D (struct map_symbol) { - .maps =3D maps__get(ms->maps), - .map =3D map__get(map), - }; - list_for_each_entry(ilist, &inline_node->val, list) { - ilist_ms.sym =3D ilist->symbol; - ret =3D callchain_cursor_append(cursor, ip, &ilist_ms, false, - NULL, 0, 0, 0, ilist->srcline); - - if (ret !=3D 0) - return ret; - } - map_symbol__exit(&ilist_ms); - - return ret; -} - static int unwind_entry(struct unwind_entry *entry, void *arg) { struct callchain_cursor *cursor =3D arg; @@ -2940,7 +2955,8 @@ static int unwind_entry(struct unwind_entry *entry, v= oid *arg) if (symbol_conf.hide_unresolved && entry->ms.sym =3D=3D NULL) return 0; =20 - if (append_inlines(cursor, &entry->ms, entry->ip) =3D=3D 0) + if (append_inlines(cursor, &entry->ms, entry->ip, /*branch=3D*/false, /*b= ranch_flags=3D*/NULL, + /*nr_loop_iter=3D*/0, /*iter_cycles=3D*/0, /*branch_from=3D*/0) =3D= =3D 0) return 0; =20 /* --=20 2.52.0.457.g6b5491de43-goog