From a9d74285358b2e2c8adc822b6151e9e548920c64 Mon Sep 17 00:00:00 2001 From: Koudai Iwahori Date: Fri, 18 Nov 2022 01:23:43 -0800 Subject: [PATCH] hwthread: Add register validity check in get_thread_reg_list When OpenOCD receives 'g' packet (read general registers) from GDB and target is configured as rtos=hwthread, hwthread_get_thread_reg_list is called. However, it does not check if the register valid or not. Due to this issue, OpenOCD returns invalid register values to GDB. This commit adds a validity check to hwthread_get_thread_reg_list. If the register is not valid, it tries to read the register from the target. Signed-off-by: Koudai Iwahori Change-Id: Iad6424b62124271ec411b1dfc044b57dfc460280 Reviewed-on: https://review.openocd.org/c/openocd/+/7357 Tested-by: jenkins Reviewed-by: Antonio Borneo --- src/rtos/hwthread.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c index 50e7bae51..1540168c3 100644 --- a/src/rtos/hwthread.c +++ b/src/rtos/hwthread.c @@ -255,6 +255,15 @@ 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; + 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, -- 2.11.4.GIT