|
|
|
@ -141,6 +141,8 @@ static inline int _stack_size_left(uint32_t required)
|
|
|
|
|
return ((int)((uint32_t)sp - (uint32_t)&_sstack) - required);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void hard_fault_handler(uint32_t* sp, uint32_t corrupted, uint32_t exc_return, uint32_t* r4_to_r11_stack);
|
|
|
|
|
|
|
|
|
|
/* Trampoline function to save stack pointer before calling hard fault handler */
|
|
|
|
|
__attribute__((naked)) void hard_fault_default(void)
|
|
|
|
|
{
|
|
|
|
@ -154,12 +156,12 @@ __attribute__((naked)) void hard_fault_default(void)
|
|
|
|
|
"bhi fix_msp \n" /* goto fix_msp } */
|
|
|
|
|
"cmp r0, %[sram] \n" /* if(msp <= &_sram) { */
|
|
|
|
|
"bls fix_msp \n" /* goto fix_msp } */
|
|
|
|
|
"mov r1, #0 \n" /* else { corrupted = false */
|
|
|
|
|
"movs r1, #0 \n" /* else { corrupted = false */
|
|
|
|
|
"b test_sp \n" /* goto test_sp } */
|
|
|
|
|
" fix_msp: \n" /* */
|
|
|
|
|
"mov r1, %[estack] \n" /* r1 = _estack */
|
|
|
|
|
"mov sp, r1 \n" /* sp = r1 */
|
|
|
|
|
"mov r1, #1 \n" /* corrupted = true */
|
|
|
|
|
"movs r1, #1 \n" /* corrupted = true */
|
|
|
|
|
" test_sp: \n" /* */
|
|
|
|
|
"movs r0, #4 \n" /* r0 = 0x4 */
|
|
|
|
|
"mov r2, lr \n" /* r2 = lr */
|
|
|
|
@ -181,7 +183,7 @@ __attribute__((naked)) void hard_fault_default(void)
|
|
|
|
|
"push {r4-r11} \n" /* save r4..r11 to the stack */
|
|
|
|
|
#endif
|
|
|
|
|
"mov r3, sp \n" /* r4_to_r11_stack parameter */
|
|
|
|
|
"b hard_fault_handler \n" /* hard_fault_handler(r0) */
|
|
|
|
|
"bl hard_fault_handler \n" /* hard_fault_handler(r0) */
|
|
|
|
|
:
|
|
|
|
|
: [sram] "r" (&_sram + HARDFAULT_HANDLER_REQUIRED_STACK_SPACE),
|
|
|
|
|
[eram] "r" (&_eram),
|
|
|
|
|