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
This commit is contained in:
parent
48c5aec857
commit
521b46f7aa
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue