Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/arch/aarch64 Decorate the aarch64 signal trampoline...
details: https://anonhg.NetBSD.org/src/rev/aaeb733f37c2
branches: trunk
changeset: 940659:aaeb733f37c2
user: kamil <kamil%NetBSD.org@localhost>
date: Tue Oct 13 01:59:55 2020 +0000
description:
Decorate the aarch64 signal trampoline with CFI attributes easing unwinding
Now, the unwinders (in backtrace(3) and similar) can unwind properly
the stack from a signal handler.
diffstat:
lib/libc/arch/aarch64/genassym.cf | 32 ++++++++++++++++++++++-
lib/libc/arch/aarch64/sys/__sigtramp2.S | 46 ++++++++++++++++++++++++++++++++-
2 files changed, 76 insertions(+), 2 deletions(-)
diffs (118 lines):
diff -r 746cdc80fa44 -r aaeb733f37c2 lib/libc/arch/aarch64/genassym.cf
--- a/lib/libc/arch/aarch64/genassym.cf Tue Oct 13 01:59:32 2020 +0000
+++ b/lib/libc/arch/aarch64/genassym.cf Tue Oct 13 01:59:55 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.2 2020/05/10 14:05:59 skrll Exp $
+# $NetBSD: genassym.cf,v 1.3 2020/10/13 01:59:55 kamil Exp $
#-
# Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -34,6 +34,36 @@
include <setjmp.h>
define _UC_REGS_X0 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X0])
+define _UC_REGS_X1 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X1])
+define _UC_REGS_X2 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X2])
+define _UC_REGS_X3 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X3])
+define _UC_REGS_X4 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X4])
+define _UC_REGS_X5 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X5])
+define _UC_REGS_X6 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X6])
+define _UC_REGS_X7 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X7])
+define _UC_REGS_X8 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X8])
+define _UC_REGS_X9 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X9])
+define _UC_REGS_X10 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X10])
+define _UC_REGS_X11 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X11])
+define _UC_REGS_X12 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X12])
+define _UC_REGS_X13 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X13])
+define _UC_REGS_X14 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X14])
+define _UC_REGS_X15 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X15])
+define _UC_REGS_X16 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X16])
+define _UC_REGS_X17 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X17])
+define _UC_REGS_X18 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X18])
+define _UC_REGS_X19 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X19])
+define _UC_REGS_X20 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X20])
+define _UC_REGS_X21 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X21])
+define _UC_REGS_X22 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X22])
+define _UC_REGS_X23 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X23])
+define _UC_REGS_X24 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X24])
+define _UC_REGS_X25 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X25])
+define _UC_REGS_X26 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X26])
+define _UC_REGS_X27 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X27])
+define _UC_REGS_X28 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X28])
+define _UC_REGS_X29 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X29])
+define _UC_REGS_X30 offsetof(ucontext_t, uc_mcontext.__gregs[_REG_X30])
define _UC_REGS_SP offsetof(ucontext_t, uc_mcontext.__gregs[_REG_SP])
define _UC_REGS_PC offsetof(ucontext_t, uc_mcontext.__gregs[_REG_PC])
diff -r 746cdc80fa44 -r aaeb733f37c2 lib/libc/arch/aarch64/sys/__sigtramp2.S
--- a/lib/libc/arch/aarch64/sys/__sigtramp2.S Tue Oct 13 01:59:32 2020 +0000
+++ b/lib/libc/arch/aarch64/sys/__sigtramp2.S Tue Oct 13 01:59:55 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: __sigtramp2.S,v 1.1 2014/08/10 05:47:37 matt Exp $ */
+/* $NetBSD: __sigtramp2.S,v 1.2 2020/10/13 01:59:55 kamil Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,6 +30,7 @@
*/
#include "SYS.h"
+#include "assym.h"
/*
* The ARM signal trampoline is invoked only to return from
@@ -40,11 +41,54 @@
* ucontext structure
* sp-> siginfo structure
* and x28 points to the ucontext
+ *
+ * The unwind entry includes the one byte prior to the trampoline
+ * because the unwinder will look up (return PC - 1) while unwinding.
+ * Normally (return PC - 1) computes an address inside the call
+ * instruction that created the child frame, but here there is no call
+ * instruction so we have to manually add padding.
*/
+ .cfi_startproc simple
+ .cfi_signal_frame
+ .cfi_def_cfa x28, 0
+ .cfi_offset x0, _UC_REGS_X0
+ .cfi_offset x1, _UC_REGS_X1
+ .cfi_offset x2, _UC_REGS_X2
+ .cfi_offset x3, _UC_REGS_X3
+ .cfi_offset x4, _UC_REGS_X4
+ .cfi_offset x5, _UC_REGS_X5
+ .cfi_offset x6, _UC_REGS_X6
+ .cfi_offset x7, _UC_REGS_X7
+ .cfi_offset x8, _UC_REGS_X8
+ .cfi_offset x9, _UC_REGS_X9
+ .cfi_offset x10, _UC_REGS_X10
+ .cfi_offset x11, _UC_REGS_X11
+ .cfi_offset x12, _UC_REGS_X12
+ .cfi_offset x13, _UC_REGS_X13
+ .cfi_offset x14, _UC_REGS_X14
+ .cfi_offset x15, _UC_REGS_X15
+ .cfi_offset x16, _UC_REGS_X16
+ .cfi_offset x17, _UC_REGS_X17
+ .cfi_offset x18, _UC_REGS_X18
+ .cfi_offset x19, _UC_REGS_X19
+ .cfi_offset x20, _UC_REGS_X20
+ .cfi_offset x21, _UC_REGS_X21
+ .cfi_offset x22, _UC_REGS_X22
+ .cfi_offset x23, _UC_REGS_X23
+ .cfi_offset x24, _UC_REGS_X24
+ .cfi_offset x25, _UC_REGS_X25
+ .cfi_offset x26, _UC_REGS_X26
+ .cfi_offset x27, _UC_REGS_X27
+ .cfi_offset x28, _UC_REGS_X28
+ .cfi_offset x29, _UC_REGS_X29
+ .cfi_offset x30, _UC_REGS_X30
+ /* The unwinder will use the CFA to restore X31 (SP). */
+ nop
ENTRY_NP(__sigtramp_siginfo_2)
mov x0, x28 /* set the arg */
SYSTRAP(setcontext) /* and call setcontext */
/* If that failed, exit with the error code. */
SYSTRAP(exit)
+ .cfi_endproc
END(__sigtramp_siginfo_2)
Home |
Main Index |
Thread Index |
Old Index