diff options
author | Tim Newsome <tim@sifive.com> | 2023-05-01 10:17:24 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2023-05-04 14:38:10 -0700 |
commit | da44fb5407a3aed24b1be04dd3c12d6a8b013fc8 (patch) | |
tree | 7a0b5c63a914ba290a2cbbea4331bc5e499b20d5 /src/rtos/hwthread.c | |
parent | fc52bfefc8e794d037bfb23a3a7358daba5c9475 (diff) | |
parent | 228fe7300c7df7aa05ba2c0bc19edde6d0156401 (diff) | |
download | riscv-openocd-da44fb5407a3aed24b1be04dd3c12d6a8b013fc8.zip riscv-openocd-da44fb5407a3aed24b1be04dd3c12d6a8b013fc8.tar.gz riscv-openocd-da44fb5407a3aed24b1be04dd3c12d6a8b013fc8.tar.bz2 |
Merge commit '228fe7300c7df7aa05ba2c0bc19edde6d0156401' into from_upstream
Conflicts:
doc/openocd.texi
src/jtag/aice/aice_pipe.c
src/jtag/aice/aice_usb.c
src/rtos/FreeRTOS.c
src/rtos/hwthread.c
src/rtos/rtos_standard_stackings.c
src/target/riscv/riscv.c
Change-Id: I0c6228c499d60274325be895fbcd8007ed1699bc
Diffstat (limited to 'src/rtos/hwthread.c')
-rw-r--r-- | src/rtos/hwthread.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c index 5e60c61..eac72fc 100644 --- a/src/rtos/hwthread.c +++ b/src/rtos/hwthread.c @@ -87,6 +87,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) @@ -108,10 +109,14 @@ static int hwthread_update_threads(struct rtos *rtos) } else thread_list_size = 1; - /* Wipe out previous thread details if any, but preserve threadid. */ - int64_t current_threadid = rtos->current_threadid; - rtos_free_threadlist(rtos); - rtos->current_threadid = current_threadid; + /* 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); @@ -264,10 +269,19 @@ static int hwthread_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, for (int i = 0; i < reg_list_size; i++) { if (!reg_list[i] || reg_list[i]->exist == false || reg_list[i]->hidden) continue; - (*rtos_reg_list)[j].number = (*reg_list)[i].number; - (*rtos_reg_list)[j].size = (*reg_list)[i].size; - memcpy((*rtos_reg_list)[j].value, (*reg_list)[i].value, - ((*reg_list)[i].size + 7) / 8); + if (!reg_list[i]->valid) { + retval = reg_list[i]->type->get(reg_list[i]); + if (retval != ERROR_OK) { + LOG_ERROR("Couldn't get register %s.", reg_list[i]->name); + free(reg_list); + free(*rtos_reg_list); + return retval; + } + } + (*rtos_reg_list)[j].number = reg_list[i]->number; + (*rtos_reg_list)[j].size = reg_list[i]->size; + memcpy((*rtos_reg_list)[j].value, reg_list[i]->value, + DIV_ROUND_UP(reg_list[i]->size, 8)); j++; } free(reg_list); |