]> git.gag.com Git - fw/openocd/blobdiff - src/target/target.c
target: add 64-bit address array command support
[fw/openocd] / src / target / target.c
index 450e231c6c990c53a30a28bb8e2f50c6571d6ced..6b53ebd98087a96fa6878b1e5e612656e2039ac4 100644 (file)
@@ -2342,7 +2342,7 @@ int target_profiling_default(struct target *target, uint32_t *samples,
 
        uint32_t sample_count = 0;
        /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
-       struct reg *reg = register_get_by_name(target->reg_cache, "pc", 1);
+       struct reg *reg = register_get_by_name(target->reg_cache, "pc", true);
 
        int retval = ERROR_OK;
        for (;;) {
@@ -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++) {
@@ -3134,7 +3130,7 @@ COMMAND_HANDLER(handle_reg_command)
                }
        } else {
                /* access a single register by its name */
-               reg = register_get_by_name(target->reg_cache, CMD_ARGV[0], 1);
+               reg = register_get_by_name(target->reg_cache, CMD_ARGV[0], true);
 
                if (!reg)
                        goto not_found;
@@ -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;
@@ -4415,9 +4419,10 @@ static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv)
 {
        long l;
+       jim_wide wide_addr;
        uint32_t width;
        int len;
-       uint32_t addr;
+       target_addr_t addr;
        uint32_t count;
        uint32_t v;
        const char *varname;
@@ -4444,8 +4449,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
        if (e != JIM_OK)
                return e;
 
-       e = Jim_GetLong(interp, argv[2], &l);
-       addr = l;
+       e = Jim_GetWide(interp, argv[2], &wide_addr);
+       addr = (target_addr_t)wide_addr;
        if (e != JIM_OK)
                return e;
        e = Jim_GetLong(interp, argv[3], &l);
@@ -4499,7 +4504,7 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
        } else {
                char buf[100];
                Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-               sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRIu32 " byte reads",
+               sprintf(buf, "mem2array address: " TARGET_ADDR_FMT " is not aligned for %" PRIu32 " byte reads",
                                addr,
                                width);
                Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
@@ -4531,7 +4536,7 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
                        retval = target_read_memory(target, addr, width, count, buffer);
                if (retval != ERROR_OK) {
                        /* BOO !*/
-                       LOG_ERROR("mem2array: Read @ 0x%08" PRIx32 ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
+                       LOG_ERROR("mem2array: Read @ " TARGET_ADDR_FMT ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
                                          addr,
                                          width,
                                          count);
@@ -4618,9 +4623,10 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
                int argc, Jim_Obj *const *argv)
 {
        long l;
+       jim_wide wide_addr;
        uint32_t width;
        int len;
-       uint32_t addr;
+       target_addr_t addr;
        uint32_t count;
        uint32_t v;
        const char *varname;
@@ -4646,8 +4652,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
        if (e != JIM_OK)
                return e;
 
-       e = Jim_GetLong(interp, argv[2], &l);
-       addr = l;
+       e = Jim_GetWide(interp, argv[2], &wide_addr);
+       addr = (target_addr_t)wide_addr;
        if (e != JIM_OK)
                return e;
        e = Jim_GetLong(interp, argv[3], &l);
@@ -4705,7 +4711,7 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
        } else {
                char buf[100];
                Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-               sprintf(buf, "array2mem address: 0x%08" PRIx32 " is not aligned for %" PRIu32 " byte reads",
+               sprintf(buf, "array2mem address: " TARGET_ADDR_FMT " is not aligned for %" PRIu32 " byte reads",
                                addr,
                                width);
                Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
@@ -4754,7 +4760,7 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
                        retval = target_write_memory(target, addr, width, count, buffer);
                if (retval != ERROR_OK) {
                        /* BOO !*/
-                       LOG_ERROR("array2mem: Write @ 0x%08" PRIx32 ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
+                       LOG_ERROR("array2mem: Write @ " TARGET_ADDR_FMT ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
                                          addr,
                                          width,
                                          count);