瀏覽代碼

[libcpu]: fixed #1196 FPU FPCA issue.

aozima 7 年之前
父節點
當前提交
dd1041bb7f

+ 4 - 4
libcpu/arm/cortex-m4/context_gcc.S

@@ -145,16 +145,16 @@ switch_to_thread:
 
     MSR psp, r1                 /* update stack pointer */
 
-pendsv_exit:
-    /* restore interrupt */
-    MSR PRIMASK, r2
-
 #if defined (__VFP_FP__) && !defined(__SOFTFP__)
     ORR     lr, lr, #0x10       /* lr |=  (1 << 4), clean FPCA. */
     CMP     r3,  #0             /* if(flag_r3 != 0) */
     BICNE   lr, lr, #0x10       /* lr &= ~(1 << 4), set FPCA. */
 #endif
 
+pendsv_exit:
+    /* restore interrupt */
+    MSR PRIMASK, r2
+
     ORR lr, lr, #0x04
     BX  lr
 

+ 4 - 4
libcpu/arm/cortex-m4/context_iar.S

@@ -149,10 +149,6 @@ skip_pop_fpu
 
     MSR     psp, r1                 ; update stack pointer
 
-pendsv_exit
-    ; restore interrupt
-    MSR     PRIMASK, r2
-
 #if defined ( __ARMVFP__ )
     ORR     lr, lr, #0x10           ; lr |=  (1 << 4), clean FPCA.
     CBZ     r3, return_without_fpu  ; if(flag_r3 != 0)
@@ -160,6 +156,10 @@ pendsv_exit
 return_without_fpu
 #endif
 
+pendsv_exit
+    ; restore interrupt
+    MSR     PRIMASK, r2
+
     ORR     lr, lr, #0x04
     BX      lr
 

+ 4 - 4
libcpu/arm/cortex-m4/context_rvds.S

@@ -147,16 +147,16 @@ switch_to_thread
 
     MSR     psp, r1                 ; update stack pointer
 
-pendsv_exit
-    ; restore interrupt
-    MSR     PRIMASK, r2
-
     IF      {FPU} != "SoftVFP"
     ORR     lr, lr, #0x10           ; lr |=  (1 << 4), clean FPCA.
     CMP     r3,  #0                 ; if(flag_r3 != 0)
     BICNE   lr, lr, #0x10           ; lr &= ~(1 << 4), set FPCA.
     ENDIF
 
+pendsv_exit
+    ; restore interrupt
+    MSR     PRIMASK, r2
+
     ORR     lr, lr, #0x04
     BX      lr
     ENDP

+ 4 - 4
libcpu/arm/cortex-m7/context_gcc.S

@@ -145,16 +145,16 @@ switch_to_thread:
 
     MSR psp, r1                 /* update stack pointer */
 
-pendsv_exit:
-    /* restore interrupt */
-    MSR PRIMASK, r2
-
 #if defined (__VFP_FP__) && !defined(__SOFTFP__)
     ORR     lr, lr, #0x10       /* lr |=  (1 << 4), clean FPCA. */
     CMP     r3,  #0             /* if(flag_r3 != 0) */
     BICNE   lr, lr, #0x10       /* lr &= ~(1 << 4), set FPCA. */
 #endif
 
+pendsv_exit:
+    /* restore interrupt */
+    MSR PRIMASK, r2
+
     ORR lr, lr, #0x04
     BX  lr
 

+ 4 - 4
libcpu/arm/cortex-m7/context_iar.S

@@ -149,10 +149,6 @@ skip_pop_fpu
 
     MSR     psp, r1                 ; update stack pointer
 
-pendsv_exit
-    ; restore interrupt
-    MSR     PRIMASK, r2
-
 #if defined ( __ARMVFP__ )
     ORR     lr, lr, #0x10           ; lr |=  (1 << 4), clean FPCA.
     CBZ     r3, return_without_fpu  ; if(flag_r3 != 0)
@@ -160,6 +156,10 @@ pendsv_exit
 return_without_fpu
 #endif
 
+pendsv_exit
+    ; restore interrupt
+    MSR     PRIMASK, r2
+
     ORR     lr, lr, #0x04
     BX      lr
 

+ 4 - 4
libcpu/arm/cortex-m7/context_rvds.S

@@ -147,16 +147,16 @@ switch_to_thread
 
     MSR     psp, r1                 ; update stack pointer
 
-pendsv_exit
-    ; restore interrupt
-    MSR     PRIMASK, r2
-
     IF      {FPU} != "SoftVFP"
     ORR     lr, lr, #0x10           ; lr |=  (1 << 4), clean FPCA.
     CMP     r3,  #0                 ; if(flag_r3 != 0)
     BICNE   lr, lr, #0x10           ; lr &= ~(1 << 4), set FPCA.
     ENDIF
 
+pendsv_exit
+    ; restore interrupt
+    MSR     PRIMASK, r2
+
     ORR     lr, lr, #0x04
     BX      lr
     ENDP