]> git.gag.com Git - fw/openocd/commitdiff
target: check return value of register get/set callbacks
authorJan Matyas <matyas@codasip.com>
Fri, 4 Jun 2021 10:54:02 +0000 (12:54 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Fri, 2 Jul 2021 16:13:06 +0000 (17:13 +0100)
- In "reg" TCL command handler, the return value of register get()
  and set() callbacks must be checked, in the same manner as it is
  done in e.g. gdb_set_register_packet() or gdb_get_register_packet().

- Minor cleanup of variable definitions in the "reg" command
  handler.

Change-Id: I8c57e7c087fe31d1abffa3c4d1f79a01af4c9c97
Signed-off-by: Jan Matyas <matyas@codasip.com>
Reviewed-on: http://openocd.zylin.com/6293
Tested-by: jenkins
Reviewed-by: Marc Schink <dev@zapb.de>
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/target/target.c

index dbc99b41cfcd7eb5dffb39851160b21deed51f87..476986c24392c38fc8b2952f4e419b9dc0f2d12d 100644 (file)
@@ -3059,20 +3059,16 @@ static int handle_target(void *priv)
 
 COMMAND_HANDLER(handle_reg_command)
 {
-       struct target *target;
-       struct reg *reg = NULL;
-       unsigned count = 0;
-       char *value;
-
        LOG_DEBUG("-");
 
-       target = get_current_target(CMD_CTX);
+       struct target *target = get_current_target(CMD_CTX);
+       struct reg *reg = NULL;
 
        /* list all available registers for the current target */
        if (CMD_ARGC == 0) {
                struct reg_cache *cache = target->reg_cache;
 
-               count = 0;
+               unsigned int count = 0;
                while (cache) {
                        unsigned i;
 
@@ -3085,7 +3081,7 @@ COMMAND_HANDLER(handle_reg_command)
                                        continue;
                                /* only print cached values if they are valid */
                                if (reg->valid) {
-                                       value = buf_to_hex_str(reg->value,
+                                       char *value = buf_to_hex_str(reg->value,
                                                        reg->size);
                                        command_print(CMD,
                                                        "(%i) %s (/%" PRIu32 "): 0x%s%s",
@@ -3113,7 +3109,7 @@ COMMAND_HANDLER(handle_reg_command)
                COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
 
                struct reg_cache *cache = target->reg_cache;
-               count = 0;
+               unsigned int count = 0;
                while (cache) {
                        unsigned i;
                        for (i = 0; i < cache->num_regs; i++) {
@@ -3151,9 +3147,14 @@ COMMAND_HANDLER(handle_reg_command)
                if ((CMD_ARGC == 2) && (strcmp(CMD_ARGV[1], "force") == 0))
                        reg->valid = 0;
 
-               if (reg->valid == 0)
-                       reg->type->get(reg);
-               value = buf_to_hex_str(reg->value, reg->size);
+               if (reg->valid == 0) {
+                       int retval = reg->type->get(reg);
+                       if (retval != ERROR_OK) {
+                               LOG_ERROR("Could not read register '%s'", reg->name);
+                               return retval;
+                       }
+               }
+               char *value = buf_to_hex_str(reg->value, reg->size);
                command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
                return ERROR_OK;
@@ -3166,15 +3167,18 @@ COMMAND_HANDLER(handle_reg_command)
                        return ERROR_FAIL;
                str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0);
 
-               reg->type->set(reg, buf);
-
-               value = buf_to_hex_str(reg->value, reg->size);
-               command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
-               free(value);
+               int retval = reg->type->set(reg, buf);
+               if (retval != ERROR_OK) {
+                       LOG_ERROR("Could not write to register '%s'", reg->name);
+               } else {
+                       char *value = buf_to_hex_str(reg->value, reg->size);
+                       command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
+                       free(value);
+               }
 
                free(buf);
 
-               return ERROR_OK;
+               return retval;
        }
 
        return ERROR_COMMAND_SYNTAX_ERROR;