From: Stian Halseth <stian@itx.no>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Andreas Larsson <andreas@gaisler.com>,
"David S. Miller" <davem@davemloft.net>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Randy Dunlap <rdunlap@infradead.org>,
Magnus Lindholm <linmag7@gmail.com>,
linux-perf-users@vger.kernel.org, sparclinux@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Stian Halseth <stian@itx.no>
Subject: [RFC PATCH v2 0/3] perf: sparc64 user regs and stack dump, with an arch hook
Date: Tue, 22 Sep 2026 22:15:04 +0200 [thread overview]
Message-ID: <20260922201507.1719668-1-stian@itx.no> (raw)
This adds HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP to sparc64, so
that perf record --call-graph dwarf and elfutils' eu-stackprof work
there.
One piece does not fit in arch code. The user stack dump copies the
stack as it is in memory and assumes the call chain is there. On sparc
it may not be: the sampled register window's %l/%i registers, which
hold the frame pointer and return address the unwinder starts from
(the CFI after `save` defines the CFA in terms of %i6), stay in the
register file until a window spills. The kernel already deals with
this wherever it exposes user stack memory: perf_callchain_user() on
sparc calls flushw_user() before walking the chain, and ptrace does
the same. The stack dump has no arch entry point where that could
happen, and I found no correct sparc-only place:
- flushing in the sparc PMU interrupt handler misses software events
(cpu-clock, tracepoints), which reach perf_event_overflow() without
passing through it;
- perf_user_stack_pointer() is private to kernel/events/internal.h;
- perf_reg_abi() is called at the right time but is a query, and a
flush as a side effect of it would be wrong.
Patch 1 therefore adds a no-op hook in the style of
perf_arch_misc_flags(), perf_arch_prepare_ustack(), called from
perf_prepare_sample() when PERF_SAMPLE_STACK_USER is requested and
user regs exist. Patch 2 is the sparc64 implementation and its user.
Patch 3 teaches tools/perf the sparc registers and DWARF unwinding
from the dump. The matching elfutils changes, which make eu-stackprof
work, are attached to the tracking issue as patches against current
elfutils main:
https://github.com/sparclinux/issues/issues/99
Tested on an UltraSPARC T4-1 on 7.3-rc4: register values check out
against known contents, --call-graph dwarf unwinds correctly for both
cycles and cpu-clock, eu-stackprof unwinds the same chains, and perf
stat/record/record -g are unchanged.
Changes since v1:
- Patch 2: truncate a 32-bit task's values only for user_mode(regs),
so kernel-mode PERF_SAMPLE_REGS_INTR registers stay intact
(sashiko review).
- Patch 2: document that the stack dump starts at the biased %sp.
- Patch 2: mark sparc ok in Documentation/features for perf-regs and
perf-stackdump (Magnus).
- Patch 3 (tools/perf) added (Magnus).
v1: https://lore.kernel.org/all/20260922135653.1622301-1-stian@itx.no/
Stian Halseth (3):
perf/core: Let an arch prepare the user stack before it is dumped
sparc64: Support PERF_SAMPLE_REGS_USER and PERF_SAMPLE_STACK_USER
perf tools: Support sparc user register samples and dwarf unwinding
.../features/perf/perf-regs/arch-support.txt | 2 +-
.../perf/perf-stackdump/arch-support.txt | 2 +-
arch/sparc/Kconfig | 2 +
arch/sparc/include/asm/perf_event.h | 3 +
arch/sparc/include/uapi/asm/perf_regs.h | 33 +++++++++
arch/sparc/kernel/Makefile | 2 +-
arch/sparc/kernel/perf_regs.c | 65 +++++++++++++++++
include/linux/perf_event.h | 7 ++
kernel/events/core.c | 2 +
tools/arch/sparc/include/uapi/asm/perf_regs.h | 33 +++++++++
tools/perf/arch/sparc/include/perf_regs.h | 18 +++++
tools/perf/check-headers.sh | 1 +
tools/perf/util/dwarf-regs-arch/Build | 1 +
.../util/dwarf-regs-arch/dwarf-regs-sparc.c | 12 ++++
tools/perf/util/dwarf-regs.c | 4 ++
tools/perf/util/include/dwarf-regs.h | 1 +
tools/perf/util/perf-regs-arch/Build | 1 +
.../util/perf-regs-arch/perf_regs_sparc.c | 69 +++++++++++++++++++
tools/perf/util/perf_regs.c | 18 +++++
tools/perf/util/perf_regs.h | 5 ++
tools/perf/util/unwind-libdw.c | 41 ++++++++++-
21 files changed, 318 insertions(+), 4 deletions(-)
create mode 100644 arch/sparc/include/uapi/asm/perf_regs.h
create mode 100644 arch/sparc/kernel/perf_regs.c
create mode 100644 tools/arch/sparc/include/uapi/asm/perf_regs.h
create mode 100644 tools/perf/arch/sparc/include/perf_regs.h
create mode 100644 tools/perf/util/dwarf-regs-arch/dwarf-regs-sparc.c
create mode 100644 tools/perf/util/perf-regs-arch/perf_regs_sparc.c
--
2.55.0
next reply other threads:[~2026-09-22 20:15 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 20:15 Stian Halseth [this message]
2026-09-22 20:15 ` [RFC PATCH v2 1/3] perf/core: Let an arch prepare the user stack before it is dumped Stian Halseth
2026-09-22 20:15 ` [RFC PATCH v2 2/3] sparc64: Support PERF_SAMPLE_REGS_USER and PERF_SAMPLE_STACK_USER Stian Halseth
2026-09-22 20:15 ` [RFC PATCH v2 3/3] perf tools: Support sparc user register samples and dwarf unwinding Stian Halseth
2026-09-22 20:31 ` Ian Rogers
2026-09-22 21:09 ` Stian Halseth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260922201507.1719668-1-stian@itx.no \
--to=stian@itx.no \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andreas@gaisler.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linmag7@gmail.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=skhan@linuxfoundation.org \
--cc=sparclinux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox