cmsis-dap: don't update the packet size across backends.
[fw/openocd] / src / jtag / tcl.c
index ba0cb1d1ecb683581d527d72545bcda040ee4875..2fa162e56ff84658019468c4ce50c6f6be6d4c9a 100644 (file)
@@ -108,7 +108,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
 
        endstate = TAP_IDLE;
 
-       script_debug(interp, "drscan", argc, args);
+       script_debug(interp, argc, args);
 
        /* validate arguments as numbers */
        e = JIM_OK;
@@ -194,6 +194,11 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
        retval = jtag_execute_queue();
        if (retval != ERROR_OK) {
                Jim_SetResultString(interp, "drscan: jtag execute failed", -1);
+
+               for (i = 0; i < field_count; i++)
+                       free(fields[i].in_value);
+               free(fields);
+
                return JIM_ERR;
        }
 
@@ -204,7 +209,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                char *str;
 
                Jim_GetLong(interp, args[i], &bits);
-               str = buf_to_str(fields[field_count].in_value, bits, 16);
+               str = buf_to_hex_str(fields[field_count].in_value, bits);
                free(fields[field_count].in_value);
 
                Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
@@ -229,7 +234,7 @@ static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *ar
                return JIM_ERR;
        }
 
-       script_debug(interp, "pathmove", argc, args);
+       script_debug(interp, argc, args);
 
        int i;
        for (i = 0; i < argc-1; i++) {
@@ -261,7 +266,7 @@ static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *ar
 
 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
 {
-       script_debug(interp, "flush_count", argc, args);
+       script_debug(interp, argc, args);
 
        Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count()));
 
@@ -689,8 +694,9 @@ static int jim_jtag_arp_init(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        int e = jtag_init_inner(context);
        if (e != ERROR_OK) {
                Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e);
+               Jim_IncrRefCount(eObj);
                Jim_SetResultFormatted(goi.interp, "error: %#s", eObj);
-               Jim_FreeNewObj(goi.interp, eObj);
+               Jim_DecrRefCount(goi.interp, eObj);
                return JIM_ERR;
        }
        return JIM_OK;
@@ -713,8 +719,9 @@ static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const
 
        if (e != ERROR_OK) {
                Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e);
+               Jim_IncrRefCount(eObj);
                Jim_SetResultFormatted(goi.interp, "error: %#s", eObj);
-               Jim_FreeNewObj(goi.interp, eObj);
+               Jim_DecrRefCount(goi.interp, eObj);
                return JIM_ERR;
        }
        return JIM_OK;
@@ -965,7 +972,7 @@ COMMAND_HANDLER(handle_scan_chain_command)
        while (tap) {
                uint32_t expected, expected_mask, ii;
 
-               snprintf(expected_id, sizeof expected_id, "0x%08x",
+               snprintf(expected_id, sizeof(expected_id), "0x%08x",
                        (unsigned)((tap->expected_ids_cnt > 0)
                                   ? tap->expected_ids[0]
                                   : 0));
@@ -987,7 +994,7 @@ COMMAND_HANDLER(handle_scan_chain_command)
                        (unsigned int)(expected_mask));
 
                for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
-                       snprintf(expected_id, sizeof expected_id, "0x%08x",
+                       snprintf(expected_id, sizeof(expected_id), "0x%08x",
                                (unsigned) tap->expected_ids[ii]);
                        if (tap->ignore_version)
                                expected_id[2] = '*';
@@ -1129,14 +1136,19 @@ COMMAND_HANDLER(handle_irscan_command)
 
                        return ERROR_FAIL;
                }
-               int field_size = tap->ir_length;
-               fields[i].num_bits = field_size;
-               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;
+
+               int field_size = tap->ir_length;
+               fields[i].num_bits = field_size;
+               uint8_t *v = calloc(1, DIV_ROUND_UP(field_size, 8));
+               if (!v) {
+                       LOG_ERROR("Out of memory");
+                       goto error_return;
+               }
+
                buf_set_u64(v, 0, field_size, value);
                fields[i].out_value = v;
                fields[i].in_value = NULL;
@@ -1148,10 +1160,8 @@ COMMAND_HANDLER(handle_irscan_command)
        retval = jtag_execute_queue();
 
 error_return:
-       for (i = 0; i < num_fields; i++) {
-               if (NULL != fields[i].out_value)
-                       free((void *)fields[i].out_value);
-       }
+       for (i = 0; i < num_fields; i++)
+               free((void *)fields[i].out_value);
 
        free(fields);