Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/arch/arm Decorate the ARM signal trampoline with th...



details:   https://anonhg.NetBSD.org/src/rev/6f00afebf608
branches:  trunk
changeset: 1026417:6f00afebf608
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Tue Nov 23 18:45:53 2021 +0000

description:
Decorate the ARM signal trampoline with the appropriate .cfi
directives to allow exception unwind / backtrace across a signal
handler.

diffstat:

 lib/libc/arch/arm/genassym.cf       |  37 +++++++++++++++++++++-------------
 lib/libc/arch/arm/sys/__sigtramp2.S |  39 +++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 16 deletions(-)

diffs (118 lines):

diff -r 3d628bd3b2fb -r 6f00afebf608 lib/libc/arch/arm/genassym.cf
--- a/lib/libc/arch/arm/genassym.cf     Tue Nov 23 17:54:08 2021 +0000
+++ b/lib/libc/arch/arm/genassym.cf     Tue Nov 23 18:45:53 2021 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: genassym.cf,v 1.3 2020/10/24 07:03:11 skrll Exp $
+#      $NetBSD: genassym.cf,v 1.4 2021/11/23 18:45:53 thorpej Exp $
 
 #
 # Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,21 +30,30 @@
 #
 
 include <sys/types.h>
+include <signal.h>
 include <ucontext.h>
 
+define _UC_GREGS       offsetof(ucontext_t, uc_mcontext.__gregs[0])
 define _UC_REGS_R0     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R0])
-define _UC_REGS_R1     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R1])
-define _UC_REGS_R2     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R2])
-define _UC_REGS_R3     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R3])
-define _UC_REGS_R4     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R4])
-define _UC_REGS_R5     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R5])
-define _UC_REGS_R6     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R6])
-define _UC_REGS_R7     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R7])
-define _UC_REGS_R8     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R8])
-define _UC_REGS_R9     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R9])
-define _UC_REGS_R10    offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R10])
-define _UC_REGS_R11    offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R11])
-define _UC_REGS_R12    offsetof(ucontext_t, uc_mcontext.__gregs[_REG_R12])
 define _UC_REGS_SP     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_SP])
-define _UC_REGS_LR     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_LR])
 define _UC_REGS_PC     offsetof(ucontext_t, uc_mcontext.__gregs[_REG_PC])
+
+define SIZEOF_SIGINFO  sizeof(siginfo_t)
+
+define _REG_R0         _REG_R0
+define _REG_R1         _REG_R1
+define _REG_R2         _REG_R2
+define _REG_R3         _REG_R3
+define _REG_R4         _REG_R4
+define _REG_R5         _REG_R5
+define _REG_R6         _REG_R6
+define _REG_R7         _REG_R7
+define _REG_R8         _REG_R8
+define _REG_R9         _REG_R9
+define _REG_R10                _REG_R10
+define _REG_R11                _REG_R11
+define _REG_R12                _REG_R12
+define _REG_R13                _REG_R13
+define _REG_R14                _REG_R14
+define _REG_R15                _REG_R15
+define _REG_SP         _REG_SP
diff -r 3d628bd3b2fb -r 6f00afebf608 lib/libc/arch/arm/sys/__sigtramp2.S
--- a/lib/libc/arch/arm/sys/__sigtramp2.S       Tue Nov 23 17:54:08 2021 +0000
+++ b/lib/libc/arch/arm/sys/__sigtramp2.S       Tue Nov 23 18:45:53 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: __sigtramp2.S,v 1.3 2013/08/16 23:20:59 matt Exp $     */
+/*     $NetBSD: __sigtramp2.S,v 1.4 2021/11/23 18:45:53 thorpej Exp $  */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,6 +30,7 @@
  */
 
 #include "SYS.h"
+#include "assym.h"
 
 /*
  * The ARM signal trampoline is invoked only to return from
@@ -39,12 +40,46 @@
  *
  *             ucontext structure
  *     sp->    siginfo structure
- * and  r5 points to the ucontext
+ * and r5 points to the ucontext
  */
+
+#define        CFI_OFFSET(r)                   .cfi_offset r, r * 4
+
+       _TEXT_SECTION
+       .cfi_startproc
+       .cfi_signal_frame
+       .cfi_def_cfa _REG_SP, SIZEOF_SIGINFO + _UC_GREGS
+       CFI_OFFSET(_REG_R0)
+       CFI_OFFSET(_REG_R1)
+       CFI_OFFSET(_REG_R2)
+       CFI_OFFSET(_REG_R3)
+       CFI_OFFSET(_REG_R4)
+       CFI_OFFSET(_REG_R5)
+       CFI_OFFSET(_REG_R6)
+       CFI_OFFSET(_REG_R7)
+       CFI_OFFSET(_REG_R8)
+       CFI_OFFSET(_REG_R9)
+       CFI_OFFSET(_REG_R10)
+       CFI_OFFSET(_REG_R11)
+       CFI_OFFSET(_REG_R12)
+       CFI_OFFSET(_REG_R13)    /* a.k.a. _REG_SP */
+       CFI_OFFSET(_REG_R14)    /* a.k.a. _REG_LR */
+       .cfi_return_column _REG_R15
+       CFI_OFFSET(_REG_R15)    /* a.k.a. _REG_PC */
+
+/*      
+ * The unwind entry includes the one instruction prior to the trampoline
+ * because the unwinder will look up (return PC - 1) while unwinding.
+ * Normally this would be the jump / branch, but since there isn't one in
+ * this case, we place an explicit nop there instead.
+ */     
+       nop
+
 ENTRY_NP(__sigtramp_siginfo_2)
        mov r0, r5                              /* 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