You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Let us discuss the code below(ports/risc-v32/iar/src/tx_thread_context_save.s and others asm code)
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* _tx_execution_isr_enter is called with thread stack pointer */
call _tx_execution_isr_enter ; Call the ISR execution enter function
#endif
...
...
ret
END
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.
The text was updated successfully, but these errors were encountered:
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.
The text was updated successfully, but these errors were encountered: