Skip to content

Commit 990fc23

Browse files
committed
[libcpu][cortex-m4]Added HardFault_Handler to save floating point registers.
1 parent 2f19ba6 commit 990fc23

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

libcpu/arm/cortex-m4/context_gcc.S

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff 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]) */

libcpu/arm/cortex-m4/context_iar.S

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff 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

libcpu/arm/cortex-m4/context_rvds.S

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff 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])

0 commit comments

Comments
 (0)