summaryrefslogtreecommitdiff
path: root/ports/xtensa/xcc/src/tx_thread_schedule.S
diff options
context:
space:
mode:
authorFrédéric Desbiens <[email protected]>2026-06-08 10:01:32 +0200
committerGitHub <[email protected]>2026-06-08 10:01:32 +0200
commit87ab09cce305eb9cd4aacac4e8c62af72f665bff (patch)
treedd062ebbea5235d1921c64b396bf7e4ce79e9e15 /ports/xtensa/xcc/src/tx_thread_schedule.S
parent9ab0cf9683f832cdb48e2099533a5b06a3afcd64 (diff)
parent730b61874bc5cf40768987605ae5187fde0fa1e2 (diff)
Merge pull request #544 from eclipse-threadx/devv6.5.1.202602_rel
Merging changes for the v.6.5.1.202602 release
Diffstat (limited to 'ports/xtensa/xcc/src/tx_thread_schedule.S')
-rw-r--r--ports/xtensa/xcc/src/tx_thread_schedule.S27
1 files changed, 23 insertions, 4 deletions
diff --git a/ports/xtensa/xcc/src/tx_thread_schedule.S b/ports/xtensa/xcc/src/tx_thread_schedule.S
index 448dc6d7..6c595170 100644
--- a/ports/xtensa/xcc/src/tx_thread_schedule.S
+++ b/ports/xtensa/xcc/src/tx_thread_schedule.S
@@ -166,9 +166,18 @@ _tx_thread_schedule:
#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* Call the thread entry function to indicate the thread is executing. */
+ /* Note a2 may be trashed by this call, must be reloaded. */
#ifdef __XTENSA_CALL0_ABI__
call0 _tx_execution_thread_enter
+ movi a2, _tx_thread_current_ptr
+ l32i a2, a2, 0
#else
+ /* Ensure that PS.WOE is set for windowed call */
+ movi a0, PS_WOE
+ rsr.ps a3
+ or a3, a3, a0
+ wsr.ps a3
+ rsync
call8 _tx_execution_thread_enter
#endif
#endif
@@ -229,14 +238,24 @@ _tx_thread_schedule:
rsync /* ensure wsr.CPENABLE has completed */
#endif
- wsr a3, PS /* no need to sync PS, delay is OK */
-
- /* This does not return to its caller, but to the selected thread. */
+ /* De-allocate the remainder of the frame before reenabling interrupts
+ * to avoid overrunning a task stack of TX_MINIMUM_STACK bytes, which
+ * can only handle one XT_STK_FRMSZ.
+ */
#ifdef __XTENSA_CALL0_ABI__
/* 'addi sp, sp, imm' could turn into 'addmi, addi' sequence and make */
/* the sp briefly point to an illegal stack location. Avoid that. */
- addi a2, sp, XT_STK_FRMSZ
+ addi a2, sp, XT_STK_FRMSZ /* fully deallocate stack frame */
mov sp, a2
+ #else
+ addi a2, sp, XT_STK_FRMSZ - 48 /* initial SP at solicited entry; */
+ movsp sp, a2 /* retw will deallocate remainder */
+ #endif
+
+ wsr a3, PS /* no need to sync PS, delay is OK */
+
+ /* This does not return to its caller, but to the selected thread. */
+ #ifdef __XTENSA_CALL0_ABI__
ret
#else
retw