Add UNWINDSVCFRAME to provide the unwind pseudo ops to allow us to unwind

past a trapframe.

Use this macro in exception_exit as it is the function the unwinder enters
as the functions that store the frame setting lr to point to it.
This commit is contained in:
Andrew Turner 2013-06-27 18:54:18 +00:00
parent 268a55bc98
commit da01dd9e1e
2 changed files with 11 additions and 2 deletions

View File

@ -206,7 +206,7 @@ END(address_exception_entry)
*/
ASENTRY_NP(exception_exit)
STOP_UNWINDING
UNWINDSVCFRAME
DO_AST
PULLFRAMEFROMSVCANDEXIT
END(exception_exit)

View File

@ -206,7 +206,16 @@
mov r0, r0; /* NOP for previous instruction */ \
add sp, sp, #(4*15); /* Adjust the stack pointer */ \
ldmia sp, {sp, lr, pc}^ /* Restore lr and exit */
#endif
#endif
#if defined(__ARM_EABI__)
#define UNWINDSVCFRAME \
.save {r13-r15}; /* Restore sp, lr, pc */ \
.pad #(2*4); /* Skip user sp and lr */ \
.save {r0-r12}; /* Restore r0-r12 */ \
.pad #(4) /* Skip spsr */
#else
#define UNWINDSVCFRAME
#endif
#define DATA(name) \
.data ; \