cortex_a: add cortex_a_[read|write]_buffer
[fw/openocd] / src / jtag / tcl.c
index d0020cd37e18c267f30c7df47900270f27a5e17f..c916fb1ca186126b99f3c2566eace86f59664081 100644 (file)
@@ -59,8 +59,6 @@ static const Jim_Nvp nvp_jtag_tap_event[] = {
        { .name = NULL, .value = -1 }
 };
 
-extern struct jtag_interface *jtag_interface;
-
 struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
 {
        const char *cp = Jim_GetString(o, NULL);
@@ -171,7 +169,10 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                return JIM_ERR;
 
        num_fields = (argc-2)/2;
-       assert(num_fields > 0);
+       if (num_fields <= 0) {
+               Jim_SetResultString(interp, "drscan: no scan fields supplied", -1);
+               return JIM_ERR;
+       }
        fields = malloc(sizeof(struct scan_field) * num_fields);
        for (i = 2; i < argc; i += 2) {
                long bits;
@@ -205,7 +206,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
 
                Jim_GetLong(interp, args[i], &bits);
                str = buf_to_str(fields[field_count].in_value, bits, 16);
-               free((void *)fields[field_count].out_value);
+               free(fields[field_count].in_value);
 
                Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
                free(str);
@@ -433,20 +434,15 @@ static int jim_newtap_expected_id(Jim_Nvp *n, Jim_GetOptInfo *goi,
                return e;
        }
 
-       unsigned expected_len = sizeof(uint32_t) * pTap->expected_ids_cnt;
-       uint32_t *new_expected_ids = malloc(expected_len + sizeof(uint32_t));
-       if (new_expected_ids == NULL) {
+       uint32_t *p = realloc(pTap->expected_ids,
+                             (pTap->expected_ids_cnt + 1) * sizeof(uint32_t));
+       if (!p) {
                Jim_SetResultFormatted(goi->interp, "no memory");
                return JIM_ERR;
        }
 
-       memcpy(new_expected_ids, pTap->expected_ids, expected_len);
-
-       new_expected_ids[pTap->expected_ids_cnt] = w;
-
-       free(pTap->expected_ids);
-       pTap->expected_ids = new_expected_ids;
-       pTap->expected_ids_cnt++;
+       pTap->expected_ids = p;
+       pTap->expected_ids[pTap->expected_ids_cnt++] = w;
 
        return JIM_OK;
 }
@@ -467,7 +463,6 @@ static int jim_newtap_ir_param(Jim_Nvp *n, Jim_GetOptInfo *goi,
        if (e != JIM_OK) {
                Jim_SetResultFormatted(goi->interp,
                        "option: %s bad parameter", n->name);
-               free((void *)pTap->dotted_name);
                return e;
        }
        switch (n->value) {
@@ -553,8 +548,15 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
        LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
                pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
 
+       if (!transport_is_jtag()) {
+               /* SWD doesn't require any JTAG tap parameters */
+               pTap->enabled = true;
+               jtag_tap_init(pTap);
+               return JIM_OK;
+       }
+
        /* IEEE specifies that the two LSBs of an IR scan are 01, so make
-        * that the default.  The "-irlen" and "-irmask" options are only
+        * that the default.  The "-ircapture" and "-irmask" options are only
         * needed to cope with nonstandard TAPs, or to specify more bits.
         */
        pTap->ir_capture_mask = 0x03;
@@ -564,7 +566,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
                e = Jim_GetOpt_Nvp(goi, opts, &n);
                if (e != JIM_OK) {
                        Jim_GetOpt_NvpUnknown(goi, opts, 0);
-                       free((void *)pTap->dotted_name);
+                       free(cp);
                        free(pTap);
                        return e;
                }
@@ -579,7 +581,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
                    case NTAP_OPT_EXPECTED_ID:
                            e = jim_newtap_expected_id(n, goi, pTap);
                            if (JIM_OK != e) {
-                                   free((void *)pTap->dotted_name);
+                                   free(cp);
                                    free(pTap);
                                    return e;
                            }
@@ -589,7 +591,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
                    case NTAP_OPT_IRCAPTURE:
                            e = jim_newtap_ir_param(n, goi, pTap);
                            if (JIM_OK != e) {
-                                   free((void *)pTap->dotted_name);
+                                   free(cp);
                                    free(pTap);
                                    return e;
                            }
@@ -1121,17 +1123,12 @@ COMMAND_HANDLER(handle_irscan_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       size_t fields_len = sizeof(struct scan_field) * num_fields;
-       fields = malloc(fields_len);
-       memset(fields, 0, fields_len);
+       fields = calloc(num_fields, sizeof(*fields));
 
        int retval;
        for (i = 0; i < num_fields; i++) {
                tap = jtag_tap_by_string(CMD_ARGV[i*2]);
                if (tap == NULL) {
-                       int j;
-                       for (j = 0; j < i; j++)
-                               free((void *)fields[j].out_value);
                        free(fields);
                        command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[i*2]);
 
@@ -1139,14 +1136,14 @@ COMMAND_HANDLER(handle_irscan_command)
                }
                int field_size = tap->ir_length;
                fields[i].num_bits = field_size;
-               fields[i].out_value = malloc(DIV_ROUND_UP(field_size, 8));
+               uint8_t *v = malloc(DIV_ROUND_UP(field_size, 8));
 
                uint64_t value;
                retval = parse_u64(CMD_ARGV[i * 2 + 1], &value);
                if (ERROR_OK != retval)
                        goto error_return;
-               void *v = (void *)fields[i].out_value;
                buf_set_u64(v, 0, field_size, value);
+               fields[i].out_value = v;
                fields[i].in_value = NULL;
        }