File tree Expand file tree Collapse file tree 3 files changed +44
-6
lines changed
Expand file tree Collapse file tree 3 files changed +44
-6
lines changed Original file line number Diff line number Diff line change @@ -238,10 +238,23 @@ HardFault_Handler:
238238 MRS r0 , psp / * get fault context from thread. * /
239239_get_sp_done:
240240
241+ #if defined (__VFP_FP__) && !defined(__SOFTFP__)
242+ TST lr , # 0x10 / * if(!EXC_RETURN [ 4 ] ) * /
243+ IT EQ
244+ VSTMDBEQ r0! , {d8 - d15} / * push FPU register s16~s31 * /
245+ #endif
246+
241247 STMFD r0! , {r4 - r11 } / * push r4 - r11 register * /
248+
242249#if defined (__VFP_FP__) && !defined(__SOFTFP__)
243- STMFD r0! , {lr} / * push dummy for flag * /
250+ MOV r4 , # 0x00 / * flag = 0 * /
251+
252+ TST lr , # 0x10 / * if(!EXC_RETURN [ 4 ] ) * /
253+ IT EQ
254+ MOVEQ r4 , # 0x01 / * flag = 1 * /
255+ STMFD r0! , {r4} / * push flag * /
244256#endif
257+
245258 STMFD r0! , {lr} / * push exec_return register * /
246259
247260 TST lr , # 0x04 / * if(!EXC_RETURN [ 2 ] ) * /
Original file line number Diff line number Diff line change @@ -237,14 +237,28 @@ HardFault_Handler:
237237 MRS r0 , psp ; get fault context from thread.
238238_get_sp_done
239239
240+ #if defined ( __ARMVFP__ )
241+ TST lr , # 0x10 ; if(!EXC_RETURN[4])
242+ BNE skip_push_fpu
243+ VSTMDB r0! , {d8 - d15} ; push FPU register s16~s31
244+ skip_push_fpu
245+ #endif
246+
240247 STMFD r0! , {r4 - r11 } ; push r4 - r11 register
241- ;STMFD r0!, {lr} ; push exec_return register
248+
242249#if defined ( __ARMVFP__ )
243- SUB r0 , r0 , # 0x04 ; push dummy for flag
244- STR lr , [ r0 ]
250+ MOV r4 , # 0x00 ; flag = 0
251+
252+ TST lr , # 0x10 ; if(!EXC_RETURN[4])
253+ BNE push_flag
254+ MOV r4 , # 0x01 ; flag = 1
255+ push_flag
256+ SUB r0 , r0 , # 0x04
257+ STR r4 , [ r0 ] ; push flag
245258#endif
259+
246260 SUB r0 , r0 , # 0x04
247- STR lr , [ r0 ]
261+ STR lr , [ r0 ] ; push exec_return register
248262
249263 TST lr , # 0x04 ; if(!EXC_RETURN[2])
250264 BEQ _update_msp
Original file line number Diff line number Diff line change @@ -236,10 +236,21 @@ HardFault_Handler PROC
236236 MRSEQ r0 , msp ; [2]=0 ==> Z=1, get fault context from handler.
237237 MRSNE r0 , psp ; [2]=1 ==> Z=0, get fault context from thread.
238238
239+ IF {FPU} != "SoftVFP"
240+ TST lr , # 0x10 ; if(!EXC_RETURN[4])
241+ VSTMFDEQ r0! , {d8 - d15} ; push FPU register s16~s31
242+ ENDIF
243+
239244 STMFD r0! , {r4 - r11 } ; push r4 - r11 register
245+
240246 IF {FPU} != "SoftVFP"
241- STMFD r0! , {lr} ; push dummy for flag
247+ MOV r4 , # 0x00 ; flag = 0
248+
249+ TST lr , # 0x10 ; if(!EXC_RETURN[4])
250+ MOVEQ r4 , # 0x01 ; flag = 1
251+ STMFD r0! , {r4} ; push flag
242252 ENDIF
253+
243254 STMFD r0! , {lr} ; push exec_return register
244255
245256 TST lr , # 0x04 ; if(!EXC_RETURN[2])
You can’t perform that action at this time.
0 commit comments