[PATCH v4 5/5] aarch64: Add SFrame support for aarch64 architecture
Sam James
sam@gentoo.org
Sat Apr 19 05:29:53 GMT 2025
claudiu.zissulescu-ianculescu@oracle.com writes:
> From: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
>
> The SFrame is supported for AArch64 architecture.
> Enable SFrame stack tracer for AArch64 too.
>
> Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
> ---
> sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h | 64 +++++++++++++++++++
> 1 file changed, 64 insertions(+)
> create mode 100644 sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h
>
> diff --git a/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h b/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h
> new file mode 100644
> index 0000000000..36049afab6
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h
> @@ -0,0 +1,64 @@
> +/* Signal frame backtracing support for SFrame on AARCH64.
> + Copyright (C) 2025 Free Software Foundation, Inc.
> +
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public License
> + as published by the Free Software Foundation; either version 2.1 of
> + the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be
> + useful, but WITHOUT ANY WARRANTY; without even the implied warranty
> + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +/* This code is inspired from libgcc's MD_FALLBACK_FRAME_STATE_FOR
> + implementation. See libgcc/config/aarch64/gnu-unwind.h */
Surely not, as for aarch64 (unlike for x86), it's a TODO ;)
You mean libgcc/config/aarch64/linux-unwind.h.
> +
> +#include <signal.h>
> +#include <sys/ucontext.h>
> +#include <kernel_rt_sigframe.h>
> +
> +#if __AARCH64EL__
> +#define MOVZ_X8_8B 0xd2801168
> +#define SVC_0 0xd4000001
> +#else
> +#define MOVZ_X8_8B 0x681180d2
> +#define SVC_0 0x010000d4
> +#endif
> +
> +#define MD_DECODE_SIGNAL_FRAME aarch64_decode_signal_frame
> +
> +static _Unwind_Reason_Code
> +aarch64_decode_signal_frame (frame *frame)
> +{
> + unsigned int *pc = (unsigned int *) frame->pc;
> + struct sigcontext *sc;
> + struct kernel_rt_sigframe *rt_;
> +
> + /* A signal frame will have a return address pointing to
> + __default_sa_restorer. This code is hardwired as:
> +
> + 0xd2801168 movz x8, #0x8b
> + 0xd4000001 svc 0x0
> + */
> + if (pc[0] != MOVZ_X8_8B || pc[1] != SVC_0)
> + return _URC_END_OF_STACK;
> +
> + rt_ = (struct kernel_rt_sigframe *) frame->sp;
> + sc = (struct sigcontext *) &rt_->uc.uc_mcontext;
> +
> +#define SP_REGNUM 31
> +#define LR_REGNUM 29
What's the purpose of these other two defines? I'm not against them
being here as documentation (and it's up to the aarch64 maintainers),
but curious. A comment may be nice if it is just for documentation.
> +#define FP_REGNUM 30
> +
> + frame->pc = (_Unwind_Ptr) sc->pc;
> + frame->sp = (_Unwind_Ptr) sc->sp;
> + frame->fp = (_Unwind_Ptr) sc->regs[FP_REGNUM];
> + return _URC_NO_REASON;
> +}
More information about the Libc-alpha
mailing list