Source-Changes-HG archive

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

[src/trunk]: src/lib/libc/arch/alpha/sys Add call frame unwind info to the Al...



details:   https://anonhg.NetBSD.org/src/rev/313660cc17b1
branches:  trunk
changeset: 941431:313660cc17b1
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Wed Oct 21 01:55:07 2020 +0000

description:
Add call frame unwind info to the Alpha signal trampoline.  Using
kamil@'s test program:

Before:
Backtrace 2 stack frames.
0x120000a74 <handler+0x54> at ./test
0x3fffdca6550 <__sigtramp_siginfo_2> at /usr/lib/libc.so.12

After:
Backtrace 4 stack frames.
0x120000a74 <handler+0x54> at ./test
0x3fffdca6554 <__sigtramp_siginfo_2> at /usr/lib/libc.so.12
0x120000b10 <main+0x38> at ./test
0x1200009b4 <___start+0x1a4> at ./test

diffstat:

 lib/libc/arch/alpha/sys/__sigtramp2.S |  49 ++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diffs (67 lines):

diff -r 9d746ff88bd8 -r 313660cc17b1 lib/libc/arch/alpha/sys/__sigtramp2.S
--- a/lib/libc/arch/alpha/sys/__sigtramp2.S     Wed Oct 21 01:24:04 2020 +0000
+++ b/lib/libc/arch/alpha/sys/__sigtramp2.S     Wed Oct 21 01:55:07 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: __sigtramp2.S,v 1.3 2020/10/21 01:24:05 thorpej Exp $  */
+/*     $NetBSD: __sigtramp2.S,v 1.4 2020/10/21 01:55:07 thorpej Exp $  */
 
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -39,10 +39,57 @@
  *             ucontext structure      [128] == sp + sizeof(siginfo_t)]
  *     sp->    siginfo structure       [0]
  */
+
+#define        CFI_OFFSET(r)   .cfi_offset r, SIZEOF_SIGINFO + UC_GREGS + r*8
+
+       .cfi_startproc simple
+       .cfi_signal_frame
+       .cfi_def_cfa _REG_SP, 0
+       CFI_OFFSET(_REG_V0)
+       CFI_OFFSET(_REG_T0)
+       CFI_OFFSET(_REG_T1)
+       CFI_OFFSET(_REG_T2)
+       CFI_OFFSET(_REG_T3)
+       CFI_OFFSET(_REG_T4)
+       CFI_OFFSET(_REG_T5)
+       CFI_OFFSET(_REG_T6)
+       CFI_OFFSET(_REG_T7)
+       CFI_OFFSET(_REG_S0)
+       CFI_OFFSET(_REG_S1)
+       CFI_OFFSET(_REG_S2)
+       CFI_OFFSET(_REG_S3)
+       CFI_OFFSET(_REG_S4)
+       CFI_OFFSET(_REG_S5)
+       CFI_OFFSET(_REG_S6)
+       CFI_OFFSET(_REG_A0)
+       CFI_OFFSET(_REG_A1)
+       CFI_OFFSET(_REG_A2)
+       CFI_OFFSET(_REG_A3)
+       CFI_OFFSET(_REG_A4)
+       CFI_OFFSET(_REG_A5)
+       CFI_OFFSET(_REG_T8)
+       CFI_OFFSET(_REG_T9)
+       CFI_OFFSET(_REG_T10)
+       CFI_OFFSET(_REG_T11)
+       CFI_OFFSET(_REG_RA)
+       CFI_OFFSET(_REG_T12)    /* a.k.a. _REG_PV */
+       CFI_OFFSET(_REG_AT)
+       CFI_OFFSET(_REG_GP)
+       CFI_OFFSET(_REG_SP)
+
+/*
+ * The unwind entry includes one instruction slot prior to the trampoline
+ * because the unwinder will look up to (return PC - 1 insn) while unwinding.
+ * Normally this would be the jump / branch, but since there isn't one in
+ * this case, we place an explcit nop there instead.
+ */
+       nop
+
 NESTED_NOPROFILE(__sigtramp_siginfo_2,0,0,ra,0,0)
        ldgp    gp,0(ra)
        lda     a0,(SIZEOF_SIGINFO)(sp) /* get pointer to ucontext */
        CALLSYS_NOERROR(setcontext)     /* and call setcontext() with it */
        ldiq    a0,-1                   /* if that failed, set an exit code */
        CALLSYS_NOERROR(exit)           /* and call exit() */
+       .cfi_endproc
 END(__sigtramp_siginfo_2)



Home | Main Index | Thread Index | Old Index