target: remove memory leaks
[fw/openocd] / src / target / xscale.c
index 120988caee6fe6f2fbf1b6ac8578a6e2fef2601b..e88a23112b0dd17f964783fbbccf28abf9c218a5 100644 (file)
@@ -513,8 +513,6 @@ done:
 static int xscale_send(struct target *target, const uint8_t *buffer, int count, int size)
 {
        struct xscale_common *xscale = target_to_xscale(target);
-       uint32_t t[3];
-       int bits[3];
        int retval;
        int done_count = 0;
 
@@ -522,37 +520,45 @@ static int xscale_send(struct target *target, const uint8_t *buffer, int count,
                XSCALE_DBGRX << xscale->xscale_variant,
                TAP_IDLE);
 
-       bits[0] = 3;
-       t[0] = 0;
-       bits[1] = 32;
-       t[2] = 1;
-       bits[2] = 1;
+       static const uint8_t t0;
+       uint8_t t1[4];
+       static const uint8_t t2 = 1;
+       struct scan_field fields[3] = {
+                       { .num_bits = 3, .out_value = &t0 },
+                       { .num_bits = 32, .out_value = t1 },
+                       { .num_bits = 1, .out_value = &t2 },
+       };
+
        int endianness = target->endianness;
        while (done_count++ < count) {
+               uint32_t t;
+
                switch (size) {
                        case 4:
                                if (endianness == TARGET_LITTLE_ENDIAN)
-                                       t[1] = le_to_h_u32(buffer);
+                                       t = le_to_h_u32(buffer);
                                else
-                                       t[1] = be_to_h_u32(buffer);
+                                       t = be_to_h_u32(buffer);
                                break;
                        case 2:
                                if (endianness == TARGET_LITTLE_ENDIAN)
-                                       t[1] = le_to_h_u16(buffer);
+                                       t = le_to_h_u16(buffer);
                                else
-                                       t[1] = be_to_h_u16(buffer);
+                                       t = be_to_h_u16(buffer);
                                break;
                        case 1:
-                               t[1] = buffer[0];
+                               t = buffer[0];
                                break;
                        default:
                                LOG_ERROR("BUG: size neither 4, 2 nor 1");
                                return ERROR_COMMAND_SYNTAX_ERROR;
                }
-               jtag_add_dr_out(target->tap,
+
+               buf_set_u32(t1, 0, 32, t);
+
+               jtag_add_dr_scan(target->tap,
                        3,
-                       bits,
-                       t,
+                       fields,
                        TAP_IDLE);
                buffer += size;
        }
@@ -1815,8 +1821,10 @@ static int xscale_read_memory(struct target *target, uint32_t address,
        /* receive data from target (count times 32-bit words in host endianness) */
        buf32 = malloc(4 * count);
        retval = xscale_receive(target, buf32, count);
-       if (retval != ERROR_OK)
+       if (retval != ERROR_OK) {
+               free(buf32);
                return retval;
+       }
 
        /* extract data from host-endian buffer into byte stream */
        for (i = 0; i < count; i++) {
@@ -3388,7 +3396,7 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command)
 
        if (xscale->trace.mode != XSCALE_TRACE_DISABLED) {
                char fill_string[12];
-               sprintf(fill_string, "fill %" PRId32, xscale->trace.buffer_fill);
+               sprintf(fill_string, "fill %d", xscale->trace.buffer_fill);
                command_print(CMD_CTX, "trace buffer enabled (%s)",
                        (xscale->trace.mode == XSCALE_TRACE_FILL)
                        ? fill_string : "wrap");
@@ -3713,8 +3721,6 @@ struct target_type xscale_target = {
        .poll = xscale_poll,
        .arch_state = xscale_arch_state,
 
-       .target_request_data = NULL,
-
        .halt = xscale_halt,
        .resume = xscale_resume,
        .step = xscale_step,