target: remove unused interface fn that clutters code
[openocd.git] / src / target / xscale.c
index 705c2f0a42e84709825da260f3f5eae8a7e11fd5..cc4176b61e1b3e66a8392fbf491546695fbc4088 100644 (file)
@@ -42,7 +42,7 @@
  *  Intel XScale® Core Developer’s Manual, January 2004
  *             Order Number: 273473-002
  *     This has a chapter detailing debug facilities, and punts some
- *     details to chip-specific microarchitecture documentats.
+ *     details to chip-specific microarchitecture documents.
  *
  *  Hot-Debug for Intel XScale® Core Debug White Paper, May 2005
  *             Document Number: 273539-005
@@ -69,6 +69,17 @@ static int xscale_unset_breakpoint(struct target_s *, breakpoint_t *);
 static int xscale_read_trace(target_t *);
 
 
+/* 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 char *const xscale_reg_list[] =
 {
        "XSCALE_MAINID",                /* 0 */
@@ -166,21 +177,15 @@ static int xscale_jtag_set_instr(jtag_tap_t *tap, uint32_t new_instr)
        if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr)
        {
                scan_field_t field;
+               uint8_t scratch[4];
 
+               memset(&field, 0, sizeof field);
                field.tap = tap;
                field.num_bits = tap->ir_length;
-               field.out_value = calloc(CEIL(field.num_bits, 8), 1);
+               field.out_value = scratch;
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
 
-               uint8_t tmp[4];
-               field.in_value = tmp;
-
                jtag_add_ir_scan(1, &field, jtag_get_end_state());
-
-               /* FIX!!!! isn't this check superfluous? verify_ircapture handles this? */
-               jtag_check_value_mask(&field, tap->expected, tap->expected_mask);
-
-               free(field.out_value);
        }
 
        return ERROR_OK;
@@ -190,9 +195,7 @@ static int xscale_read_dcsr(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-
        int retval;
-
        scan_field_t fields[3];
        uint8_t field0 = 0x0;
        uint8_t field0_check_value = 0x2;
@@ -202,23 +205,24 @@ static int xscale_read_dcsr(target_t *target)
        uint8_t field2_check_mask = 0x1;
 
        jtag_set_end_state(TAP_DRPAUSE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
+       xscale_jtag_set_instr(target->tap, XSCALE_SELDCSR);
 
        buf_set_u32(&field0, 1, 1, xscale->hold_rst);
        buf_set_u32(&field0, 2, 1, xscale->external_debug_break);
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0;
        uint8_t tmp;
        fields[0].in_value = &tmp;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 32;
-       fields[1].out_value = NULL;
        fields[1].in_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
 
-       fields[2].tap = xscale->jtag_info.tap;
+       fields[2].tap = target->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        uint8_t tmp2;
@@ -267,12 +271,8 @@ static int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
                return ERROR_INVALID_ARGUMENTS;
 
        int retval = ERROR_OK;
-       armv4_5_common_t *armv4_5 = target->arch_info;
-       xscale_common_t *xscale = armv4_5->arch_info;
-
        tap_state_t path[3];
        scan_field_t fields[3];
-
        uint8_t *field0 = malloc(num_words * 1);
        uint8_t field0_check_value = 0x2;
        uint8_t field0_check_mask = 0x6;
@@ -281,35 +281,29 @@ static int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
        uint8_t field2_check_mask = 0x1;
        int words_done = 0;
        int words_scheduled = 0;
-
        int i;
 
        path[0] = TAP_DRSELECT;
        path[1] = TAP_DRCAPTURE;
        path[2] = TAP_DRSHIFT;
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 3;
-       fields[0].out_value = NULL;
-       fields[0].in_value = NULL;
        fields[0].check_value = &field0_check_value;
        fields[0].check_mask = &field0_check_mask;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 32;
-       fields[1].out_value = NULL;
-       fields[1].check_value = NULL;
-       fields[1].check_mask = NULL;
 
-       fields[2].tap = xscale->jtag_info.tap;
+       fields[2].tap = target->tap;
        fields[2].num_bits = 1;
-       fields[2].out_value = NULL;
-       fields[2].in_value = NULL;
        fields[2].check_value = &field2_check_value;
        fields[2].check_mask = &field2_check_mask;
 
        jtag_set_end_state(TAP_IDLE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgtx);
+       xscale_jtag_set_instr(target->tap, XSCALE_DBGTX);
        jtag_add_runtest(1, jtag_get_end_state()); /* ensures that we're in the TAP_IDLE state as the above could be a no-op */
 
        /* repeat until all words have been collected */
@@ -381,10 +375,8 @@ static int xscale_read_tx(target_t *target, int consume)
        xscale_common_t *xscale = armv4_5->arch_info;
        tap_state_t path[3];
        tap_state_t noconsume_path[6];
-
        int retval;
        struct timeval timeout, now;
-
        scan_field_t fields[3];
        uint8_t field0_in = 0x0;
        uint8_t field0_check_value = 0x2;
@@ -394,7 +386,7 @@ static int xscale_read_tx(target_t *target, int consume)
 
        jtag_set_end_state(TAP_IDLE);
 
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgtx);
+       xscale_jtag_set_instr(target->tap, XSCALE_DBGTX);
 
        path[0] = TAP_DRSELECT;
        path[1] = TAP_DRCAPTURE;
@@ -407,19 +399,18 @@ static int xscale_read_tx(target_t *target, int consume)
        noconsume_path[4] = TAP_DREXIT2;
        noconsume_path[5] = TAP_DRSHIFT;
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 3;
-       fields[0].out_value = NULL;
        fields[0].in_value = &field0_in;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 32;
-       fields[1].out_value = NULL;
        fields[1].in_value = xscale->reg_cache->reg_list[XSCALE_TX].value;
 
-       fields[2].tap = xscale->jtag_info.tap;
+       fields[2].tap = target->tap;
        fields[2].num_bits = 1;
-       fields[2].out_value = NULL;
        uint8_t tmp;
        fields[2].in_value = &tmp;
 
@@ -481,10 +472,8 @@ static int xscale_write_rx(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-
        int retval;
        struct timeval timeout, now;
-
        scan_field_t fields[3];
        uint8_t field0_out = 0x0;
        uint8_t field0_in = 0x0;
@@ -496,19 +485,20 @@ static int xscale_write_rx(target_t *target)
 
        jtag_set_end_state(TAP_IDLE);
 
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgrx);
+       xscale_jtag_set_instr(target->tap, XSCALE_DBGRX);
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0_out;
        fields[0].in_value = &field0_in;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 32;
        fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_RX].value;
-       fields[1].in_value = NULL;
 
-       fields[2].tap = xscale->jtag_info.tap;
+       fields[2].tap = target->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        uint8_t tmp;
@@ -567,18 +557,14 @@ static int xscale_write_rx(target_t *target)
 /* send count elements of size byte to the debug handler */
 static int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
 {
-       armv4_5_common_t *armv4_5 = target->arch_info;
-       xscale_common_t *xscale = armv4_5->arch_info;
        uint32_t t[3];
        int bits[3];
-
        int retval;
-
        int done_count = 0;
 
        jtag_set_end_state(TAP_IDLE);
 
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgrx);
+       xscale_jtag_set_instr(target->tap, XSCALE_DBGRX);
 
        bits[0]=3;
        t[0]=0;
@@ -615,7 +601,7 @@ static int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
                        LOG_ERROR("BUG: size neither 4, 2 nor 1");
                        exit(-1);
                }
-               jtag_add_dr_out(xscale->jtag_info.tap,
+               jtag_add_dr_out(target->tap,
                                3,
                                bits,
                                t,
@@ -645,9 +631,7 @@ static int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-
        int retval;
-
        scan_field_t fields[3];
        uint8_t field0 = 0x0;
        uint8_t field0_check_value = 0x2;
@@ -663,23 +647,24 @@ static int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
                xscale->external_debug_break = ext_dbg_brk;
 
        jtag_set_end_state(TAP_IDLE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
+       xscale_jtag_set_instr(target->tap, XSCALE_SELDCSR);
 
        buf_set_u32(&field0, 1, 1, xscale->hold_rst);
        buf_set_u32(&field0, 2, 1, xscale->external_debug_break);
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0;
        uint8_t tmp;
        fields[0].in_value = &tmp;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 32;
        fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
-       fields[1].in_value = NULL;
 
-       fields[2].tap = xscale->jtag_info.tap;
+       fields[2].tap = target->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        uint8_t tmp2;
@@ -705,53 +690,50 @@ static int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
 /* parity of the number of bits 0 if even; 1 if odd. for 32 bit words */
 static unsigned int parity (unsigned int v)
 {
-       unsigned int ov = v;
+       // unsigned int ov = v;
        v ^= v >> 16;
        v ^= v >> 8;
        v ^= v >> 4;
        v &= 0xf;
-       LOG_DEBUG("parity of 0x%x is %i", ov, (0x6996 >> v) & 1);
+       // LOG_DEBUG("parity of 0x%x is %i", ov, (0x6996 >> v) & 1);
        return (0x6996 >> v) & 1;
 }
 
-static int xscale_load_ic(target_t *target, int mini, uint32_t va, uint32_t buffer[8])
+static int xscale_load_ic(target_t *target, uint32_t va, uint32_t buffer[8])
 {
-       armv4_5_common_t *armv4_5 = target->arch_info;
-       xscale_common_t *xscale = armv4_5->arch_info;
        uint8_t packet[4];
        uint8_t cmd;
        int word;
-
        scan_field_t fields[2];
 
        LOG_DEBUG("loading miniIC at 0x%8.8" PRIx32 "", va);
 
+       /* LDIC into IR */
        jtag_set_end_state(TAP_IDLE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.ldic); /* LDIC */
+       xscale_jtag_set_instr(target->tap, XSCALE_LDIC);
 
-       /* CMD is b010 for Main IC and b011 for Mini IC */
-       if (mini)
-               buf_set_u32(&cmd, 0, 3, 0x3);
-       else
-               buf_set_u32(&cmd, 0, 3, 0x2);
-
-       buf_set_u32(&cmd, 3, 3, 0x0);
+       /* CMD is b011 to load a cacheline into the Mini ICache.
+        * Loading into the main ICache is deprecated, and unused.
+        * It's followed by three zero bits, and 27 address bits.
+        */
+       buf_set_u32(&cmd, 0, 6, 0x3);
 
        /* virtual address of desired cache line */
        buf_set_u32(packet, 0, 27, va >> 5);
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 6;
        fields[0].out_value = &cmd;
-       fields[0].in_value = NULL;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 27;
        fields[1].out_value = packet;
-       fields[1].in_value = NULL;
 
        jtag_add_dr_scan(2, fields, jtag_get_end_state());
 
+       /* rest of packet is a cacheline: 8 instructions, with parity */
        fields[0].num_bits = 32;
        fields[0].out_value = packet;
 
@@ -774,15 +756,12 @@ static int xscale_load_ic(target_t *target, int mini, uint32_t va, uint32_t buff
 
 static int xscale_invalidate_ic_line(target_t *target, uint32_t va)
 {
-       armv4_5_common_t *armv4_5 = target->arch_info;
-       xscale_common_t *xscale = armv4_5->arch_info;
        uint8_t packet[4];
        uint8_t cmd;
-
        scan_field_t fields[2];
 
        jtag_set_end_state(TAP_IDLE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.ldic); /* LDIC */
+       xscale_jtag_set_instr(target->tap, XSCALE_LDIC);
 
        /* CMD for invalidate IC line b000, bits [6:4] b000 */
        buf_set_u32(&cmd, 0, 6, 0x0);
@@ -790,15 +769,15 @@ static int xscale_invalidate_ic_line(target_t *target, uint32_t va)
        /* virtual address of desired cache line */
        buf_set_u32(packet, 0, 27, va >> 5);
 
-       fields[0].tap = xscale->jtag_info.tap;
+       memset(&fields, 0, sizeof fields);
+
+       fields[0].tap = target->tap;
        fields[0].num_bits = 6;
        fields[0].out_value = &cmd;
-       fields[0].in_value = NULL;
 
-       fields[1].tap = xscale->jtag_info.tap;
+       fields[1].tap = target->tap;
        fields[1].num_bits = 27;
        fields[1].out_value = packet;
-       fields[1].in_value = NULL;
 
        jtag_add_dr_scan(2, fields, jtag_get_end_state());
 
@@ -864,8 +843,8 @@ static int xscale_update_vectors(target_t *target)
        xscale_invalidate_ic_line(target, 0x0);
        xscale_invalidate_ic_line(target, 0xffff0000);
 
-       xscale_load_ic(target, 1, 0x0, xscale->low_vectors);
-       xscale_load_ic(target, 1, 0xffff0000, xscale->high_vectors);
+       xscale_load_ic(target, 0x0, xscale->low_vectors);
+       xscale_load_ic(target, 0xffff0000, xscale->high_vectors);
 
        return ERROR_OK;
 }
@@ -911,8 +890,6 @@ static int xscale_arch_state(struct target_s *target)
 static int xscale_poll(target_t *target)
 {
        int retval = ERROR_OK;
-       armv4_5_common_t *armv4_5 = target->arch_info;
-       xscale_common_t *xscale = armv4_5->arch_info;
 
        if ((target->state == TARGET_RUNNING) || (target->state == TARGET_DEBUG_RUNNING))
        {
@@ -921,8 +898,6 @@ static int xscale_poll(target_t *target)
                {
 
                        /* there's data to read from the tx register, we entered debug state */
-                       xscale->handler_running = 1;
-
                        target->state = TARGET_HALTED;
 
                        /* process debug entry, fetching current mode regs */
@@ -1386,8 +1361,6 @@ static int xscale_resume(struct target_s *target, int current,
 
        LOG_DEBUG("target resumed");
 
-       xscale->handler_running = 1;
-
        return ERROR_OK;
 }
 
@@ -1539,7 +1512,7 @@ static int xscale_assert_reset(target_t *target)
         * end up in T-L-R, which would reset JTAG
         */
        jtag_set_end_state(TAP_IDLE);
-       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
+       xscale_jtag_set_instr(target->tap, XSCALE_SELDCSR);
 
        /* set Hold reset, Halt mode and Trap Reset */
        buf_set_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 30, 1, 0x1);
@@ -1547,7 +1520,7 @@ static int xscale_assert_reset(target_t *target)
        xscale_write_dcsr(target, 1, 0);
 
        /* select BYPASS, because having DCSR selected caused problems on the PXA27x */
-       xscale_jtag_set_instr(xscale->jtag_info.tap, 0x7f);
+       xscale_jtag_set_instr(target->tap, 0x7f);
        jtag_execute_queue();
 
        /* assert reset */
@@ -1573,15 +1546,6 @@ static int xscale_deassert_reset(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-
-       fileio_t debug_handler;
-       uint32_t address;
-       uint32_t binary_size;
-
-       uint32_t buf_cnt;
-       uint32_t i;
-       int retval;
-
        breakpoint_t *breakpoint = target->breakpoints;
 
        LOG_DEBUG("-");
@@ -1604,8 +1568,23 @@ static int xscale_deassert_reset(target_t *target)
                breakpoint = breakpoint->next;
        }
 
-       if (!xscale->handler_installed)
+       armv4_5_invalidate_core_regs(target);
+
+       /* FIXME mark hardware watchpoints got unset too.  Also,
+        * at least some of the XScale registers are invalid...
+        */
+
+       /*
+        * REVISIT:  *assumes* we had a SRST+TRST reset so the mini-icache
+        * contents got invalidated.  Safer to force that, so writing new
+        * contents can't ever fail..
+        */
        {
+               uint32_t address;
+               unsigned buf_cnt;
+               const uint8_t *buffer = xscale_debug_handler;
+               int retval;
+
                /* release SRST */
                jtag_add_reset(0, 0);
 
@@ -1620,36 +1599,22 @@ static int xscale_deassert_reset(target_t *target)
                buf_set_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 16, 1, 0x1);
                xscale_write_dcsr(target, 1, 0);
 
-               /* Load debug handler */
-               if (fileio_open(&debug_handler, "xscale/debug_handler.bin", FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
-               {
-                       return ERROR_OK;
-               }
-
-               if ((binary_size = debug_handler.size) % 4)
-               {
-                       LOG_ERROR("debug_handler.bin: size not a multiple of 4");
-                       exit(-1);
-               }
-
-               if (binary_size > 0x800)
-               {
-                       LOG_ERROR("debug_handler.bin: larger than 2kb");
-                       exit(-1);
-               }
-
-               binary_size = CEIL(binary_size, 32) * 32;
-
+               /* Load the debug handler into the mini-icache.  Since
+                * it's using halt mode (not monitor mode), it runs in
+                * "Special Debug State" for access to registers, memory,
+                * coprocessors, trace data, etc.
+                */
                address = xscale->handler_address;
-               while (binary_size > 0)
+               for (unsigned binary_size = sizeof xscale_debug_handler - 1;
+                               binary_size > 0;
+                               binary_size -= buf_cnt, buffer += buf_cnt)
                {
                        uint32_t cache_line[8];
-                       uint8_t buffer[32];
-
-                       if ((retval = fileio_read(&debug_handler, 32, buffer, &buf_cnt)) != ERROR_OK)
-                       {
+                       unsigned i;
 
-                       }
+                       buf_cnt = binary_size;
+                       if (buf_cnt > 32)
+                               buf_cnt = 32;
 
                        for (i = 0; i < buf_cnt; i += 4)
                        {
@@ -1665,15 +1630,23 @@ static int xscale_deassert_reset(target_t *target)
                        /* only load addresses other than the reset vectors */
                        if ((address % 0x400) != 0x0)
                        {
-                               xscale_load_ic(target, 1, address, cache_line);
+                               retval = xscale_load_ic(target, address,
+                                               cache_line);
+                               if (retval != ERROR_OK)
+                                       return retval;
                        }
 
                        address += buf_cnt;
-                       binary_size -= buf_cnt;
                };
 
-               xscale_load_ic(target, 1, 0x0, xscale->low_vectors);
-               xscale_load_ic(target, 1, 0xffff0000, xscale->high_vectors);
+               retval = xscale_load_ic(target, 0x0,
+                                       xscale->low_vectors);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = xscale_load_ic(target, 0xffff0000,
+                                       xscale->high_vectors);
+               if (retval != ERROR_OK)
+                       return retval;
 
                jtag_add_runtest(30, jtag_set_end_state(TAP_IDLE));
 
@@ -1699,12 +1672,6 @@ static int xscale_deassert_reset(target_t *target)
                        /* resume the target */
                        xscale_resume(target, 1, 0x0, 1, 0);
                }
-
-               fileio_close(&debug_handler);
-       }
-       else
-       {
-               jtag_add_reset(0, 0);
        }
 
        return ERROR_OK;
@@ -2948,12 +2915,7 @@ static void xscale_build_reg_cache(target_t *target)
 static int xscale_init_target(struct command_context_s *cmd_ctx,
                struct target_s *target)
 {
-       return ERROR_OK;
-}
-
-static int xscale_quit(void)
-{
-       jtag_add_runtest(100, TAP_RESET);
+       xscale_build_reg_cache(target);
        return ERROR_OK;
 }
 
@@ -2970,34 +2932,31 @@ static int xscale_init_arch_info(target_t *target,
        xscale->arch_info = NULL;
        xscale->common_magic = XSCALE_COMMON_MAGIC;
 
-       /* remember the variant (PXA25x, PXA27x, IXP42x, ...) */
-       xscale->variant = strdup(variant);
-
-       /* prepare JTAG information for the new target */
-       xscale->jtag_info.tap = tap;
-
-       xscale->jtag_info.dbgrx = 0x02;
-       xscale->jtag_info.dbgtx = 0x10;
-       xscale->jtag_info.dcsr = 0x09;
-       xscale->jtag_info.ldic = 0x07;
+       /* we don't really *need* variant info ... */
+       if (variant) {
+               int ir_length = 0;
+
+               if (strcmp(variant, "pxa250") == 0
+                               || strcmp(variant, "pxa255") == 0
+                               || strcmp(variant, "pxa26x") == 0)
+                       ir_length = 5;
+               else if (strcmp(variant, "pxa27x") == 0
+                               || strcmp(variant, "ixp42x") == 0
+                               || strcmp(variant, "ixp45x") == 0
+                               || strcmp(variant, "ixp46x") == 0)
+                       ir_length = 7;
+               else
+                       LOG_WARNING("%s: unrecognized variant %s",
+                               tap->dotted_name, variant);
 
-       if ((strcmp(xscale->variant, "pxa250") == 0) ||
-               (strcmp(xscale->variant, "pxa255") == 0) ||
-               (strcmp(xscale->variant, "pxa26x") == 0))
-       {
-               xscale->jtag_info.ir_length = 5;
-       }
-       else if ((strcmp(xscale->variant, "pxa27x") == 0) ||
-               (strcmp(xscale->variant, "ixp42x") == 0) ||
-               (strcmp(xscale->variant, "ixp45x") == 0) ||
-               (strcmp(xscale->variant, "ixp46x") == 0))
-       {
-               xscale->jtag_info.ir_length = 7;
+               if (ir_length && ir_length != tap->ir_length) {
+                       LOG_WARNING("%s: IR length for %s is %d; fixing",
+                               tap->dotted_name, variant, ir_length);
+                       tap->ir_length = ir_length;
+               }
        }
 
        /* the debug handler isn't installed (and thus not running) at this time */
-       xscale->handler_installed = 0;
-       xscale->handler_running = 0;
        xscale->handler_address = 0xfe000800;
 
        /* clear the vectors we keep locally for reference */
@@ -3066,15 +3025,21 @@ static int xscale_init_arch_info(target_t *target,
        return ERROR_OK;
 }
 
-/* target xscale <endianess> <startup_mode> <chain_pos> <variant> */
 static int xscale_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       xscale_common_t *xscale = calloc(1,sizeof(xscale_common_t));
+       xscale_common_t *xscale;
 
-       xscale_init_arch_info(target, xscale, target->tap, target->variant);
-       xscale_build_reg_cache(target);
+       if (sizeof xscale_debug_handler - 1 > 0x800) {
+               LOG_ERROR("debug_handler.bin: larger than 2kb");
+               return ERROR_FAIL;
+       }
 
-       return ERROR_OK;
+       xscale = calloc(1, sizeof(*xscale));
+       if (!xscale)
+               return ERROR_FAIL;
+
+       return xscale_init_arch_info(target, xscale, target->tap,
+                       target->variant);
 }
 
 static int
@@ -3763,7 +3728,6 @@ target_type_t xscale_target =
        .register_commands = xscale_register_commands,
        .target_create = xscale_target_create,
        .init_target = xscale_init_target,
-       .quit = xscale_quit,
 
        .virt2phys = xscale_virt2phys,
        .mmu = xscale_mmu

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)