aboutsummaryrefslogtreecommitdiff
path: root/src/rtos
diff options
context:
space:
mode:
authorKoudai Iwahori <koudai@google.com>2022-11-18 01:23:43 -0800
committerAntonio Borneo <borneo.antonio@gmail.com>2022-12-03 09:26:04 +0000
commita9d74285358b2e2c8adc822b6151e9e548920c64 (patch)
tree8fb74baafd0760f3505082061f3dc4520416b978 /src/rtos
parent3ea1bfce4faf656d0506c194084807f1e498abff (diff)
downloadriscv-openocd-a9d74285358b2e2c8adc822b6151e9e548920c64.zip
riscv-openocd-a9d74285358b2e2c8adc822b6151e9e548920c64.tar.gz
riscv-openocd-a9d74285358b2e2c8adc822b6151e9e548920c64.tar.bz2
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 <koudai@google.com> Change-Id: Iad6424b62124271ec411b1dfc044b57dfc460280 Reviewed-on: https://review.openocd.org/c/openocd/+/7357 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src/rtos')
-rw-r--r--src/rtos/hwthread.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c
index 50e7bae..1540168 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,