arm_adi_v5: mem_ap_write error propagation
[fw/openocd] / src / target / target.c
index 01d94416b27540163ad76f8778a4e59ec11d21ec..3bf6824be289a496643aa2342bb763573f51a8cf 100644 (file)
@@ -2135,11 +2135,11 @@ COMMAND_HANDLER(handle_halt_command)
 
        if (CMD_ARGC == 1)
        {
-               unsigned wait;
-               retval = parse_uint(CMD_ARGV[0], &wait);
+               unsigned wait_local;
+               retval = parse_uint(CMD_ARGV[0], &wait_local);
                if (ERROR_OK != retval)
                        return ERROR_COMMAND_SYNTAX_ERROR;
-               if (!wait)
+               if (!wait_local)
                        return ERROR_OK;
        }
 
@@ -2378,7 +2378,7 @@ static int target_fill_mem(struct target *target,
                {
                        current = chunk_size;
                }
-               int retval = fn(target, address + x * data_size, data_size, current, target_buf);
+               retval = fn(target, address + x * data_size, data_size, current, target_buf);
                if (retval != ERROR_OK)
                {
                        break;
@@ -3065,8 +3065,8 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
                long long a = address-min;
                long long b = length-1;
                long long c = addressSpace-1;
-               int index = (a*b)/c; /* danger!!!! int32 overflows */
-               buckets[index]++;
+               int index_t = (a*b)/c; /* danger!!!! int32 overflows */
+               buckets[index_t]++;
        }
 
        /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
@@ -3894,14 +3894,14 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target)
                        break;
                case TCFG_CHAIN_POSITION:
                        if (goi->isconfigure) {
-                               Jim_Obj *o;
+                               Jim_Obj *o_t;
                                struct jtag_tap *tap;
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Obj(goi, &o);
+                               e = Jim_GetOpt_Obj(goi, &o_t);
                                if (e != JIM_OK) {
                                        return e;
                                }
-                               tap = jtag_tap_by_jim_obj(goi->interp, o);
+                               tap = jtag_tap_by_jim_obj(goi->interp, o_t);
                                if (tap == NULL) {
                                        return JIM_ERR;
                                }
@@ -3950,19 +3950,30 @@ static int jim_target_mw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        Jim_GetOptInfo goi;
        Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
 
-       /* danger! goi.argc will be modified below! */
-       argc = goi.argc;
-
-       if (argc != 2 && argc != 3)
+       if (goi.argc < 2 || goi.argc > 4)
        {
                Jim_SetResult_sprintf(goi.interp,
-                               "usage: %s <address> <data> [<count>]", cmd_name);
+                               "usage: %s [phys] <address> <data> [<count>]", cmd_name);
                return JIM_ERR;
        }
 
+       target_write_fn fn;
+       fn = target_write_memory_fast;
+
+       int e;
+       if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0)
+       {
+               /* consume it */
+               struct Jim_Obj *obj;
+               e = Jim_GetOpt_Obj(&goi, &obj);
+               if (e != JIM_OK)
+                       return e;
+
+               fn = target_write_phys_memory;
+       }
 
        jim_wide a;
-       int e = Jim_GetOpt_Wide(&goi, &a);
+       e = Jim_GetOpt_Wide(&goi, &a);
        if (e != JIM_OK)
                return e;
 
@@ -3972,13 +3983,19 @@ static int jim_target_mw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return e;
 
        jim_wide c = 1;
-       if (argc == 3)
+       if (goi.argc == 1)
        {
                e = Jim_GetOpt_Wide(&goi, &c);
                if (e != JIM_OK)
                        return e;
        }
 
+       /* all args must be consumed */
+       if (goi.argc != 0)
+       {
+               return JIM_ERR;
+       }
+
        struct target *target = Jim_CmdPrivData(goi.interp);
        unsigned data_size;
        if (strcasecmp(cmd_name, "mww") == 0) {
@@ -3994,7 +4011,7 @@ static int jim_target_mw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return JIM_ERR;
        }
 
-       return (target_fill_mem(target, a, target_write_memory_fast, data_size, b, c) == ERROR_OK) ? JIM_OK : JIM_ERR;
+       return (target_fill_mem(target, a, fn, data_size, b, c) == ERROR_OK) ? JIM_OK : JIM_ERR;
 }
 
 static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -4004,23 +4021,36 @@ static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        Jim_GetOptInfo goi;
        Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
 
-       /* danger! goi.argc will be modified below! */
-       argc = goi.argc;
-
-       if ((argc != 1) && (argc != 2))
+       if ((goi.argc < 1) || (goi.argc > 3))
        {
                Jim_SetResult_sprintf(goi.interp,
-                               "usage: %s <address> [<count>]", cmd_name);
+                               "usage: %s [phys] <address> [<count>]", cmd_name);
                return JIM_ERR;
        }
 
+       int (*fn)(struct target *target,
+                       uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+       fn=target_read_memory;
+
+       int e;
+       if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0)
+       {
+               /* consume it */
+               struct Jim_Obj *obj;
+               e = Jim_GetOpt_Obj(&goi, &obj);
+               if (e != JIM_OK)
+                       return e;
+
+               fn=target_read_phys_memory;
+       }
+
        jim_wide a;
-       int e = Jim_GetOpt_Wide(&goi, &a);
+       e = Jim_GetOpt_Wide(&goi, &a);
        if (e != JIM_OK) {
                return JIM_ERR;
        }
        jim_wide c;
-       if (argc == 2) {
+       if (goi.argc == 1) {
                e = Jim_GetOpt_Wide(&goi, &c);
                if (e != JIM_OK) {
                        return JIM_ERR;
@@ -4028,6 +4058,13 @@ static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        } else {
                c = 1;
        }
+
+       /* all args must be consumed */
+       if (goi.argc != 0)
+       {
+               return JIM_ERR;
+       }
+
        jim_wide b = 1; /* shut up gcc */
        if (strcasecmp(cmd_name, "mdw") == 0)
                b = 4;
@@ -4051,7 +4088,7 @@ static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                if (y > 16) {
                        y = 16;
                }
-               e = target_read_memory(target, a, b, y / b, target_buf);
+               e = fn(target, a, b, y / b, target_buf);
                if (e != ERROR_OK) {
                        Jim_SetResult_sprintf(interp, "error reading target @ 0x%08lx", (int)(a));
                        return JIM_ERR;