hwthread: Restore current_threadid in hwthread_update_threads 58/7358/5
authorKoudai Iwahori <koudai@google.com>
Fri, 18 Nov 2022 14:18:17 +0000 (06:18 -0800)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 3 Dec 2022 09:26:29 +0000 (09:26 +0000)
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>
src/rtos/hwthread.c

index 1540168c30abd830406e8a6481d6132aee1e3cd4..03c4d8550397d151f7ea9e44a8fc65e13e291420 100644 (file)
@@ -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);
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)