diff --git a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_ARM/except.S b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_ARM/except.S index 47754e5433..2a245e8247 100644 --- a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_ARM/except.S +++ b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_ARM/except.S @@ -22,141 +22,141 @@ ; * ----------------------------------------------------------------------------- ; */ #ifndef MBED_FAULT_HANDLER_DISABLED - + #ifndef DOMAIN_NS #define DOMAIN_NS 1 #endif - -FAULT_TYPE_HARD_FAULT EQU 0x10 -FAULT_TYPE_MEMMANAGE_FAULT EQU 0x20 -FAULT_TYPE_BUS_FAULT EQU 0x30 -FAULT_TYPE_USAGE_FAULT EQU 0x40 - PRESERVE8 - THUMB +FAULT_TYPE_HARD_FAULT EQU 0x10 +FAULT_TYPE_MEMMANAGE_FAULT EQU 0x20 +FAULT_TYPE_BUS_FAULT EQU 0x30 +FAULT_TYPE_USAGE_FAULT EQU 0x40 - AREA |.text|, CODE, READONLY + PRESERVE8 + THUMB + + AREA |.text|, CODE, READONLY HardFault_Handler\ - PROC - EXPORT HardFault_Handler - LDR R3,=FAULT_TYPE_HARD_FAULT - B Fault_Handler - ENDP + PROC + EXPORT HardFault_Handler + LDR R3,=FAULT_TYPE_HARD_FAULT + B Fault_Handler + ENDP MemManage_Handler\ - PROC - EXPORT MemManage_Handler - LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT - B Fault_Handler - ENDP - + PROC + EXPORT MemManage_Handler + LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT + B Fault_Handler + ENDP + BusFault_Handler\ - PROC - EXPORT BusFault_Handler - LDR R3,=FAULT_TYPE_BUS_FAULT - B Fault_Handler - ENDP + PROC + EXPORT BusFault_Handler + LDR R3,=FAULT_TYPE_BUS_FAULT + B Fault_Handler + ENDP UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler - LDR R3,=FAULT_TYPE_USAGE_FAULT - B Fault_Handler - ENDP - -Fault_Handler PROC - EXPORT Fault_Handler + PROC + EXPORT UsageFault_Handler + LDR R3,=FAULT_TYPE_USAGE_FAULT + B Fault_Handler + ENDP + +Fault_Handler\ + PROC + EXPORT Fault_Handler #if (DOMAIN_NS == 1) - IMPORT mbed_fault_handler - IMPORT mbed_fault_context - - MRS R0,MSP - LDR R1,=0x4 - MOV R2,LR - TST R2,R1 ; Check EXC_RETURN for bit 2 - BEQ Fault_Handler_Continue - MRS R0,PSP + IMPORT mbed_fault_context + IMPORT mbed_fault_handler + + MRS R0,MSP + LDR R1,=0x4 + MOV R2,LR + TST R2,R1 ; Check EXC_RETURN for bit 2 + BEQ Fault_Handler_Continue + MRS R0,PSP Fault_Handler_Continue - MOV R12,R3 - LDR R3,=mbed_fault_context - LDR R1,[R3] - LDR R2,[R0] ; Capture R0 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#4] ; Capture R1 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#8] ; Capture R2 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#12] ; Capture R3 - STR R2,[R1] - ADDS R1,#4 - STMIA R1!,{R4-R7} ; Capture R4..R7 - MOV R7,R8 ; Capture R8 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R9 ; Capture R9 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R10 ; Capture R10 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R11 ; Capture R11 - STR R7,[R1] - ADDS R1,#4 - LDR R2,[R0,#16] ; Capture R12 - STR R2,[R1] - ADDS R1,#8 ; Add 8 here to capture LR next, we will capture SP later - LDR R2,[R0,#20] ; Capture LR - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#24] ; Capture PC - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#28] ; Capture xPSR - STR R2,[R1] - ADDS R1,#4 - ; Adjust stack pointer to its original value and capture it - MOV R3,R0 - ADDS R3,#0x20 ; Add 0x20 to get the SP value prior to exception - LDR R6,=0x200 - TST R2,R6 ; Check for if STK was aligned by checking bit-9 in xPSR value - BEQ Fault_Handler_Continue1 - ADDS R3,#0x4 + MOV R12,R3 + LDR R3,=mbed_fault_context + LDR R1,[R3] + LDR R2,[R0] ; Capture R0 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#4] ; Capture R1 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#8] ; Capture R2 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#12] ; Capture R3 + STR R2,[R1] + ADDS R1,#4 + STMIA R1!,{R4-R7} ; Capture R4..R7 + MOV R7,R8 ; Capture R8 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R9 ; Capture R9 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R10 ; Capture R10 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R11 ; Capture R11 + STR R7,[R1] + ADDS R1,#4 + LDR R2,[R0,#16] ; Capture R12 + STR R2,[R1] + ADDS R1,#8 ; Add 8 here to capture LR next, we will capture SP later + LDR R2,[R0,#20] ; Capture LR + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#24] ; Capture PC + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#28] ; Capture xPSR + STR R2,[R1] + ADDS R1,#4 + ; Adjust stack pointer to its original value and capture it + MOV R3,R0 + ADDS R3,#0x20 ; Add 0x20 to get the SP value prior to exception + LDR R6,=0x200 + TST R2,R6 ; Check for if STK was aligned by checking bit-9 in xPSR value + BEQ Fault_Handler_Continue1 + ADDS R3,#0x4 Fault_Handler_Continue1 - MOV R5,LR - LDR R6,=0x10 ; Check for bit-4 to see if FP context was saved - TST R5,R6 - BNE Fault_Handler_Continue2 - ADDS R3,#0x48 ; 16 FP regs + FPCSR + 1 Reserved - -Fault_Handler_Continue2 - MOV R4,R1 - SUBS R4,#0x10 ; Set the location of SP in ctx - STR R3,[R4] ; Capture the adjusted SP - MRS R2,PSP ; Get PSP - STR R2,[R1] - ADDS R1,#4 - MRS R2,MSP ; Get MSP - STR R2,[R1] - ADDS R1,#4 - MOV R2,LR ; Get current LR(EXC_RETURN) - STR R2,[R1] - ADDS R1,#4 - MRS R2,CONTROL ; Get CONTROL Reg - STR R2,[R1] - MOV R0,R12 - LDR R3,=mbed_fault_context - LDR R1,[R3] - BL mbed_fault_handler -#endif - B . ; Just in case we come back here - ENDP - + MOV R5,LR + LDR R6,=0x10 ; Check for bit-4 to see if FP context was saved + TST R5,R6 + BNE Fault_Handler_Continue2 + ADDS R3,#0x48 ; 16 FP regs + FPCSR + 1 Reserved + +Fault_Handler_Continue2 + MOV R4,R1 + SUBS R4,#0x10 ; Set the location of SP in ctx + STR R3,[R4] ; Capture the adjusted SP + MRS R2,PSP ; Get PSP + STR R2,[R1] + ADDS R1,#4 + MRS R2,MSP ; Get MSP + STR R2,[R1] + ADDS R1,#4 + MOV R2,LR ; Get current LR(EXC_RETURN) + STR R2,[R1] + ADDS R1,#4 + MRS R2,CONTROL ; Get CONTROL Reg + STR R2,[R1] + MOV R0,R12 + LDR R3,=mbed_fault_context + LDR R1,[R3] + BL mbed_fault_handler #endif - - END + B . ; Just in case we come back here + ENDP +#endif + + END diff --git a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_GCC/except.S b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_GCC/except.S index 8a084cc6b9..036e116ab8 100644 --- a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_GCC/except.S +++ b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_GCC/except.S @@ -23,17 +23,17 @@ */ #ifndef MBED_FAULT_HANDLER_DISABLED - .file "except.S" - .syntax unified + .file "except.S" + .syntax unified #ifndef DOMAIN_NS #define DOMAIN_NS 1 #endif - .equ FAULT_TYPE_HARD_FAULT, 0x10 - .equ FAULT_TYPE_MEMMANAGE_FAULT, 0x20 - .equ FAULT_TYPE_BUS_FAULT, 0x30 - .equ FAULT_TYPE_USAGE_FAULT, 0x40 + .equ FAULT_TYPE_HARD_FAULT, 0x10 + .equ FAULT_TYPE_MEMMANAGE_FAULT, 0x20 + .equ FAULT_TYPE_BUS_FAULT, 0x30 + .equ FAULT_TYPE_USAGE_FAULT, 0x40 .thumb .section ".text" @@ -41,159 +41,157 @@ //HardFault_Handler .thumb_func - .type HardFault_Handler, %function - .global HardFault_Handler + .type HardFault_Handler, %function + .global HardFault_Handler .fnstart .cantunwind - + HardFault_Handler: - LDR R3,=FAULT_TYPE_HARD_FAULT - B Fault_Handler + LDR R3,=FAULT_TYPE_HARD_FAULT + B Fault_Handler .fnend - .size HardFault_Handler, .-HardFault_Handler - -//MemManage_Handler + .size HardFault_Handler, .-HardFault_Handler + +//MemManage_Handler .thumb_func - .type MemManage_Handler, %function - .global MemManage_Handler + .type MemManage_Handler, %function + .global MemManage_Handler .fnstart .cantunwind - + MemManage_Handler: - LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT - B Fault_Handler + LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT + B Fault_Handler .fnend - .size MemManage_Handler, .-MemManage_Handler + .size MemManage_Handler, .-MemManage_Handler -//BusFault_Handler +//BusFault_Handler .thumb_func - .type BusFault_Handler, %function - .global BusFault_Handler + .type BusFault_Handler, %function + .global BusFault_Handler .fnstart .cantunwind - + BusFault_Handler: - LDR R3,=FAULT_TYPE_BUS_FAULT - B Fault_Handler + LDR R3,=FAULT_TYPE_BUS_FAULT + B Fault_Handler .fnend - .size BusFault_Handler, .-BusFault_Handler - -//UsageFault_Handler + .size BusFault_Handler, .-BusFault_Handler + +//UsageFault_Handler .thumb_func - .type UsageFault_Handler, %function - .global UsageFault_Handler + .type UsageFault_Handler, %function + .global UsageFault_Handler .fnstart .cantunwind - + UsageFault_Handler: - LDR R3,=FAULT_TYPE_USAGE_FAULT - B Fault_Handler + LDR R3,=FAULT_TYPE_USAGE_FAULT + B Fault_Handler .fnend - .size UsageFault_Handler, .-UsageFault_Handler + .size UsageFault_Handler, .-UsageFault_Handler //Common Fault_Handler to capture the context .thumb_func - .type Fault_Handler, %function - .global Fault_Handler + .type Fault_Handler, %function + .global Fault_Handler .fnstart .cantunwind Fault_Handler: #if (DOMAIN_NS == 1) - MRS R0,MSP - LDR R1,=0x4 - MOV R2,LR - TST R2,R1 // Check EXC_RETURN for bit 2 - BEQ Fault_Handler_Continue - MRS R0,PSP + MRS R0,MSP + LDR R1,=0x4 + MOV R2,LR + TST R2,R1 // Check EXC_RETURN for bit 2 + BEQ Fault_Handler_Continue + MRS R0,PSP Fault_Handler_Continue: - MOV R12,R3 - LDR R3,=mbed_fault_context - LDR R1,[R3] - LDR R2,[R0] // Capture R0 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#4] // Capture R1 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#8] // Capture R2 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#12] // Capture R3 - STR R2,[R1] - ADDS R1,#4 - STMIA R1!,{R4-R7} // Capture R4..R7 - MOV R7,R8 // Capture R8 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R9 // Capture R9 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R10 // Capture R10 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R11 // Capture R11 - STR R7,[R1] - ADDS R1,#4 - LDR R2,[R0,#16] // Capture R12 - STR R2,[R1] - ADDS R1,#8 // Add 8 here to capture LR next, we will capture SP later - LDR R2,[R0,#20] // Capture LR - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#24] // Capture PC - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#28] // Capture xPSR - STR R2,[R1] - ADDS R1,#4 + MOV R12,R3 + LDR R3,=mbed_fault_context + LDR R1,[R3] + LDR R2,[R0] // Capture R0 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#4] // Capture R1 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#8] // Capture R2 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#12] // Capture R3 + STR R2,[R1] + ADDS R1,#4 + STMIA R1!,{R4-R7} // Capture R4..R7 + MOV R7,R8 // Capture R8 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R9 // Capture R9 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R10 // Capture R10 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R11 // Capture R11 + STR R7,[R1] + ADDS R1,#4 + LDR R2,[R0,#16] // Capture R12 + STR R2,[R1] + ADDS R1,#8 // Add 8 here to capture LR next, we will capture SP later + LDR R2,[R0,#20] // Capture LR + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#24] // Capture PC + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#28] // Capture xPSR + STR R2,[R1] + ADDS R1,#4 // Adjust stack pointer to its original value and capture it - MOV R3,R0 - ADDS R3,#0x20 // Add 0x20 to get the SP value prior to exception - LDR R6,=0x200 - TST R2,R6 // Check for if STK was aligned by checking bit-9 in xPSR value - BEQ Fault_Handler_Continue1 - ADDS R3,#0x4 - + MOV R3,R0 + ADDS R3,#0x20 // Add 0x20 to get the SP value prior to exception + LDR R6,=0x200 + TST R2,R6 // Check for if STK was aligned by checking bit-9 in xPSR value + BEQ Fault_Handler_Continue1 + ADDS R3,#0x4 + Fault_Handler_Continue1: - MOV R5,LR - LDR R6,=0x10 // Check for bit-4 to see if FP context was saved - TST R5,R6 - BNE Fault_Handler_Continue2 - ADDS R3,#0x48 // 16 FP regs + FPCSR + 1 Reserved + MOV R5,LR + LDR R6,=0x10 // Check for bit-4 to see if FP context was saved + TST R5,R6 + BNE Fault_Handler_Continue2 + ADDS R3,#0x48 // 16 FP regs + FPCSR + 1 Reserved Fault_Handler_Continue2: - MOV R4,R1 - SUBS R4,#0x10 // Set the location of SP in ctx - STR R3,[R4] // Capture the adjusted SP - MRS R2,PSP // Get PSP - STR R2,[R1] - ADDS R1,#4 - MRS R2,MSP // Get MSP - STR R2,[R1] - ADDS R1,#4 - MOV R2,LR // Get current LR(EXC_RETURN) - STR R2,[R1] - ADDS R1,#4 - MRS R2,CONTROL // Get CONTROL Reg - STR R2,[R1] - MOV R0,R12 - LDR R3,=mbed_fault_context - LDR R1,[R3] - BL mbed_fault_handler + MOV R4,R1 + SUBS R4,#0x10 // Set the location of SP in ctx + STR R3,[R4] // Capture the adjusted SP + MRS R2,PSP // Get PSP + STR R2,[R1] + ADDS R1,#4 + MRS R2,MSP // Get MSP + STR R2,[R1] + ADDS R1,#4 + MOV R2,LR // Get current LR(EXC_RETURN) + STR R2,[R1] + ADDS R1,#4 + MRS R2,CONTROL // Get CONTROL Reg + STR R2,[R1] + MOV R0,R12 + LDR R3,=mbed_fault_context + LDR R1,[R3] + BL mbed_fault_handler #endif - B . // Just in case we come back here - + B . // Just in case we come back here + .fnend - .size Fault_Handler, .-Fault_Handler + .size Fault_Handler, .-Fault_Handler #endif - + .end - - diff --git a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_IAR/except.S b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_IAR/except.S index 02f8133747..9b3fb0d67a 100644 --- a/platform/source/TARGET_CORTEX_M/TOOLCHAIN_IAR/except.S +++ b/platform/source/TARGET_CORTEX_M/TOOLCHAIN_IAR/except.S @@ -17,139 +17,139 @@ ; * ; * ----------------------------------------------------------------------------- ; * -; * Title: Cortex-M Fault Exception handlers ( Common for both ARMv7M and ARMV6M ); +; * Title: Cortex-M Fault Exception handlers ( Common for both ARMv7M and ARMV6M ) ; * ; * ----------------------------------------------------------------------------- ; */ - NAME except.S - -FAULT_TYPE_HARD_FAULT EQU 0x10 -FAULT_TYPE_MEMMANAGE_FAULT EQU 0x20 -FAULT_TYPE_BUS_FAULT EQU 0x30 -FAULT_TYPE_USAGE_FAULT EQU 0x40 + NAME except.S #ifndef MBED_FAULT_HANDLER_DISABLED - + #ifndef DOMAIN_NS #define DOMAIN_NS 1 #endif - PRESERVE8 - SECTION .rodata:DATA:NOROOT(2) - - THUMB - SECTION .text:CODE:NOROOT(2) + +FAULT_TYPE_HARD_FAULT EQU 0x10 +FAULT_TYPE_MEMMANAGE_FAULT EQU 0x20 +FAULT_TYPE_BUS_FAULT EQU 0x30 +FAULT_TYPE_USAGE_FAULT EQU 0x40 + + PRESERVE8 + THUMB + + SECTION .text:CODE:NOROOT(2) HardFault_Handler - EXPORT HardFault_Handler - LDR R3,=FAULT_TYPE_HARD_FAULT - B Fault_Handler - + EXPORT HardFault_Handler + LDR R3,=FAULT_TYPE_HARD_FAULT + B Fault_Handler + MemManage_Handler - EXPORT MemManage_Handler - LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT - B Fault_Handler + EXPORT MemManage_Handler + LDR R3,=FAULT_TYPE_MEMMANAGE_FAULT + B Fault_Handler BusFault_Handler - EXPORT BusFault_Handler - LDR R3,=FAULT_TYPE_BUS_FAULT - B Fault_Handler - + EXPORT BusFault_Handler + LDR R3,=FAULT_TYPE_BUS_FAULT + B Fault_Handler + UsageFault_Handler - EXPORT UsageFault_Handler - LDR R3,=FAULT_TYPE_USAGE_FAULT - B Fault_Handler - + EXPORT UsageFault_Handler + LDR R3,=FAULT_TYPE_USAGE_FAULT + B Fault_Handler + Fault_Handler - EXPORT Fault_Handler + EXPORT Fault_Handler #if (DOMAIN_NS == 1) - IMPORT mbed_fault_context - IMPORT mbed_fault_handler - - MRS R0,MSP - LDR R1,=0x4 - MOV R2,LR - TST R2,R1 ; Check EXC_RETURN for bit 2 - BEQ Fault_Handler_Continue - MRS R0,PSP + IMPORT mbed_fault_context + IMPORT mbed_fault_handler + + MRS R0,MSP + LDR R1,=0x4 + MOV R2,LR + TST R2,R1 ; Check EXC_RETURN for bit 2 + BEQ Fault_Handler_Continue + MRS R0,PSP Fault_Handler_Continue - MOV R12,R3 - LDR R3,=mbed_fault_context - LDR R1,[R3] - LDR R2,[R0] ; Capture R0 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#4] ; Capture R1 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#8] ; Capture R2 - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#12] ; Capture R3 - STR R2,[R1] - ADDS R1,#4 - STMIA R1!,{R4-R7} ; Capture R4..R7 - MOV R7,R8 ; Capture R8 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R9 ; Capture R9 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R10 ; Capture R10 - STR R7,[R1] - ADDS R1,#4 - MOV R7,R11 ; Capture R11 - STR R7,[R1] - ADDS R1,#4 - LDR R2,[R0,#16] ; Capture R12 - STR R2,[R1] - ADDS R1,#8 ; Add 8 here to capture LR next, we will capture SP later - LDR R2,[R0,#20] ; Capture LR - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#24] ; Capture PC - STR R2,[R1] - ADDS R1,#4 - LDR R2,[R0,#28] ; Capture xPSR - STR R2,[R1] - ADDS R1,#4 - ; Adjust stack pointer to its original value and capture it - MOV R3,R0 - ADDS R3,#0x20 ; Add 0x20 to get the SP value prior to exception - LDR R6,=0x200 - TST R2,R6 ; Check for if STK was aligned by checking bit-9 in xPSR value - BEQ Fault_Handler_Continue1 - ADDS R3,#0x4 - + MOV R12,R3 + LDR R3,=mbed_fault_context + LDR R1,[R3] + LDR R2,[R0] ; Capture R0 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#4] ; Capture R1 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#8] ; Capture R2 + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#12] ; Capture R3 + STR R2,[R1] + ADDS R1,#4 + STMIA R1!,{R4-R7} ; Capture R4..R7 + MOV R7,R8 ; Capture R8 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R9 ; Capture R9 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R10 ; Capture R10 + STR R7,[R1] + ADDS R1,#4 + MOV R7,R11 ; Capture R11 + STR R7,[R1] + ADDS R1,#4 + LDR R2,[R0,#16] ; Capture R12 + STR R2,[R1] + ADDS R1,#8 ; Add 8 here to capture LR next, we will capture SP later + LDR R2,[R0,#20] ; Capture LR + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#24] ; Capture PC + STR R2,[R1] + ADDS R1,#4 + LDR R2,[R0,#28] ; Capture xPSR + STR R2,[R1] + ADDS R1,#4 + ; Adjust stack pointer to its original value and capture it + MOV R3,R0 + ADDS R3,#0x20 ; Add 0x20 to get the SP value prior to exception + LDR R6,=0x200 + TST R2,R6 ; Check for if STK was aligned by checking bit-9 in xPSR value + BEQ Fault_Handler_Continue1 + ADDS R3,#0x4 + Fault_Handler_Continue1 - MOV R5,LR - LDR R6,=0x10 ; Check for bit-4 to see if FP context was saved - TST R5,R6 - BNE Fault_Handler_Continue2 - ADDS R3,#0x48 ; 16 FP regs + FPCSR + 1 Reserved + MOV R5,LR + LDR R6,=0x10 ; Check for bit-4 to see if FP context was saved + TST R5,R6 + BNE Fault_Handler_Continue2 + ADDS R3,#0x48 ; 16 FP regs + FPCSR + 1 Reserved Fault_Handler_Continue2 - MOV R4,R1 - SUBS R4,#0x10 ; Set the location of SP in ctx - STR R3,[R4] ; Capture the adjusted SP - MRS R2,PSP ; Get PSP - STR R2,[R1] - ADDS R1,#4 - MRS R2,MSP ; Get MSP - STR R2,[R1] - ADDS R1,#4 - MOV R2,LR ; Get current LR(EXC_RETURN) - STR R2,[R1] - ADDS R1,#4 - MRS R2,CONTROL ; Get CONTROL Reg - STR R2,[R1] - MOV R0,R12 - LDR R3,=mbed_fault_context - LDR R1,[R3] - BL mbed_fault_handler -#endif - B . ; Just in case we come back here -#endif ; #if (MBED_FAULT_HANDLER_SUPPORT == 1) + MOV R4,R1 + SUBS R4,#0x10 ; Set the location of SP in ctx + STR R3,[R4] ; Capture the adjusted SP + MRS R2,PSP ; Get PSP + STR R2,[R1] + ADDS R1,#4 + MRS R2,MSP ; Get MSP + STR R2,[R1] + ADDS R1,#4 + MOV R2,LR ; Get current LR(EXC_RETURN) + STR R2,[R1] + ADDS R1,#4 + MRS R2,CONTROL ; Get CONTROL Reg + STR R2,[R1] + MOV R0,R12 + LDR R3,=mbed_fault_context + LDR R1,[R3] + BL mbed_fault_handler +#endif + B . ; Just in case we come back here +#endif - END + END