aboutsummaryrefslogtreecommitdiff
path: root/src/rtos/hwthread.c
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2023-05-01 10:17:24 -0700
committerTim Newsome <tim@sifive.com>2023-05-04 14:38:10 -0700
commitda44fb5407a3aed24b1be04dd3c12d6a8b013fc8 (patch)
tree7a0b5c63a914ba290a2cbbea4331bc5e499b20d5 /src/rtos/hwthread.c
parentfc52bfefc8e794d037bfb23a3a7358daba5c9475 (diff)
parent228fe7300c7df7aa05ba2c0bc19edde6d0156401 (diff)
downloadriscv-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.c30
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);