aboutsummaryrefslogtreecommitdiff
path: root/src/rtos
diff options
context:
space:
mode:
authorKoudai Iwahori <koudai@google.com>2022-11-18 06:18:17 -0800
committerAntonio Borneo <borneo.antonio@gmail.com>2022-12-03 09:26:29 +0000
commit4fe3997294e24d9a7bb41290088d6410f7ba1eca (patch)
tree98eb22ddecd73329ae9db36681c2813fd3e2d75a /src/rtos
parenta9d74285358b2e2c8adc822b6151e9e548920c64 (diff)
downloadriscv-openocd-4fe3997294e24d9a7bb41290088d6410f7ba1eca.zip
riscv-openocd-4fe3997294e24d9a7bb41290088d6410f7ba1eca.tar.gz
riscv-openocd-4fe3997294e24d9a7bb41290088d6410f7ba1eca.tar.bz2
hwthread: Restore current_threadid in hwthread_update_threads
When OpenOCD receives a step-execution command from GDB and the target is configured as rtos=hwthread, OpenOCD reconstructs the thread-info. However, OpenOCD does not restore the thread id which is currently selected by GDB. Due to this issue, OpenOCD sends the information of wrong thread to GDB after the step execution. This commit fixes the above issue by adding a code to save/restore the thread id selected by GDB. Signed-off-by: Koudai Iwahori <koudai@google.com> Change-Id: I761a1141c04d48f1290e4f09baa7c7024f86f36a Reviewed-on: https://review.openocd.org/c/openocd/+/7358 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src/rtos')
-rw-r--r--src/rtos/hwthread.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c
index 1540168..03c4d85 100644
--- a/src/rtos/hwthread.c
+++ b/src/rtos/hwthread.c
@@ -82,6 +82,7 @@ static int hwthread_update_threads(struct rtos *rtos)
struct target_list *head;
struct target *target;
int64_t current_thread = 0;
+ int64_t current_threadid = rtos->current_threadid; /* thread selected by GDB */
enum target_debug_reason current_reason = DBG_REASON_UNDEFINED;
if (!rtos)
@@ -105,6 +106,15 @@ static int hwthread_update_threads(struct rtos *rtos)
} else
thread_list_size = 1;
+ /* restore the threadid which is currently selected by GDB
+ * because rtos_free_threadlist() wipes out it
+ * (GDB thread id is 1-based indexing) */
+ if (current_threadid <= thread_list_size)
+ rtos->current_threadid = current_threadid;
+ else
+ LOG_WARNING("SMP node change, disconnect GDB from core/thread %" PRId64,
+ current_threadid);
+
/* create space for new thread details */
rtos->thread_details = malloc(sizeof(struct thread_detail) * thread_list_size);