]> git.sur5r.net Git - openocd/blobdiff - src/target/xscale.c
Fix some problems with the bin2char utility
[openocd] / src / target / xscale.c
index 3371a65d3e3926d45dd56c821368ea059c47b0f6..04189a1484bab6fda631d30b78185ecc8b0208e8 100644 (file)
@@ -73,14 +73,10 @@ static int xscale_read_trace(struct target *);
 
 /* This XScale "debug handler" is loaded into the processor's
  * mini-ICache, which is 2K of code writable only via JTAG.
- *
- * FIXME  the OpenOCD "bin2char" utility currently doesn't handle
- * binary files cleanly.  It's string oriented, and terminates them
- * with a NUL character.  Better would be to generate the constants
- * and let other code decide names, scoping, and other housekeeping.
  */
-static /* unsigned const char xscale_debug_handler[] = ... */
-#include "xscale_debug.h"
+static const uint8_t xscale_debug_handler[] = {
+#include "xscale_debug.inc"
+};
 
 static char *const xscale_reg_list[] = {
        "XSCALE_MAINID",                /* 0 */
@@ -513,8 +509,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 +516,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;
        }
@@ -1543,7 +1545,7 @@ static int xscale_deassert_reset(struct target *target)
                 * coprocessors, trace data, etc.
                 */
                address = xscale->handler_address;
-               for (unsigned binary_size = sizeof xscale_debug_handler - 1;
+               for (unsigned binary_size = sizeof xscale_debug_handler;
                        binary_size > 0;
                        binary_size -= buf_cnt, buffer += buf_cnt) {
                        uint32_t cache_line[8];
@@ -1815,8 +1817,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++) {
@@ -3020,7 +3024,7 @@ static int xscale_target_create(struct target *target, Jim_Interp *interp)
 {
        struct xscale_common *xscale;
 
-       if (sizeof xscale_debug_handler - 1 > 0x800) {
+       if (sizeof xscale_debug_handler > 0x800) {
                LOG_ERROR("debug_handler.bin: larger than 2kb");
                return ERROR_FAIL;
        }
@@ -3388,7 +3392,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");