Zach Welch <zw@superlucidity.net> fix -Werror warnings
[openocd.git] / src / target / xscale.c
index 39378c01a02baba1ab175ceda4fffe28793e4b60..c3b8d3358822724130cb2109759da7be57c2021f 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2006, 2007 by Dominic Rath                              *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                      *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -53,7 +53,7 @@
 int xscale_register_commands(struct command_context_s *cmd_ctx);
 
 /* forward declarations */
-int xscale_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int xscale_target_create(struct target_s *target, Jim_Interp *interp);
 int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int xscale_quit(void);
 
@@ -115,7 +115,7 @@ target_type_t xscale_target =
        .bulk_write_memory = xscale_bulk_write_memory,
        .checksum_memory = arm7_9_checksum_memory,
        .blank_check_memory = arm7_9_blank_check_memory,
-       
+
        .run_algorithm = armv4_5_run_algorithm,
 
        .add_breakpoint = xscale_add_breakpoint,
@@ -124,10 +124,10 @@ target_type_t xscale_target =
        .remove_watchpoint = xscale_remove_watchpoint,
 
        .register_commands = xscale_register_commands,
-       .target_command = xscale_target_command,
+       .target_create = xscale_target_create,
        .init_target = xscale_init_target,
        .quit = xscale_quit,
-       
+
        .virt2phys = xscale_virt2phys,
        .mmu = xscale_mmu
 };
@@ -212,23 +212,24 @@ int xscale_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, xsc
        return ERROR_OK;
 }
 
-int xscale_jtag_set_instr(int chain_pos, u32 new_instr)
+int xscale_jtag_set_instr(jtag_tap_t *tap, u32 new_instr)
 {
-       jtag_device_t *device = jtag_get_device(chain_pos);
+       if (tap==NULL)
+               return ERROR_FAIL;
 
-       if (buf_get_u32(device->cur_instr, 0, device->ir_length) != new_instr)
+       if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr)
        {
                scan_field_t field;
 
-               field.device = chain_pos;
-               field.num_bits = device->ir_length;
+               field.tap = tap;
+               field.num_bits = tap->ir_length;
                field.out_value = calloc(CEIL(field.num_bits, 8), 1);
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.out_mask = NULL;
                field.in_value = NULL;
-               jtag_set_check_value(&field, device->expected, device->expected_mask, NULL);
+               jtag_set_check_value(&field, tap->expected, tap->expected_mask, NULL);
 
-               jtag_add_ir_scan(1, &field, -1);
+               jtag_add_ir_scan(1, &field, TAP_INVALID);
 
                free(field.out_value);
        }
@@ -251,20 +252,20 @@ int xscale_read_dcsr(target_t *target)
        u8 field2_check_value = 0x0;
        u8 field2_check_mask = 0x1;
 
-       jtag_add_end_state(TAP_PD);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dcsr);
+       jtag_add_end_state(TAP_DRPAUSE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
 
        buf_set_u32(&field0, 1, 1, xscale->hold_rst);
        buf_set_u32(&field0, 2, 1, xscale->external_debug_break);
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0;
        fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
        jtag_set_check_value(fields+0, &field0_check_value, &field0_check_mask, NULL);
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 32;
        fields[1].out_value = NULL;
        fields[1].out_mask = NULL;
@@ -274,14 +275,14 @@ int xscale_read_dcsr(target_t *target)
        fields[1].in_check_value = NULL;
        fields[1].in_check_mask = NULL;
 
-       fields[2].device = xscale->jtag_info.chain_pos;
+       fields[2].tap = xscale->jtag_info.tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        fields[2].out_mask = NULL;
        fields[2].in_value = NULL;
        jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL);
 
-       jtag_add_dr_scan(3, fields, -1);
+       jtag_add_dr_scan(3, fields, TAP_INVALID);
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
        {
@@ -299,9 +300,9 @@ int xscale_read_dcsr(target_t *target)
        fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
        fields[1].in_value = NULL;
 
-       jtag_add_end_state(TAP_RTI);
+       jtag_add_end_state(TAP_IDLE);
 
-       jtag_add_dr_scan(3, fields, -1);
+       jtag_add_dr_scan(3, fields, TAP_INVALID);
 
        /* DANGER!!! this must be here. It will make sure that the arguments
         * to jtag_set_check_value() does not go out of scope! */
@@ -312,12 +313,12 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
 {
        if (num_words==0)
                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;
 
-       enum tap_state path[3];
+       tap_state_t path[3];
        scan_field_t fields[3];
 
        u8 *field0 = malloc(num_words * 1);
@@ -331,18 +332,18 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
 
        int i;
 
-       path[0] = TAP_SDS;
-       path[1] = TAP_CD;
-       path[2] = TAP_SD;
+       path[0] = TAP_DRSELECT;
+       path[1] = TAP_DRCAPTURE;
+       path[2] = TAP_DRSHIFT;
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 3;
        fields[0].out_value = NULL;
        fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
        jtag_set_check_value(fields+0, &field0_check_value, &field0_check_mask, NULL);
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 32;
        fields[1].out_value = NULL;
        fields[1].out_mask = NULL;
@@ -352,18 +353,16 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
        fields[1].in_check_value = NULL;
        fields[1].in_check_mask = NULL;
 
-
-
-       fields[2].device = xscale->jtag_info.chain_pos;
+       fields[2].tap = xscale->jtag_info.tap;
        fields[2].num_bits = 1;
        fields[2].out_value = NULL;
        fields[2].out_mask = NULL;
        fields[2].in_value = NULL;
        jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL);
 
-       jtag_add_end_state(TAP_RTI);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dbgtx);
-       jtag_add_runtest(1, -1); /* ensures that we're in the TAP_RTI state as the above could be a no-op */
+       jtag_add_end_state(TAP_IDLE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgtx);
+       jtag_add_runtest(1, TAP_INVALID); /* ensures that we're in the TAP_IDLE state as the above could be a no-op */
 
        /* repeat until all words have been collected */
        int attempts=0;
@@ -378,7 +377,7 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
                        fields[1].in_handler_priv = (u8*)&field1[i];
 
                        jtag_add_pathmove(3, path);
-                       jtag_add_dr_scan(3, fields, TAP_RTI);
+                       jtag_add_dr_scan(3, fields, TAP_IDLE);
                        words_scheduled++;
                }
 
@@ -412,7 +411,7 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
                                break;
                        }
                }
-               
+
                words_done += words_scheduled;
        }
 
@@ -428,8 +427,8 @@ int xscale_read_tx(target_t *target, int consume)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-       enum tap_state path[3];
-       enum tap_state noconsume_path[6];
+       tap_state_t path[3];
+       tap_state_t noconsume_path[6];
 
        int retval;
        struct timeval timeout, now;
@@ -441,29 +440,29 @@ int xscale_read_tx(target_t *target, int consume)
        u8 field2_check_value = 0x0;
        u8 field2_check_mask = 0x1;
 
-       jtag_add_end_state(TAP_RTI);
+       jtag_add_end_state(TAP_IDLE);
 
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dbgtx);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgtx);
 
-       path[0] = TAP_SDS;
-       path[1] = TAP_CD;
-       path[2] = TAP_SD;
+       path[0] = TAP_DRSELECT;
+       path[1] = TAP_DRCAPTURE;
+       path[2] = TAP_DRSHIFT;
 
-       noconsume_path[0] = TAP_SDS;
-       noconsume_path[1] = TAP_CD;
-       noconsume_path[2] = TAP_E1D;
-       noconsume_path[3] = TAP_PD;
-       noconsume_path[4] = TAP_E2D;
-       noconsume_path[5] = TAP_SD;
-       
-       fields[0].device = xscale->jtag_info.chain_pos;
+       noconsume_path[0] = TAP_DRSELECT;
+       noconsume_path[1] = TAP_DRCAPTURE;
+       noconsume_path[2] = TAP_DREXIT1;
+       noconsume_path[3] = TAP_DRPAUSE;
+       noconsume_path[4] = TAP_DREXIT2;
+       noconsume_path[5] = TAP_DRSHIFT;
+
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 3;
        fields[0].out_value = NULL;
        fields[0].out_mask = NULL;
        fields[0].in_value = &field0_in;
        jtag_set_check_value(fields+0, &field0_check_value, &field0_check_mask, NULL);
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 32;
        fields[1].out_value = NULL;
        fields[1].out_mask = NULL;
@@ -473,9 +472,7 @@ int xscale_read_tx(target_t *target, int consume)
        fields[1].in_check_value = NULL;
        fields[1].in_check_mask = NULL;
 
-
-
-       fields[2].device = xscale->jtag_info.chain_pos;
+       fields[2].tap = xscale->jtag_info.tap;
        fields[2].num_bits = 1;
        fields[2].out_value = NULL;
        fields[2].out_mask = NULL;
@@ -487,42 +484,44 @@ int xscale_read_tx(target_t *target, int consume)
 
        for (;;)
        {
-               int i;
-               for (i=0; i<100; i++)
+               /* if we want to consume the register content (i.e. clear TX_READY),
+                * we have to go straight from Capture-DR to Shift-DR
+                * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
+               */
+               if (consume)
+                       jtag_add_pathmove(3, path);
+               else
                {
-                       /* if we want to consume the register content (i.e. clear TX_READY),
-                        * we have to go straight from Capture-DR to Shift-DR
-                        * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
-                       */
-                       if (consume)
-                               jtag_add_pathmove(3, path);
-                       else
-                       {
-                               jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
-                       }
-       
-                       jtag_add_dr_scan(3, fields, TAP_RTI);
-       
-                       if ((retval = jtag_execute_queue()) != ERROR_OK)
-                       {
-                               LOG_ERROR("JTAG error while reading TX");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-       
-                       gettimeofday(&now, NULL);
-                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
-                       {
-                               LOG_ERROR("time out reading TX register");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-                       if (!((!(field0_in & 1)) && consume))
-                       {
-                               goto done;
-                       }
+                       jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
+               }
+
+               jtag_add_dr_scan(3, fields, TAP_IDLE);
+
+               if ((retval = jtag_execute_queue()) != ERROR_OK)
+               {
+                       LOG_ERROR("JTAG error while reading TX");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+
+               gettimeofday(&now, NULL);
+               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+               {
+                       LOG_ERROR("time out reading TX register");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+               if (!((!(field0_in & 1)) && consume))
+               {
+                       goto done;
                }
-               LOG_DEBUG("waiting 10ms");
-               usleep(10*1000); /* avoid flooding the logs */
-       } 
+               if (debug_level>=3)
+               {
+                       LOG_DEBUG("waiting 100ms");
+                       alive_sleep(100); /* avoid flooding the logs */
+               } else
+               {
+                       keep_alive();
+               }
+       }
        done:
 
        if (!(field0_in & 1))
@@ -548,18 +547,18 @@ int xscale_write_rx(target_t *target)
        u8 field2_check_value = 0x0;
        u8 field2_check_mask = 0x1;
 
-       jtag_add_end_state(TAP_RTI);
+       jtag_add_end_state(TAP_IDLE);
 
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dbgrx);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgrx);
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0_out;
        fields[0].out_mask = NULL;
        fields[0].in_value = &field0_in;
        jtag_set_check_value(fields+0, &field0_check_value, &field0_check_mask, NULL);
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 32;
        fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_RX].value;
        fields[1].out_mask = NULL;
@@ -569,9 +568,7 @@ int xscale_write_rx(target_t *target)
        fields[1].in_check_value = NULL;
        fields[1].in_check_mask = NULL;
 
-
-
-       fields[2].device = xscale->jtag_info.chain_pos;
+       fields[2].tap = xscale->jtag_info.tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        fields[2].out_mask = NULL;
@@ -585,34 +582,36 @@ int xscale_write_rx(target_t *target)
        LOG_DEBUG("polling RX");
        for (;;)
        {
-               int i;
-               for (i=0; i<10; i++)
+               jtag_add_dr_scan(3, fields, TAP_IDLE);
+
+               if ((retval = jtag_execute_queue()) != ERROR_OK)
                {
-                       jtag_add_dr_scan(3, fields, TAP_RTI);
-       
-                       if ((retval = jtag_execute_queue()) != ERROR_OK)
-                       {
-                               LOG_ERROR("JTAG error while writing RX");
-                               return retval;
-                       }
-       
-                       gettimeofday(&now, NULL);
-                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
-                       {
-                               LOG_ERROR("time out writing RX register");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-                       if (!(field0_in & 1))
-                               goto done;
+                       LOG_ERROR("JTAG error while writing RX");
+                       return retval;
+               }
+
+               gettimeofday(&now, NULL);
+               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+               {
+                       LOG_ERROR("time out writing RX register");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+               if (!(field0_in & 1))
+                       goto done;
+               if (debug_level>=3)
+               {
+                       LOG_DEBUG("waiting 100ms");
+                       alive_sleep(100); /* avoid flooding the logs */
+               } else
+               {
+                       keep_alive();
                }
-               LOG_DEBUG("waiting 10ms");
-               usleep(10*1000); /* wait 10ms to avoid flooding the logs */
        }
        done:
-       
+
        /* set rx_valid */
        field2 = 0x1;
-       jtag_add_dr_scan(3, fields, TAP_RTI);
+       jtag_add_dr_scan(3, fields, TAP_IDLE);
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
        {
@@ -634,10 +633,10 @@ int xscale_send(target_t *target, u8 *buffer, int count, int size)
        int retval;
 
        int done_count = 0;
-       
-       jtag_add_end_state(TAP_RTI);
 
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dbgrx);
+       jtag_add_end_state(TAP_IDLE);
+
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dbgrx);
 
        bits[0]=3;
        t[0]=0;
@@ -674,11 +673,11 @@ int xscale_send(target_t *target, u8 *buffer, int count, int size)
                        LOG_ERROR("BUG: size neither 4, 2 nor 1");
                        exit(-1);
                }
-               jtag_add_dr_out(xscale->jtag_info.chain_pos, 
+               jtag_add_dr_out(xscale->jtag_info.tap,
                                3,
                                bits,
                                t,
-                               TAP_RTI);
+                               TAP_IDLE);
                buffer += size;
        }
 
@@ -721,20 +720,20 @@ int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
        if (ext_dbg_brk != -1)
                xscale->external_debug_break = ext_dbg_brk;
 
-       jtag_add_end_state(TAP_RTI);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dcsr);
+       jtag_add_end_state(TAP_IDLE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
 
        buf_set_u32(&field0, 1, 1, xscale->hold_rst);
        buf_set_u32(&field0, 2, 1, xscale->external_debug_break);
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 3;
        fields[0].out_value = &field0;
        fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
        jtag_set_check_value(fields+0, &field0_check_value, &field0_check_mask, NULL);
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 32;
        fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
        fields[1].out_mask = NULL;
@@ -744,16 +743,14 @@ int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
        fields[1].in_check_value = NULL;
        fields[1].in_check_mask = NULL;
 
-
-
-       fields[2].device = xscale->jtag_info.chain_pos;
+       fields[2].tap = xscale->jtag_info.tap;
        fields[2].num_bits = 1;
        fields[2].out_value = &field2;
        fields[2].out_mask = NULL;
        fields[2].in_value = NULL;
        jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL);
 
-       jtag_add_dr_scan(3, fields, -1);
+       jtag_add_dr_scan(3, fields, TAP_INVALID);
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
        {
@@ -791,8 +788,8 @@ int xscale_load_ic(target_t *target, int mini, u32 va, u32 buffer[8])
 
        LOG_DEBUG("loading miniIC at 0x%8.8x", va);
 
-       jtag_add_end_state(TAP_RTI);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.ldic); /* LDIC */
+       jtag_add_end_state(TAP_IDLE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.ldic); /* LDIC */
 
        /* CMD is b010 for Main IC and b011 for Mini IC */
        if (mini)
@@ -805,7 +802,7 @@ int xscale_load_ic(target_t *target, int mini, u32 va, u32 buffer[8])
        /* virtual address of desired cache line */
        buf_set_u32(packet, 0, 27, va >> 5);
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 6;
        fields[0].out_value = &cmd;
        fields[0].out_mask = NULL;
@@ -815,7 +812,7 @@ int xscale_load_ic(target_t *target, int mini, u32 va, u32 buffer[8])
        fields[0].in_handler = NULL;
        fields[0].in_handler_priv = NULL;
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 27;
        fields[1].out_value = packet;
        fields[1].out_mask = NULL;
@@ -825,7 +822,7 @@ int xscale_load_ic(target_t *target, int mini, u32 va, u32 buffer[8])
        fields[1].in_handler = NULL;
        fields[1].in_handler_priv = NULL;
 
-       jtag_add_dr_scan(2, fields, -1);
+       jtag_add_dr_scan(2, fields, TAP_INVALID);
 
        fields[0].num_bits = 32;
        fields[0].out_value = packet;
@@ -837,7 +834,7 @@ int xscale_load_ic(target_t *target, int mini, u32 va, u32 buffer[8])
        {
                buf_set_u32(packet, 0, 32, buffer[word]);
                cmd = parity(*((u32*)packet));
-               jtag_add_dr_scan(2, fields, -1);
+               jtag_add_dr_scan(2, fields, TAP_INVALID);
        }
 
        jtag_execute_queue();
@@ -854,8 +851,8 @@ int xscale_invalidate_ic_line(target_t *target, u32 va)
 
        scan_field_t fields[2];
 
-       jtag_add_end_state(TAP_RTI);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.ldic); /* LDIC */
+       jtag_add_end_state(TAP_IDLE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.ldic); /* LDIC */
 
        /* CMD for invalidate IC line b000, bits [6:4] b000 */
        buf_set_u32(&cmd, 0, 6, 0x0);
@@ -863,7 +860,7 @@ int xscale_invalidate_ic_line(target_t *target, u32 va)
        /* virtual address of desired cache line */
        buf_set_u32(packet, 0, 27, va >> 5);
 
-       fields[0].device = xscale->jtag_info.chain_pos;
+       fields[0].tap = xscale->jtag_info.tap;
        fields[0].num_bits = 6;
        fields[0].out_value = &cmd;
        fields[0].out_mask = NULL;
@@ -873,7 +870,7 @@ int xscale_invalidate_ic_line(target_t *target, u32 va)
        fields[0].in_handler = NULL;
        fields[0].in_handler_priv = NULL;
 
-       fields[1].device = xscale->jtag_info.chain_pos;
+       fields[1].tap = xscale->jtag_info.tap;
        fields[1].num_bits = 27;
        fields[1].out_value = packet;
        fields[1].out_mask = NULL;
@@ -883,7 +880,7 @@ int xscale_invalidate_ic_line(target_t *target, u32 va)
        fields[1].in_handler = NULL;
        fields[1].in_handler_priv = NULL;
 
-       jtag_add_dr_scan(2, fields, -1);
+       jtag_add_dr_scan(2, fields, TAP_INVALID);
 
        return ERROR_OK;
 }
@@ -979,7 +976,7 @@ int xscale_arch_state(struct target_s *target)
                        "MMU: %s, D-Cache: %s, I-Cache: %s"
                        "%s",
                         armv4_5_state_strings[armv4_5->core_state],
-                        target_debug_reason_strings[target->debug_reason],
+                        Jim_Nvp_value2name_simple( nvp_target_debug_reason, target->debug_reason )->name ,
                         armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)],
                         buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32),
                         buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32),
@@ -1017,7 +1014,7 @@ int xscale_poll(target_t *target)
                        /* here we "lie" so GDB won't get stuck and a reset can be perfomed */
                        target->state = TARGET_HALTED;
                }
-               
+
                /* debug_entry could have overwritten target state (i.e. immediate resume)
                 * don't signal event handlers in that case
                 */
@@ -1050,7 +1047,7 @@ int xscale_debug_entry(target_t *target)
        xscale->external_debug_break = 0;
        if ((retval=xscale_read_dcsr(target))!=ERROR_OK)
                return retval;
-       
+
        /* get r0, pc, r1 to r7 and cpsr */
        if ((retval=xscale_receive(target, buffer, 10))!=ERROR_OK)
                return retval;
@@ -1095,10 +1092,10 @@ int xscale_debug_entry(target_t *target)
        else
                armv4_5->core_state = ARMV4_5_STATE_ARM;
 
-       
+
        if (armv4_5_mode_to_number(armv4_5->core_mode)==-1)
                return ERROR_FAIL;
-       
+
        /* get banked registers, r8 to r14, and spsr if not in USR/SYS mode */
        if ((armv4_5->core_mode != ARMV4_5_MODE_USR) && (armv4_5->core_mode != ARMV4_5_MODE_SYS))
        {
@@ -1221,7 +1218,8 @@ int xscale_halt(target_t *target)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
-       LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+       LOG_DEBUG("target->state: %s",
+                 Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name);
 
        if (target->state == TARGET_HALTED)
        {
@@ -1255,6 +1253,7 @@ int xscale_enable_single_step(struct target_s *target, u32 next_pc)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale= armv4_5->arch_info;
        reg_t *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
+       int retval;
 
        if (xscale->ibcr0_used)
        {
@@ -1271,7 +1270,8 @@ int xscale_enable_single_step(struct target_s *target, u32 next_pc)
                }
        }
 
-       xscale_set_reg_u32(ibcr0, next_pc | 0x1);
+       if ((retval=xscale_set_reg_u32(ibcr0, next_pc | 0x1))!=ERROR_OK)
+               return retval;
 
        return ERROR_OK;
 }
@@ -1281,8 +1281,10 @@ int xscale_disable_single_step(struct target_s *target)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale= armv4_5->arch_info;
        reg_t *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
+       int retval;
 
-       xscale_set_reg_u32(ibcr0, 0x0);
+       if ((retval=xscale_set_reg_u32(ibcr0, 0x0))!=ERROR_OK)
+               return retval;
 
        return ERROR_OK;
 }
@@ -1443,101 +1445,129 @@ int xscale_resume(struct target_s *target, int current, u32 address, int handle_
        return ERROR_OK;
 }
 
-int xscale_step(struct target_s *target, int current, u32 address, int handle_breakpoints)
+static int xscale_step_inner(struct target_s *target, int current, u32 address, int handle_breakpoints)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-       breakpoint_t *breakpoint = target->breakpoints;
 
-       u32 current_pc, next_pc;
-       int i;
+       u32 next_pc;
        int retval;
-
-       if (target->state != TARGET_HALTED)
-       {
-               LOG_WARNING("target not halted");
-               return ERROR_TARGET_NOT_HALTED;
-       }
-
-       /* current = 1: continue on current pc, otherwise continue at <address> */
-       if (!current)
-               buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
-
-       current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
-
-       /* if we're at the reset vector, we have to simulate the step */
-       if (current_pc == 0x0)
-       {
-               arm_simulate_step(target, NULL);
-               current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
-
-               target->debug_reason = DBG_REASON_SINGLESTEP;
-               target_call_event_callbacks(target, TARGET_EVENT_HALTED);
-
-               return ERROR_OK;
-       }
-
-       /* the front-end may request us not to handle breakpoints */
-       if (handle_breakpoints)
-               if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
-               {
-                       xscale_unset_breakpoint(target, breakpoint);
-               }
+       int i;
 
        target->debug_reason = DBG_REASON_SINGLESTEP;
 
        /* calculate PC of next instruction */
        if ((retval = arm_simulate_step(target, &next_pc)) != ERROR_OK)
        {
-               u32 current_opcode;
+               u32 current_opcode, current_pc;
+               current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
+
                target_read_u32(target, current_pc, &current_opcode);
                LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8x", current_opcode);
+               return retval;
        }
 
        LOG_DEBUG("enable single-step");
-       xscale_enable_single_step(target, next_pc);
+       if ((retval=xscale_enable_single_step(target, next_pc))!=ERROR_OK)
+               return retval;
 
        /* restore banked registers */
-       xscale_restore_context(target);
+       if ((retval=xscale_restore_context(target))!=ERROR_OK)
+               return retval;
 
        /* send resume request (command 0x30 or 0x31)
         * clean the trace buffer if it is to be enabled (0x62) */
        if (xscale->trace.buffer_enabled)
        {
-               xscale_send_u32(target, 0x62);
-               xscale_send_u32(target, 0x31);
+               if ((retval=xscale_send_u32(target, 0x62))!=ERROR_OK)
+                       return retval;
+               if ((retval=xscale_send_u32(target, 0x31))!=ERROR_OK)
+                       return retval;
        }
        else
-               xscale_send_u32(target, 0x30);
+               if ((retval=xscale_send_u32(target, 0x30))!=ERROR_OK)
+                       return retval;
 
        /* send CPSR */
-       xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+       if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32)))!=ERROR_OK)
+               return retval;
        LOG_DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
 
        for (i = 7; i >= 0; i--)
        {
                /* send register */
-               xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32));
+               if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32)))!=ERROR_OK)
+                       return retval;
                LOG_DEBUG("writing r%i with value 0x%8.8x", i, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32));
        }
 
        /* send PC */
-       xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
+       if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32)))!=ERROR_OK)
+               return retval;
        LOG_DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
 
        target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
 
        /* registers are now invalid */
-       armv4_5_invalidate_core_regs(target);
+       if ((retval=armv4_5_invalidate_core_regs(target))!=ERROR_OK)
+               return retval;
 
        /* wait for and process debug entry */
-       xscale_debug_entry(target);
+       if ((retval=xscale_debug_entry(target))!=ERROR_OK)
+               return retval;
 
        LOG_DEBUG("disable single-step");
-       xscale_disable_single_step(target);
+       if ((retval=xscale_disable_single_step(target))!=ERROR_OK)
+               return retval;
 
        target_call_event_callbacks(target, TARGET_EVENT_HALTED);
 
+       return ERROR_OK;
+}
+
+int xscale_step(struct target_s *target, int current, u32 address, int handle_breakpoints)
+{
+       armv4_5_common_t *armv4_5 = target->arch_info;
+       breakpoint_t *breakpoint = target->breakpoints;
+
+       u32 current_pc;
+       int retval;
+
+       if (target->state != TARGET_HALTED)
+       {
+               LOG_WARNING("target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
+       /* current = 1: continue on current pc, otherwise continue at <address> */
+       if (!current)
+               buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
+
+       current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
+
+       /* if we're at the reset vector, we have to simulate the step */
+       if (current_pc == 0x0)
+       {
+               if ((retval=arm_simulate_step(target, NULL))!=ERROR_OK)
+                       return retval;
+               current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
+
+               target->debug_reason = DBG_REASON_SINGLESTEP;
+               target_call_event_callbacks(target, TARGET_EVENT_HALTED);
+
+               return ERROR_OK;
+       }
+
+       /* the front-end may request us not to handle breakpoints */
+       if (handle_breakpoints)
+               if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
+               {
+                       if ((retval=xscale_unset_breakpoint(target, breakpoint))!=ERROR_OK)
+                               return retval;
+               }
+
+       retval = xscale_step_inner(target, current, address, handle_breakpoints);
+
        if (breakpoint)
        {
                xscale_set_breakpoint(target, breakpoint);
@@ -1554,13 +1584,14 @@ int xscale_assert_reset(target_t *target)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
-       LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+       LOG_DEBUG("target->state: %s",
+                 Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name);
 
        /* select DCSR instruction (set endstate to R-T-I to ensure we don't
         * end up in T-L-R, which would reset JTAG
         */
-       jtag_add_end_state(TAP_RTI);
-       xscale_jtag_set_instr(xscale->jtag_info.chain_pos, xscale->jtag_info.dcsr);
+       jtag_add_end_state(TAP_IDLE);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, xscale->jtag_info.dcsr);
 
        /* set Hold reset, Halt mode and Trap Reset */
        buf_set_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 30, 1, 0x1);
@@ -1568,7 +1599,7 @@ 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.chain_pos, 0x7f);
+       xscale_jtag_set_instr(xscale->jtag_info.tap, 0x7f);
        jtag_execute_queue();
 
        /* assert reset */
@@ -1582,7 +1613,7 @@ int xscale_assert_reset(target_t *target)
 
     if (target->reset_halt)
     {
-       int retval;
+       int retval;
                if ((retval = target_halt(target))!=ERROR_OK)
                        return retval;
     }
@@ -1600,7 +1631,7 @@ int xscale_deassert_reset(target_t *target)
        u32 binary_size;
 
        u32 buf_cnt;
-       int i;
+       u32 i;
        int retval;
 
        breakpoint_t *breakpoint = target->breakpoints;
@@ -1633,7 +1664,7 @@ int xscale_deassert_reset(target_t *target)
                /* wait 300ms; 150 and 100ms were not enough */
                jtag_add_sleep(300*1000);
 
-               jtag_add_runtest(2030, TAP_RTI);
+               jtag_add_runtest(2030, TAP_IDLE);
                jtag_execute_queue();
 
                /* set Hold reset, Halt mode and Trap Reset */
@@ -1669,7 +1700,7 @@ int xscale_deassert_reset(target_t *target)
 
                        if ((retval = fileio_read(&debug_handler, 32, buffer, &buf_cnt)) != ERROR_OK)
                        {
-                               
+
                        }
 
                        for (i = 0; i < buf_cnt; i += 4)
@@ -1680,7 +1711,7 @@ int xscale_deassert_reset(target_t *target)
 
                        for (; buf_cnt < 32; buf_cnt += 4)
                        {
-                                       cache_line[buf_cnt / 4] = 0xe1a08008;
+                               cache_line[buf_cnt / 4] = 0xe1a08008;
                        }
 
                        /* only load addresses other than the reset vectors */
@@ -1696,7 +1727,7 @@ int xscale_deassert_reset(target_t *target)
                xscale_load_ic(target, 1, 0x0, xscale->low_vectors);
                xscale_load_ic(target, 1, 0xffff0000, xscale->high_vectors);
 
-               jtag_add_runtest(30, TAP_RTI);
+               jtag_add_runtest(30, TAP_IDLE);
 
                jtag_add_sleep(100000);
 
@@ -1728,19 +1759,16 @@ int xscale_deassert_reset(target_t *target)
                jtag_add_reset(0, 0);
        }
 
-
        return ERROR_OK;
 }
 
 int xscale_soft_reset_halt(struct target_s *target)
 {
-
        return ERROR_OK;
 }
 
 int xscale_read_core_reg(struct target_s *target, int num, enum armv4_5_mode mode)
 {
-
        return ERROR_OK;
 }
 
@@ -1900,7 +1928,7 @@ int xscale_read_memory(struct target_s *target, u32 address, u32 size, u32 count
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
        u32 *buf32;
-       int i;
+       u32 i;
        int retval;
 
        LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
@@ -2136,6 +2164,7 @@ void xscale_enable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_ca
 
 int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
 {
+       int retval;
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
@@ -2145,9 +2174,6 @@ int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       if (xscale->force_hw_bkpts)
-               breakpoint->type = BKPT_HARD;
-
        if (breakpoint->set)
        {
                LOG_WARNING("breakpoint already set");
@@ -2180,22 +2206,33 @@ int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                if (breakpoint->length == 4)
                {
                        /* keep the original instruction in target endianness */
-                       target->type->read_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
+                       if((retval = target->type->read_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                        /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
-                       target_write_u32(target, breakpoint->address, xscale->arm_bkpt);
+                       if((retval = target_write_u32(target, breakpoint->address, xscale->arm_bkpt)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
                else
                {
                        /* keep the original instruction in target endianness */
-                       target->type->read_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
+                       if((retval = target->type->read_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                        /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
-                       target_write_u32(target, breakpoint->address, xscale->thumb_bkpt);
+                       if((retval = target_write_u32(target, breakpoint->address, xscale->thumb_bkpt)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
                breakpoint->set = 1;
        }
 
        return ERROR_OK;
-
 }
 
 int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
@@ -2209,21 +2246,11 @@ int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       if (xscale->force_hw_bkpts)
-       {
-               LOG_DEBUG("forcing use of hardware breakpoint at address 0x%8.8x", breakpoint->address);
-               breakpoint->type = BKPT_HARD;
-       }
-
        if ((breakpoint->type == BKPT_HARD) && (xscale->ibcr_available < 1))
        {
                LOG_INFO("no breakpoint unit available for hardware breakpoint");
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
        }
-       else
-       {
-               xscale->ibcr_available--;
-       }
 
        if ((breakpoint->length != 2) && (breakpoint->length != 4))
        {
@@ -2231,11 +2258,17 @@ int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
        }
 
+       if (breakpoint->type == BKPT_HARD)
+       {
+               xscale->ibcr_available--;
+       }
+
        return ERROR_OK;
 }
 
 int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
 {
+       int retval;
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
@@ -2270,11 +2303,17 @@ int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                /* restore original instruction (kept in target endianness) */
                if (breakpoint->length == 4)
                {
-                       target->type->write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
+                       if((retval = target->type->write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
                else
                {
-                       target->type->write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
+                       if((retval = target->type->write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
                breakpoint->set = 0;
        }
@@ -2894,7 +2933,7 @@ int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
                                                (((instruction.type == ARM_B) ||
                                                        (instruction.type == ARM_BL) ||
                                                        (instruction.type == ARM_BLX)) &&
-                                                       (instruction.info.b_bl_bx_blx.target_address != -1)))
+                                                       (instruction.info.b_bl_bx_blx.target_address != ~0UL)))
                                        {
                                                xscale->trace.current_pc = instruction.info.b_bl_bx_blx.target_address;
                                        }
@@ -2991,11 +3030,10 @@ int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *targe
 
 int xscale_quit(void)
 {
-
        return ERROR_OK;
 }
 
-int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_pos, char *variant)
+int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, jtag_tap_t *tap, const char *variant)
 {
        armv4_5_common_t *armv4_5;
        u32 high_reset_branch, low_reset_branch;
@@ -3011,7 +3049,7 @@ int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_p
        xscale->variant = strdup(variant);
 
        /* prepare JTAG information for the new target */
-       xscale->jtag_info.chain_pos = chain_pos;
+       xscale->jtag_info.tap = tap;
 
        xscale->jtag_info.dbgrx = 0x02;
        xscale->jtag_info.dbgtx = 0x10;
@@ -3064,8 +3102,6 @@ int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_p
        xscale->hold_rst = 0;
        xscale->external_debug_break = 0;
 
-       xscale->force_hw_bkpts = 1;
-
        xscale->ibcr_available = 2;
        xscale->ibcr0_used = 0;
        xscale->ibcr1_used = 0;
@@ -3101,29 +3137,16 @@ int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_p
        xscale->armv4_5_mmu.enable_mmu_caches = xscale_enable_mmu_caches;
        xscale->armv4_5_mmu.has_tiny_pages = 1;
        xscale->armv4_5_mmu.mmu_enabled = 0;
-       
+
        return ERROR_OK;
 }
 
 /* target xscale <endianess> <startup_mode> <chain_pos> <variant> */
-int xscale_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int xscale_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       xscale_common_t *xscale = malloc(sizeof(xscale_common_t));
-       memset(xscale, 0, sizeof(*xscale));
-
-       if (argc < 5)
-       {
-               LOG_ERROR("'target xscale' requires four arguments: <endianess> <startup_mode> <chain_pos> <variant>");
-               return ERROR_OK;
-       }
-
-       chain_pos = strtoul(args[3], NULL, 0);
-
-       variant = args[4];
+       xscale_common_t *xscale = calloc(1,sizeof(xscale_common_t));
 
-       xscale_init_arch_info(target, xscale, chain_pos, variant);
+       xscale_init_arch_info(target, xscale, target->tap, target->variant);
        xscale_build_reg_cache(target);
 
        return ERROR_OK;
@@ -3146,12 +3169,12 @@ int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char
        if ((target = get_target_by_num(strtoul(args[0], NULL, 0))) == NULL)
        {
                LOG_ERROR("no target '%s' configured", args[0]);
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
 
        if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK)
        {
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
 
        handler_address = strtoul(args[1], NULL, 0);
@@ -3164,6 +3187,7 @@ int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char
        else
        {
                LOG_ERROR("xscale debug_handler <address> must be between 0x800 and 0x1fef800 or between 0xfe000800 and 0xfffff800");
+               return ERROR_FAIL;
        }
 
        return ERROR_OK;
@@ -3179,19 +3203,18 @@ int xscale_handle_cache_clean_address_command(struct command_context_s *cmd_ctx,
 
        if (argc < 2)
        {
-               LOG_ERROR("'xscale cache_clean_address <target#> <address>' command takes two required operands");
-               return ERROR_OK;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        if ((target = get_target_by_num(strtoul(args[0], NULL, 0))) == NULL)
        {
                LOG_ERROR("no target '%s' configured", args[0]);
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
 
        if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK)
        {
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
 
        cache_clean_address = strtoul(args[1], NULL, 0);
@@ -3231,8 +3254,7 @@ static int xscale_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
        u32 cb;
        int domain;
        u32 ap;
-       
-       
+
        if ((retval = xscale_get_arch_pointers(target, &armv4_5, &xscale)) != ERROR_OK)
        {
                return retval;
@@ -3250,7 +3272,7 @@ static int xscale_mmu(struct target_s *target, int *enabled)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-       
+
        if (target->state != TARGET_HALTED)
        {
                LOG_ERROR("Target not halted");
@@ -3260,7 +3282,6 @@ static int xscale_mmu(struct target_s *target, int *enabled)
        return ERROR_OK;
 }
 
-
 int xscale_handle_mmu_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
@@ -3346,7 +3367,7 @@ int xscale_handle_idcache_command(command_context_t *cmd_ctx, char *cmd, char **
                command_print(cmd_ctx, "icache %s", (xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled) ? "enabled" : "disabled");
 
        if (dcache)
-               command_print(cmd_ctx, "dcache %s", (xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled) ? "enabled" : "disabled");
+               command_print(cmd_ctx, "dcache %s", (xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled) ? "enabled" : "disabled");
 
        return ERROR_OK;
 }
@@ -3378,34 +3399,6 @@ int xscale_handle_vector_catch_command(command_context_t *cmd_ctx, char *cmd, ch
        return ERROR_OK;
 }
 
-int xscale_handle_force_hw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       target_t *target = get_current_target(cmd_ctx);
-       armv4_5_common_t *armv4_5;
-       xscale_common_t *xscale;
-
-       if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK)
-       {
-               return ERROR_OK;
-       }
-
-       if ((argc >= 1) && (strcmp("enable", args[0]) == 0))
-       {
-               xscale->force_hw_bkpts = 1;
-       }
-       else if ((argc >= 1) && (strcmp("disable", args[0]) == 0))
-       {
-               xscale->force_hw_bkpts = 0;
-       }
-       else
-       {
-               command_print(cmd_ctx, "usage: xscale force_hw_bkpts <enable|disable>");
-       }
-
-       command_print(cmd_ctx, "force hardware breakpoints %s", (xscale->force_hw_bkpts) ? "enabled" : "disabled");
-
-       return ERROR_OK;
-}
 
 int xscale_handle_trace_buffer_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
@@ -3616,12 +3609,12 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
        target_t *target = get_current_target(cmd_ctx);
        armv4_5_common_t *armv4_5;
        xscale_common_t *xscale;
-       
+
        if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK)
        {
                return ERROR_OK;
        }
-       
+
        if (target->state != TARGET_HALTED)
        {
                command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
@@ -3643,7 +3636,7 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
                        break;
                case 2:
                        reg_no = XSCALE_TTB;
-                       break; 
+                       break;
                case 3:
                        reg_no = XSCALE_DAC;
                        break;
@@ -3664,39 +3657,39 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
                        return ERROR_INVALID_ARGUMENTS;
                }
                reg = &xscale->reg_cache->reg_list[reg_no];
-               
+
        }
        if(argc == 1)
        {
                u32 value;
-               
+
                /* read cp15 control register */
                xscale_get_reg(reg);
                value = buf_get_u32(reg->value, 0, 32);
                command_print(cmd_ctx, "%s (/%i): 0x%x", reg->name, reg->size, value);
        }
        else if(argc == 2)
-       {   
+       {
 
                u32 value = strtoul(args[1], NULL, 0);
-               
+
                /* send CP write request (command 0x41) */
                xscale_send_u32(target, 0x41);
-               
+
                /* send CP register number */
                xscale_send_u32(target, reg_no);
-               
+
                /* send CP register value */
                xscale_send_u32(target, value);
-               
+
                /* execute cpwait to ensure outstanding operations complete */
                xscale_send_u32(target, 0x53);
        }
        else
        {
-               command_print(cmd_ctx, "usage: cp15 [register]<, [value]>");    
+               command_print(cmd_ctx, "usage: cp15 [register]<, [value]>");
        }
-       
+
        return ERROR_OK;
 }
 
@@ -3714,7 +3707,7 @@ int xscale_register_commands(struct command_context_s *cmd_ctx)
        register_command(cmd_ctx, xscale_cmd, "icache", xscale_handle_idcache_command, COMMAND_EXEC, "['enable'|'disable'] the ICache");
        register_command(cmd_ctx, xscale_cmd, "dcache", xscale_handle_idcache_command, COMMAND_EXEC, "['enable'|'disable'] the DCache");
 
-       register_command(cmd_ctx, xscale_cmd, "vector_catch", xscale_handle_idcache_command, COMMAND_EXEC, "<mask> of vectors that should be catched");
+       register_command(cmd_ctx, xscale_cmd, "vector_catch", xscale_handle_vector_catch_command, COMMAND_EXEC, "<mask> of vectors that should be catched");
 
        register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable|disable> ['fill' [n]|'wrap']");
 
@@ -3724,7 +3717,7 @@ int xscale_register_commands(struct command_context_s *cmd_ctx)
                COMMAND_EXEC, "load image from <file> [base address]");
 
        register_command(cmd_ctx, xscale_cmd, "cp15", xscale_handle_cp15, COMMAND_EXEC, "access coproc 15 <register> [value]");
-       
+
        armv4_5_register_commands(cmd_ctx);
 
        return ERROR_OK;

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)