Module Name:    src
Committed By:   kamil
Date:           Tue Oct 13 01:59:55 UTC 2020

Modified Files:
        src/lib/libc/arch/aarch64: genassym.cf
        src/lib/libc/arch/aarch64/sys: __sigtramp2.S

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/arch/aarch64/genassym.cf
cvs rdiff -u -r1.1 -r1.2 src/lib/libc/arch/aarch64/sys/__sigtramp2.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/aarch64/genassym.cf
diff -u src/lib/libc/arch/aarch64/genassym.cf:1.2 src/lib/libc/arch/aarch64/genassym.cf:1.3
--- src/lib/libc/arch/aarch64/genassym.cf:1.2	Sun May 10 14:05:59 2020
+++ src/lib/libc/arch/aarch64/genassym.cf	Tue Oct 13 01:59:55 2020
@@ -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 <ucontext.h>
 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])
 

Index: src/lib/libc/arch/aarch64/sys/__sigtramp2.S
diff -u src/lib/libc/arch/aarch64/sys/__sigtramp2.S:1.1 src/lib/libc/arch/aarch64/sys/__sigtramp2.S:1.2
--- src/lib/libc/arch/aarch64/sys/__sigtramp2.S:1.1	Sun Aug 10 05:47:37 2014
+++ src/lib/libc/arch/aarch64/sys/__sigtramp2.S	Tue Oct 13 01:59:55 2020
@@ -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)

Reply via email to