Open xuzihan351 opened 9 months ago
This is definitely a problem. A solution is to move RA into a compiler-preserved register (like S0) before the call. After the call returns, RA can be restored from the same register. Another option is to move the call to _tx_execution_isr_enter to AFTER _tx_thread_context_save returns. The downside of this is that it would need to be done in all ISRs that use _tx_thread_context_save. So that's more of a quick patch rather than a solution.
As for the other assembly files that have a _tx_execution* call, these look okay since RA is either saved prior to the call or restored subsequent to the call.
Let us discuss the code below(ports/risc-v32/iar/src/tx_thread_context_save.s and others asm code)
The function tx_thread_context_save is called from ISR or another function, and tx_thread_context_save will return to it by ret. Register RA stored the return address of the caller function. When TX_ENABLE_EXECUTION_CHANGE_NOTIFY is enabled, function _tx_execution_isr_enter will be called, and register RA will store the return address of the next line of call _tx_execution_isr_enter . Without saving register RA before call _tx_execution_isr_enter, the return address of tx_thread_context_save's caller function will be replaced. Resulting in function tx_thread_context_save will never return to the right address.