SunJun8 commented on code in PR #9103:
URL: https://github.com/apache/nuttx/pull/9103#discussion_r1187139022


##########
arch/risc-v/src/common/riscv_macros.S:
##########
@@ -227,8 +222,15 @@
   REGLOAD      t0, REG_INT_CTX(\out)
   li           t1, MSTATUS_FS
   and          t2, t0, t1
-  li           t1, MSTATUS_FS_INIT
-  ble          t2, t1, 1f
+  li           t1, MSTATUS_FS_DIRTY
+  bne          t2, t1, 1f
+
+  /* Reset FS bit to MSTATUS_FS_CLEAN */
+  li           t1, MSTATUS_FS_CLEAN

Review Comment:
   > but this change makes the thread fail to restore the FPU context in the 
following case:
   > 
   > 1. Thread 1 use FPU and then switch out(FPU save with dirty flag)
   > 2. Thread 1 switch in some time later(FPU restore with clean flag)
   > 3. Thread 1 doesn't use FPU in this time and switch out(skip FPU saving)
   > 4. Thread 2 switch in use FPU and thread 1 FPU context(hardware register) 
is destroyed
   > 5. Thread 1 switch in again, but can't restore the FPU context
   > 
   > So, the root cause is that #5731 move the storage of context from tcb to 
stack, and then we can't save FPU once but restore FPU multiple time because 
the stack(FPU saved here) may be modified after the thread resume the execution.
   > 
   > To fix this problem, we need save/restore FPU context every time if 
MSTATUS_FS doesn't equal MSTATUS_FS_INIT.
   
   Can we consider not cleaning the FS bit after restoring FPU?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to