target: check return value of register get/set callbacks
- 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>
This commit is contained in:
parent
66334354b7
commit
c8e643fd9f
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue