aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2022-02-19 16:56:42 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-02-26 15:37:34 +0000
commit103b1d68db5038edd9e8878c798525715590f4e1 (patch)
tree259805392d01dfe6e1b0bcf2d0ffa51ece2b8830
parentbc50b8f1b299991851d4ff3eb30f583ed6aa530b (diff)
downloadriscv-openocd-103b1d68db5038edd9e8878c798525715590f4e1.zip
riscv-openocd-103b1d68db5038edd9e8878c798525715590f4e1.tar.gz
riscv-openocd-103b1d68db5038edd9e8878c798525715590f4e1.tar.bz2
gdb_server: check target examined while combining reg list
Commit 6541233aa78d ("Combine register lists of smp targets.") assumes that all the targets in the SMP cluster are already examined and unconditionally call target_get_gdb_reg_list_noread() that will in turn return error if the target is not examined yet. Skip targets not examined yet. Add an additional check in case the register list cannot be built, e.g. because no target in the SMP cluster is examined. This should never happen, but it's better to play safe. Change-Id: I8609815c3d5144790fb05a870cb0c931540aef8a Fixes: 6541233aa78d ("Combine register lists of smp targets.") Reported-by: Michele Bisogno <michele.bisogno.ct@renesas.com> Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6853 Tested-by: jenkins Reviewed-by: Michele Bisogno <michele.bisogno.ct@renesas.com> Reviewed-by: Tim Newsome <tim@sifive.com>
-rw-r--r--src/server/gdb_server.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index f8a1aac..4dee7e8 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -2281,6 +2281,9 @@ static int smp_reg_list_noread(struct target *target,
struct target_list *head;
foreach_smp_target(head, target->smp_targets) {
+ if (!target_was_examined(head->target))
+ continue;
+
struct reg **reg_list = NULL;
int reg_list_size;
int result = target_get_gdb_reg_list_noread(head->target, &reg_list,
@@ -2329,8 +2332,17 @@ static int smp_reg_list_noread(struct target *target,
free(reg_list);
}
+ if (local_list_size == 0) {
+ LOG_ERROR("Unable to get register list");
+ free(local_list);
+ return ERROR_FAIL;
+ }
+
/* Now warn the user about any registers that weren't found in every target. */
foreach_smp_target(head, target->smp_targets) {
+ if (!target_was_examined(head->target))
+ continue;
+
struct reg **reg_list = NULL;
int reg_list_size;
int result = target_get_gdb_reg_list_noread(head->target, &reg_list,