Matteo Concas created an issue: 
https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5288



If the Double Trap Extension is implemented, the MDT bit of the mstatus (or 
mstatush in RV32) register will be set when a trap is to be taken.

The MIE (Machine Interrupt Enable) bit can only be set to 1 if the MDT bit is 
zero.

Thus, we need to clear MDT first if we want to enable interrupts when 
dispatching a thread.

MDT is also cleared in register `a1` before restoring the interrupt frame as 
writing 1 to MDT will cause MIE to be set to 0. In RV64 this happens regardless 
of the value written to MIE in the same write.

In RV32, MDT is in mstatush so we do not need to clear during restore as this 
register is not restored.

With this change all 60 SMP tests pass (compared to 20/60 before the fix). The 
tests have been run on hardware using two RV64 CPUs that implement the double 
trap extension.

-- 
View it on GitLab: https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5288
You're receiving this email because of your account on gitlab.rtems.org.


_______________________________________________
bugs mailing list
bugs@rtems.org
http://lists.rtems.org/mailman/listinfo/bugs

Reply via email to