diff options
author | Koudai Iwahori <koudai@google.com> | 2022-11-18 01:23:43 -0800 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2022-12-03 09:26:04 +0000 |
commit | a9d74285358b2e2c8adc822b6151e9e548920c64 (patch) | |
tree | 8fb74baafd0760f3505082061f3dc4520416b978 /src/rtos | |
parent | 3ea1bfce4faf656d0506c194084807f1e498abff (diff) | |
download | riscv-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.c | 9 |
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, |