|
|
@@ -54,45 +54,52 @@ coredump_cmd_asm:
|
|
54
|
54
|
POP {r0} /* xpsr */
|
|
55
|
55
|
BX LR
|
|
56
|
56
|
|
|
57
|
|
- IMPORT rt_hw_hard_fault_exception
|
|
58
|
|
- EXPORT HardFault_Handler
|
|
|
57
|
+ IMPORT rt_hw_hard_fault_exception
|
|
|
58
|
+ EXPORT HardFault_Handler
|
|
59
|
59
|
HardFault_Handler:
|
|
60
|
60
|
|
|
61
|
|
- ; get current context
|
|
62
|
|
- MRS r0, msp ; get fault context from handler.
|
|
63
|
|
- TST lr, #0x04 ; if(!EXC_RETURN[2])
|
|
64
|
|
- BEQ _get_sp_done
|
|
65
|
|
- MRS r0, psp ; get fault context from thread.
|
|
|
61
|
+ ; get current context
|
|
|
62
|
+ MRS r0, msp ; get fault context from handler.
|
|
|
63
|
+ TST lr, #0x04 ; if(!EXC_RETURN[2])
|
|
|
64
|
+ BEQ _get_sp_done
|
|
|
65
|
+ MRS r0, psp ; get fault context from thread.
|
|
66
|
66
|
_get_sp_done
|
|
67
|
67
|
|
|
68
|
|
- STMFD r0!, {r4 - r11} ; push r4 - r11 register
|
|
69
|
|
- ;STMFD r0!, {lr} ; push exec_return register
|
|
70
|
68
|
#if defined ( __ARMVFP__ )
|
|
71
|
|
- MOV R1, #0 ; not use FPU
|
|
72
|
|
- TST lr, #(1<<4)
|
|
73
|
|
- BNE _set_flag_done
|
|
74
|
|
- MOV R1, #1 ; use FPU
|
|
75
|
|
-_set_flag_done
|
|
76
|
|
- SUB r0, r0, #0x04 ; push dummy for flag
|
|
77
|
|
- STR R1, [r0]
|
|
|
69
|
+ TST lr, #0x10 ; if(!EXC_RETURN[4])
|
|
|
70
|
+ BNE skip_push_fpu
|
|
|
71
|
+ VSTMDB r0!, {d8 - d15} ; push FPU register s16~s31
|
|
|
72
|
+skip_push_fpu
|
|
78
|
73
|
#endif
|
|
79
|
|
- SUB r0, r0, #0x04
|
|
80
|
|
- STR lr, [r0]
|
|
81
|
74
|
|
|
82
|
|
- TST lr, #0x04 ; if(!EXC_RETURN[2])
|
|
83
|
|
- BEQ _update_msp
|
|
84
|
|
- MSR psp, r0 ; update stack pointer to PSP.
|
|
85
|
|
- B _update_done
|
|
|
75
|
+ STMFD r0!, {r4 - r11} ; push r4 - r11 register
|
|
|
76
|
+
|
|
|
77
|
+#if defined ( __ARMVFP__ )
|
|
|
78
|
+ MOV r4, #0x00 ; flag = 0
|
|
|
79
|
+ TST lr, #0x10 ; if(!EXC_RETURN[4])
|
|
|
80
|
+ BNE push_flag
|
|
|
81
|
+ MOV r4, #0x01 ; flag = 1
|
|
|
82
|
+push_flag
|
|
|
83
|
+ STMFD r0!, {r4} ; push flag
|
|
|
84
|
+#endif
|
|
|
85
|
+
|
|
|
86
|
+ STMFD r0!, {lr} ; push flag
|
|
|
87
|
+
|
|
|
88
|
+ TST lr, #0x04 ; if(!EXC_RETURN[2])
|
|
|
89
|
+ BEQ _update_msp
|
|
|
90
|
+ MSR psp, r0 ; update stack pointer to PSP.
|
|
|
91
|
+ B _update_done
|
|
86
|
92
|
_update_msp
|
|
87
|
|
- MSR msp, r0 ; update stack pointer to MSP.
|
|
|
93
|
+ MSR msp, r0 ; update stack pointer to MSP.
|
|
88
|
94
|
_update_done
|
|
89
|
95
|
|
|
90
|
|
- PUSH {lr}
|
|
91
|
|
- BL rt_hw_hard_fault_exception
|
|
92
|
|
- POP {lr}
|
|
|
96
|
+ PUSH {lr}
|
|
|
97
|
+ BL rt_hw_hard_fault_exception
|
|
|
98
|
+ POP {lr}
|
|
|
99
|
+
|
|
|
100
|
+ ORR lr, lr, #0x04
|
|
|
101
|
+ BX lr
|
|
|
102
|
+
|
|
|
103
|
+ END
|
|
93
|
104
|
|
|
94
|
|
- ORR lr, lr, #0x04
|
|
95
|
|
- BX lr
|
|
96
|
|
-
|
|
97
|
|
- END
|
|
98
|
105
|
|