[PATCH v8 00/11] unwind, arm64: add sframe unwinder for kernel
From: Dylan Hatch
Date: Wed Oct 07 2026 - 08:13:52 EST
Implement a generic kernel sframe-based [1] unwinder. The main goal is
to improve reliable stacktrace on arm64 by unwinding across exception
boundaries.
On x86, the ORC unwinder provides reliable stacktrace through similar
methodology, but arm64 lacks the necessary support from objtool to
create ORC unwind tables.
Currently, there is a sframe unwinder proposed for userspace [2], along
with an RFC for an .eh_frame unwinder [5]. This patch series implements
a similar SFrame lookup library to [2], but with many simplifications to
account for the fact that user access is not necessary. The intent here
is to continue to leave the door open for common usage of definitions
and algorithms between kernel and user unwind in the future, while at
the same time keeping these patches strictly constrained the minimal set
of features necessary for arm64 kernel unwind.
Unlike past versions of this series, these patches apply directly to
v7.3-rc3 rather than depending upon [2]. To make this possible, I've
adopted a number of patches from [2] with significant squashes and
changes made in order to coherently suit the kernel unwind use case.
I've done my best to maintain appropriate authorship on these changes,
and have added 'Co-developed-by' trailers to attribute shared authorship
as accurately as possible. Please let me know if you see any
discrepencies in my work here.
Currently, only GNU Binutils support sframe. This series relies on the
Sframe V3 format, which is supported in binutils 2.46.
This full series is available on github: [4].
Ref:
[1]: https://sourceware.org/binutils/docs/sframe-spec.html
[2]: https://lore.kernel.org/all/20260505121718.3572346-1-jremus@xxxxxxxxxxxxx/
[3]: https://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git/log/?h=sframe/core
[4]: https://github.com/dylanbhatch/linux/tree/sframe-v7
[5]: https://lore.kernel.org/all/20260821195259.2688377-1-jremus@xxxxxxxxxxxxx/
---
Summary of changes since v7:
- (sashiko): Put .cfi_startproc right after SYM_START to account for
potential alignment bytes ahead of the actual function symbol.
- (sashiko) Use __always_inline for IP validation helper.
- (sashiko) Move .sframe module init and sframe section fields to arch
generic code.
- (sashiko) Make sframe_find() noinstr.
- (sashiko) Add preempt_notrace and instrumentation to
__sframe_module_find() code path.
- (sashiko) Block tracing and kprobe on the sframe_find code path.
- (shashiko) remove KCOV, KCSAN, and KASAN instrumentation from
sframe.o (copying over ORC's shoulder).
Dylan Hatch (6):
arm64, unwind: build kernel with sframe V3 info
module, sframe: Add sframe support for modules
arm64/sframe: Validate IP addresses
sframe: Add debug helpers with object name
arm64, crypto/lib: Annotate leaf functions with CFI info
unwind: arm64: Use sframe to unwind interrupt frames
Jens Remus (1):
sframe: Separate reading of FRE from reading of FRE data words
Josh Poimboeuf (3):
arm64/sframe: Read vmlinux .sframe header
sframe: Add support for reading vmlinux .sframe contents
sframe: Add .sframe validation option
Weinan Liu (1):
arm64: entry: add unwind info for call_on_irq_stack()
MAINTAINERS | 4 +-
Makefile | 8 +
arch/Kconfig | 49 ++
arch/arm64/Kconfig | 1 +
arch/arm64/Makefile | 2 +-
arch/arm64/crypto/aes-ce-ccm-core.S | 12 +-
arch/arm64/crypto/aes-neonbs-core.S | 16 +-
arch/arm64/crypto/ghash-ce-core.S | 12 +-
arch/arm64/crypto/sm4-ce-ccm-core.S | 16 +-
arch/arm64/crypto/sm4-ce-cipher-core.S | 4 +-
arch/arm64/crypto/sm4-ce-core.S | 44 +-
arch/arm64/crypto/sm4-ce-gcm-core.S | 16 +-
arch/arm64/crypto/sm4-neon-core.S | 12 +-
arch/arm64/include/asm/linkage.h | 32 ++
arch/arm64/include/asm/module.h | 1 +
arch/arm64/include/asm/module.lds.h | 2 +
arch/arm64/include/asm/sections.h | 1 +
arch/arm64/include/asm/unwind_sframe.h | 32 ++
arch/arm64/kernel/entry.S | 14 +
arch/arm64/kernel/setup.c | 2 +
arch/arm64/kernel/stacktrace.c | 184 ++++++-
arch/arm64/kernel/vdso/Makefile | 2 +-
arch/arm64/kernel/vmlinux.lds.S | 14 +
arch/arm64/lib/clear_page.S | 4 +-
arch/arm64/lib/clear_user.S | 4 +-
arch/arm64/lib/copy_from_user.S | 4 +-
arch/arm64/lib/copy_page.S | 4 +-
arch/arm64/lib/copy_to_user.S | 4 +-
arch/arm64/lib/memchr.S | 4 +-
arch/arm64/lib/memcmp.S | 4 +-
arch/arm64/lib/memcpy.S | 8 +-
arch/arm64/lib/memset.S | 8 +-
arch/arm64/lib/mte.S | 28 +-
arch/arm64/lib/strchr.S | 4 +-
arch/arm64/lib/strcmp.S | 4 +-
arch/arm64/lib/strlen.S | 4 +-
arch/arm64/lib/strncmp.S | 4 +-
arch/arm64/lib/strnlen.S | 4 +-
arch/arm64/lib/tishift.S | 12 +-
include/asm-generic/sections.h | 4 +
include/asm-generic/vmlinux.lds.h | 15 +
include/linux/module.h | 5 +
include/linux/sframe.h | 43 ++
include/linux/unwind_types.h | 34 ++
kernel/module/main.c | 21 +
kernel/unwind/Makefile | 5 +-
kernel/unwind/sframe.c | 710 +++++++++++++++++++++++++
kernel/unwind/sframe.h | 79 +++
kernel/unwind/sframe_debug.h | 34 ++
49 files changed, 1401 insertions(+), 133 deletions(-)
create mode 100644 arch/arm64/include/asm/unwind_sframe.h
create mode 100644 include/linux/sframe.h
create mode 100644 include/linux/unwind_types.h
create mode 100644 kernel/unwind/sframe.c
create mode 100644 kernel/unwind/sframe.h
create mode 100644 kernel/unwind/sframe_debug.h
--
2.56.0.360.g66cac248cb-goog