From b95f7649bb50f24594d862da87bac63ba5fb07a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Desbiens?= Date: Thu, 10 Sep 2026 15:37:09 -0400 Subject: [PATCH] Masked the core maps passed to the SMP remap solution search against TX_THREAD_SMP_CORE_MASK, so the computed core index is provably within the schedule list and GCC no longer reports a false array bounds error at -O2 The remap solution search derives a core number from the lowest set bit of the supplied core maps and uses it to index _tx_thread_smp_schedule_list and the local remap list, both of which have TX_THREAD_SMP_MAX_CORES entries. Every map reaching the function is already restricted to the cores that are present, because tx_thread_smp_cores_allowed is masked with TX_THREAD_SMP_CORE_MASK in tx_thread_create and tx_thread_smp_core_exclude. The compiler cannot see that invariant, however, so when the function is inlined into _tx_thread_system_suspend at -O2 GCC assumes the bit number can be as high as 31 and reports an out of bounds array subscript, which fails the build under -Werror. Masking the three incoming maps with TX_THREAD_SMP_CORE_MASK makes the invariant explicit. The masks are semantic no-ops, so scheduling behaviour is unchanged. The first core queue entry is now initialized as well, since the narrowed value range lets the compiler consider an empty queue on entry. Fixes #469 Assisted-by: Copilot (Opus 5) --- common_smp/inc/tx_thread.h | 9 +++++++++ common_smp/src/tx_thread_smp_utilities.c | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/common_smp/inc/tx_thread.h b/common_smp/inc/tx_thread.h index b92ce50e6..64998a694 100644 --- a/common_smp/inc/tx_thread.h +++ b/common_smp/inc/tx_thread.h @@ -9,6 +9,7 @@ * SPDX-License-Identifier: MIT **************************************************************************/ +// Some portions generated by Copilot (Opus 5). /**************************************************************************/ /**************************************************************************/ @@ -1171,6 +1172,11 @@ TX_THREAD *last_thread; TX_THREAD *thread_remap_list[TX_THREAD_SMP_MAX_CORES]; + /* Limit the supplied core maps to the cores that are actually present. */ + available_cores = available_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + thread_possible_cores = thread_possible_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + test_possible_cores = test_possible_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + /* Clear the last thread cores in the search. */ last_thread_cores = ((ULONG) 0); @@ -1181,6 +1187,9 @@ TX_THREAD *thread_remap_list[TX_THREAD_SMP_MAX_CORES]; queue_first = ((UINT) 0); queue_last = ((UINT) 0); + /* Initialize the first core queue entry. */ + core_queue[0] = ((UINT) 0); + /* Build a list of possible cores for this thread to execute on, starting with the previously mapped core. */ core = schedule_thread -> tx_thread_smp_core_mapped; diff --git a/common_smp/src/tx_thread_smp_utilities.c b/common_smp/src/tx_thread_smp_utilities.c index 833a9aab4..cb31e33a9 100644 --- a/common_smp/src/tx_thread_smp_utilities.c +++ b/common_smp/src/tx_thread_smp_utilities.c @@ -9,6 +9,7 @@ * SPDX-License-Identifier: MIT **************************************************************************/ +// Some portions generated by Copilot (Opus 5). /**************************************************************************/ /**************************************************************************/ @@ -654,6 +655,11 @@ TX_THREAD *last_thread; TX_THREAD *thread_remap_list[TX_THREAD_SMP_MAX_CORES]; + /* Limit the supplied core maps to the cores that are actually present. */ + available_cores = available_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + thread_possible_cores = thread_possible_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + test_possible_cores = test_possible_cores & ((ULONG) TX_THREAD_SMP_CORE_MASK); + /* Clear the last thread cores in the search. */ last_thread_cores = ((ULONG) 0); @@ -664,6 +670,9 @@ TX_THREAD *thread_remap_list[TX_THREAD_SMP_MAX_CORES]; queue_first = ((UINT) 0); queue_last = ((UINT) 0); + /* Initialize the first core queue entry. */ + core_queue[0] = ((UINT) 0); + /* Build a list of possible cores for this thread to execute on, starting with the previously mapped core. */ core = schedule_thread -> tx_thread_smp_core_mapped;