retire ERROR_INVALID_ARGUMENTS and replace with ERROR_COMMAND_SYNTAX_ERROR
[fw/openocd] / src / target / target.c
index d4cb577c4dab5a11e863e941c21cd7864b6b696c..eca69cf68629386effe2cc408c53a8b290baf737 100644 (file)
@@ -84,6 +84,7 @@ extern struct target_type dsp563xx_target;
 extern struct target_type dsp5680xx_target;
 extern struct target_type testee_target;
 extern struct target_type avr32_ap7k_target;
+extern struct target_type stm32_stlink_target;
 
 static struct target_type *target_types[] =
 {
@@ -107,6 +108,7 @@ static struct target_type *target_types[] =
        &dsp5680xx_target,
        &testee_target,
        &avr32_ap7k_target,
+       &stm32_stlink_target,
        NULL,
 };
 
@@ -940,6 +942,8 @@ static int target_init_one(struct command_context *cmd_ctx,
        if (type->check_reset== NULL)
                type->check_reset = default_check_reset;
 
+       assert(type->init_target != NULL);
+
        int retval = type->init_target(cmd_ctx, target);
        if (ERROR_OK != retval)
        {
@@ -1043,6 +1047,8 @@ static int target_init(struct command_context *cmd_ctx)
 
 COMMAND_HANDLER(handle_target_init_command)
 {
+       int retval;
+
        if (CMD_ARGC != 0)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
@@ -1054,6 +1060,10 @@ COMMAND_HANDLER(handle_target_init_command)
        }
        target_initialized = true;
 
+       retval = command_run_line(CMD_CTX, "init_targets");
+       if (ERROR_OK != retval)
+               return retval;
+
        LOG_DEBUG("Initializing targets...");
        return target_init(CMD_CTX);
 }
@@ -1064,7 +1074,7 @@ int target_register_event_callback(int (*callback)(struct target *target, enum t
 
        if (callback == NULL)
        {
-               return ERROR_INVALID_ARGUMENTS;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        if (*callbacks_p)
@@ -1089,7 +1099,7 @@ int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int
 
        if (callback == NULL)
        {
-               return ERROR_INVALID_ARGUMENTS;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        if (*callbacks_p)
@@ -1127,7 +1137,7 @@ int target_unregister_event_callback(int (*callback)(struct target *target, enum
 
        if (callback == NULL)
        {
-               return ERROR_INVALID_ARGUMENTS;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        while (c)
@@ -1154,7 +1164,7 @@ static int target_unregister_timer_callback(int (*callback)(void *priv), void *p
 
        if (callback == NULL)
        {
-               return ERROR_INVALID_ARGUMENTS;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        while (c)
@@ -1671,7 +1681,7 @@ int target_checksum_memory(struct target *target, uint32_t address, uint32_t siz
                if (buffer == NULL)
                {
                        LOG_ERROR("error allocating buffer for section (%d bytes)", (int)size);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                retval = target_read_buffer(target, address, size, buffer);
                if (retval != ERROR_OK)
@@ -1861,30 +1871,38 @@ int target_write_u8(struct target *target, uint32_t address, uint8_t value)
        return retval;
 }
 
-COMMAND_HANDLER(handle_targets_command)
+static int find_target(struct command_context *cmd_ctx, const char *name)
 {
-       struct target *target = all_targets;
+       struct target *target = get_target(name);
+       if (target == NULL) {
+               LOG_ERROR("Target: %s is unknown, try one of:\n", name);
+               return ERROR_FAIL;
+       }
+       if (!target->tap->enabled) {
+               LOG_USER("Target: TAP %s is disabled, "
+                        "can't be the current target\n",
+                        target->tap->dotted_name);
+               return ERROR_FAIL;
+       }
+
+       cmd_ctx->current_target = target->target_number;
+       return ERROR_OK;
+}
+
 
+COMMAND_HANDLER(handle_targets_command)
+{
+       int retval = ERROR_OK;
        if (CMD_ARGC == 1)
        {
-               target = get_target(CMD_ARGV[0]);
-               if (target == NULL) {
-                       command_print(CMD_CTX,"Target: %s is unknown, try one of:\n", CMD_ARGV[0]);
-                       goto DumpTargets;
-               }
-               if (!target->tap->enabled) {
-                       command_print(CMD_CTX,"Target: TAP %s is disabled, "
-                                       "can't be the current target\n",
-                                       target->tap->dotted_name);
-                       return ERROR_FAIL;
+               retval = find_target(CMD_CTX, CMD_ARGV[0]);
+               if (retval == ERROR_OK) {
+                       /* we're done! */
+                       return retval;
                }
-
-               CMD_CTX->current_target = target->target_number;
-               return ERROR_OK;
        }
-DumpTargets:
 
-       target = all_targets;
+       struct target *target = all_targets;
        command_print(CMD_CTX, "    TargetName         Type       Endian TapName            State       ");
        command_print(CMD_CTX, "--  ------------------ ---------- ------ ------------------ ------------");
        while (target)
@@ -1901,19 +1919,20 @@ DumpTargets:
                        marker = '*';
 
                /* keep columns lined up to match the headers above */
-               command_print(CMD_CTX, "%2d%c %-18s %-10s %-6s %-18s %s",
-                                         target->target_number,
-                                         marker,
-                                         target_name(target),
-                                         target_type_name(target),
-                                         Jim_Nvp_value2name_simple(nvp_target_endian,
-                                                               target->endianness)->name,
-                                         target->tap->dotted_name,
-                                         state);
+               command_print(CMD_CTX,
+                               "%2d%c %-18s %-10s %-6s %-18s %s",
+                               target->target_number,
+                               marker,
+                               target_name(target),
+                               target_type_name(target),
+                               Jim_Nvp_value2name_simple(nvp_target_endian,
+                                       target->endianness)->name,
+                               target->tap->dotted_name,
+                               state);
                target = target->next;
        }
 
-       return ERROR_OK;
+       return retval;
 }
 
 /* every 300ms we check for reset & powerdropout and issue a "reset halt" if so. */
@@ -2190,6 +2209,8 @@ COMMAND_HANDLER(handle_reg_command)
                }
        }
 
+       assert(reg != NULL); /* give clang a hint that we *know* reg is != NULL here */
+
        /* display a register */
        if ((CMD_ARGC == 1) || ((CMD_ARGC == 2) && !((CMD_ARGV[1][0] >= '0') && (CMD_ARGV[1][0] <= '9'))))
        {
@@ -2210,6 +2231,8 @@ COMMAND_HANDLER(handle_reg_command)
        if (CMD_ARGC == 2)
        {
                uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8));
+               if (buf == NULL)
+                       return ERROR_FAIL;
                str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0);
 
                reg->type->set(reg, buf);
@@ -3414,9 +3437,9 @@ COMMAND_HANDLER(handle_profile_command)
        /* 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);
 
+       int retval = ERROR_OK;
        for (;;)
        {
-               int retval;
                target_poll(target);
                if (target->state == TARGET_HALTED)
                {
@@ -3469,7 +3492,7 @@ COMMAND_HANDLER(handle_profile_command)
        }
        free(samples);
 
-       return ERROR_OK;
+       return retval;
 }
 
 static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t val)
@@ -3634,7 +3657,7 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
                        Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
                        e = JIM_ERR;
-                       len = 0;
+                       break;
                } else {
                        v = 0; /* shut up gcc */
                        for (i = 0 ;i < count ;i++, n++) {
@@ -3659,7 +3682,7 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
 
        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
 
-       return JIM_OK;
+       return e;
 }
 
 static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t *val)
@@ -3844,7 +3867,7 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
                        Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
                        e = JIM_ERR;
-                       len = 0;
+                       break;
                }
        }
 
@@ -3852,7 +3875,7 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
 
        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
 
-       return JIM_OK;
+       return e;
 }
 
 /* FIX? should we propagate errors here rather than printing them
@@ -4164,6 +4187,8 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target)
                                        free((void *)(target->variant));
                                }
                                e = Jim_GetOpt_String(goi, &cp, NULL);
+                               if (e != JIM_OK)
+                                       return e;
                                target->variant = strdup(cp);
                        } else {
                                if (goi->argc != 0) {
@@ -4889,6 +4914,8 @@ static int target_create(Jim_GetOptInfo *goi)
 
        /* TYPE */
        e = Jim_GetOpt_String(goi, &cp2, NULL);
+       if (e != JIM_OK)
+               return e;
        cp = cp2;
        /* now does target type exist */
        for (x = 0 ; target_types[x] ; x++) {
@@ -5098,11 +5125,10 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        const char *targetname;
        int retval,len;
        struct target *target;
-       struct target_list *head, *curr, *new;
+       struct target_list *head, *curr;
     curr = (struct target_list*) NULL;
        head = (struct target_list*) NULL;
-       new = (struct target_list*) NULL;
-
+       
        retval = 0;
        LOG_DEBUG("%d",argc);
        /* argv[1] = target to associate in smp
@@ -5118,6 +5144,7 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                LOG_DEBUG("%s ",targetname);
                if (target)
                {
+                       struct target_list *new;
                        new=malloc(sizeof(struct target_list));
                        new->target = target;
                        new->next = (struct target_list*)NULL;
@@ -5507,11 +5534,13 @@ static const struct command_registration target_exec_command_handlers[] = {
                .mode = COMMAND_EXEC,
                .help = "loads active fast load image to current target "
                        "- mainly for profiling purposes",
+               .usage = "",
        },
        {
                .name = "profile",
                .handler = handle_profile_command,
                .mode = COMMAND_EXEC,
+               .usage = "seconds filename",
                .help = "profiling samples the CPU PC",
        },
        /** @todo don't register virt2phys() unless target supports it */
@@ -5572,6 +5601,7 @@ static const struct command_registration target_exec_command_handlers[] = {
                .name = "soft_reset_halt",
                .handler = handle_soft_reset_halt_command,
                .mode = COMMAND_EXEC,
+               .usage = "",
                .help = "halt the target and do a soft reset",
        },
        {
@@ -5628,7 +5658,7 @@ static const struct command_registration target_exec_command_handlers[] = {
                .handler = handle_bp_command,
                .mode = COMMAND_EXEC,
                .help = "list or set hardware or software breakpoint",
-               .usage = "usage: bp <address> [<asid>]<length> ['hw'|'hw_ctx']",
+               .usage = "<address> [<asid>]<length> ['hw'|'hw_ctx']",
        },
        {
                .name = "rbp",