Insert STOP_UNWINDING directives in the _start (kernel entry point) and

fork_trampoline (thread entry point) assembler routines, because it's
not possible to unwind beyond those points.

Also insert STOP_UNWINDING in the exception_exit routine, to prevent an
unwind-loop at that point.  This is just a stopgap until we get around
to instrumenting all assembler functions with proper unwind metadata.
This commit is contained in:
Ian Lepore 2013-05-04 19:59:35 +00:00
parent abf29ad1a4
commit 506bb6751c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=250253
3 changed files with 12 additions and 4 deletions

View File

@ -196,15 +196,20 @@ END(address_exception_entry)
* Interrupts are disabled at suitable points to avoid ASTs
* being posted between testing and exit to user mode.
*
* This function uses PULLFRAMEFROMSVCANDEXIT and
* DO_AST
* only be called if the exception handler used PUSHFRAMEINSVC
* This function uses PULLFRAMEFROMSVCANDEXIT and DO_AST and can
* only be called if the exception handler used PUSHFRAMEINSVC.
*
* For EABI, don't try to unwind any further than this. This is a
* stopgap measure to avoid getting stuck in a loop in the unwinder,
* which happens because we don't yet provide the proper unwind info
* here that describes which registers are being restored.
*/
exception_exit:
ASENTRY_NP(exception_exit)
STOP_UNWINDING
DO_AST
PULLFRAMEFROMSVCANDEXIT
END(exception_exit)
/*
* undefined_entry:

View File

@ -77,6 +77,8 @@ __FBSDID("$FreeBSD$");
*/
ENTRY_NP(btext)
ASENTRY_NP(_start)
STOP_UNWINDING /* Can't unwind into the bootloader! */
mov r9, r0 /* 0 or boot mode from boot2 */
mov r8, r1 /* Save Machine type */
mov ip, r2 /* Save meta data */

View File

@ -540,6 +540,7 @@ ENTRY(savectx)
END(savectx)
ENTRY(fork_trampoline)
STOP_UNWINDING /* Can't unwind beyond the thread enty point */
mov r1, r5
mov r2, sp
mov r0, r4