xscale_load_ic cleanup
[openocd.git] / src / target / xscale.c
index 58679bb479368394d5646f068089e10f757e6daf..f245a206aefbbad450d8540df24cdbdb3064c360 100644 (file)
@@ -2,9 +2,12 @@
  *   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                                               *
  *                                                                         *
+ *   Copyright (C) 2009 Michael Schwingen                                  *
+ *   michael@schwingen.org                                                 *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
 #include "time_support.h"
 #include "image.h"
 
-/* cli handling */
-int xscale_register_commands(struct command_context_s *cmd_ctx);
-
-/* forward declarations */
-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);
-
-int xscale_arch_state(struct target_s *target);
-int xscale_poll(target_t *target);
-int xscale_halt(target_t *target);
-int xscale_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution);
-int xscale_step(struct target_s *target, int current, uint32_t address, int handle_breakpoints);
-int xscale_debug_entry(target_t *target);
-int xscale_restore_context(target_t *target);
-
-int xscale_assert_reset(target_t *target);
-int xscale_deassert_reset(target_t *target);
-int xscale_soft_reset_halt(struct target_s *target);
-
-int xscale_set_reg_u32(reg_t *reg, uint32_t value);
-
-int xscale_read_core_reg(struct target_s *target, int num, enum armv4_5_mode mode);
-int xscale_write_core_reg(struct target_s *target, int num, enum armv4_5_mode mode, uint32_t value);
-
-int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-int xscale_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-int xscale_bulk_write_memory(target_t *target, uint32_t address, uint32_t count, uint8_t *buffer);
-
-int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
-int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
-int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
-int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
-int xscale_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
-int xscale_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
-void xscale_enable_watchpoints(struct target_s *target);
-void xscale_enable_breakpoints(struct target_s *target);
-static int xscale_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical);
-static int xscale_mmu(struct target_s *target, int *enabled);
-
-int xscale_read_trace(target_t *target);
-
-target_type_t xscale_target =
-{
-       .name = "xscale",
-
-       .poll = xscale_poll,
-       .arch_state = xscale_arch_state,
-
-       .target_request_data = NULL,
-
-       .halt = xscale_halt,
-       .resume = xscale_resume,
-       .step = xscale_step,
-
-       .assert_reset = xscale_assert_reset,
-       .deassert_reset = xscale_deassert_reset,
-       .soft_reset_halt = xscale_soft_reset_halt,
-
-       .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
-
-       .read_memory = xscale_read_memory,
-       .write_memory = xscale_write_memory,
-       .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,
+/*
+ * Important XScale documents available as of October 2009 include:
+ *
+ *  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.
+ *
+ *  Hot-Debug for Intel XScale® Core Debug White Paper, May 2005
+ *             Document Number: 273539-005
+ *     Less detailed than the developer's manual, but summarizes those
+ *     missing details (for most XScales) and gives LOTS of notes about
+ *     debugger/handler interaction issues.  Presents a simpler reset
+ *     and load-handler sequence than the arch doc.  (Note, OpenOCD
+ *     doesn't currently support "Hot-Debug" as defined there.)
+ *
+ * Chip-specific microarchitecture documents may also be useful.
+ */
 
-       .add_breakpoint = xscale_add_breakpoint,
-       .remove_breakpoint = xscale_remove_breakpoint,
-       .add_watchpoint = xscale_add_watchpoint,
-       .remove_watchpoint = xscale_remove_watchpoint,
 
-       .register_commands = xscale_register_commands,
-       .target_create = xscale_target_create,
-       .init_target = xscale_init_target,
-       .quit = xscale_quit,
+/* forward declarations */
+static int xscale_resume(struct target_s *, int current,
+       uint32_t address, int handle_breakpoints, int debug_execution);
+static int xscale_debug_entry(target_t *);
+static int xscale_restore_context(target_t *);
+static int xscale_get_reg(reg_t *reg);
+static int xscale_set_reg(reg_t *reg, uint8_t *buf);
+static int xscale_set_breakpoint(struct target_s *, breakpoint_t *);
+static int xscale_set_watchpoint(struct target_s *, watchpoint_t *);
+static int xscale_unset_breakpoint(struct target_s *, breakpoint_t *);
+static int xscale_read_trace(target_t *);
 
-       .virt2phys = xscale_virt2phys,
-       .mmu = xscale_mmu
-};
 
-char* xscale_reg_list[] =
+static char *const xscale_reg_list[] =
 {
        "XSCALE_MAINID",                /* 0 */
        "XSCALE_CACHETYPE",
@@ -141,7 +95,7 @@ char* xscale_reg_list[] =
        "XSCALE_TXRXCTRL",
 };
 
-xscale_reg_t xscale_reg_arch_info[] =
+static const xscale_reg_t xscale_reg_arch_info[] =
 {
        {XSCALE_MAINID, NULL},
        {XSCALE_CACHETYPE, NULL},
@@ -167,12 +121,21 @@ xscale_reg_t xscale_reg_arch_info[] =
        {-1, NULL}, /* TXRXCTRL implicit access via JTAG */
 };
 
-int xscale_reg_arch_type = -1;
+static int xscale_reg_arch_type = -1;
 
-int xscale_get_reg(reg_t *reg);
-int xscale_set_reg(reg_t *reg, uint8_t *buf);
+/* convenience wrapper to access XScale specific registers */
+static int xscale_set_reg_u32(reg_t *reg, uint32_t value)
+{
+       uint8_t buf[4];
+
+       buf_set_u32(buf, 0, 32, value);
+
+       return xscale_set_reg(reg, buf);
+}
 
-int xscale_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, xscale_common_t **xscale_p)
+
+static int xscale_get_arch_pointers(target_t *target,
+               armv4_5_common_t **armv4_5_p, xscale_common_t **xscale_p)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -195,9 +158,9 @@ int xscale_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, xsc
        return ERROR_OK;
 }
 
-int xscale_jtag_set_instr(jtag_tap_t *tap, uint32_t new_instr)
+static int xscale_jtag_set_instr(jtag_tap_t *tap, uint32_t new_instr)
 {
-       if (tap==NULL)
+       if (tap == NULL)
                return ERROR_FAIL;
 
        if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr)
@@ -223,7 +186,7 @@ int xscale_jtag_set_instr(jtag_tap_t *tap, uint32_t new_instr)
        return ERROR_OK;
 }
 
-int xscale_read_dcsr(target_t *target)
+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;
@@ -255,7 +218,6 @@ int xscale_read_dcsr(target_t *target)
        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].num_bits = 1;
        fields[2].out_value = &field2;
@@ -264,8 +226,8 @@ int xscale_read_dcsr(target_t *target)
 
        jtag_add_dr_scan(3, fields, jtag_get_end_state());
 
-       jtag_check_value_mask(fields+0, &field0_check_value, &field0_check_mask);
-       jtag_check_value_mask(fields+2, &field2_check_value, &field2_check_mask);
+       jtag_check_value_mask(fields + 0, &field0_check_value, &field0_check_mask);
+       jtag_check_value_mask(fields + 2, &field2_check_value, &field2_check_mask);
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
        {
@@ -295,16 +257,16 @@ int xscale_read_dcsr(target_t *target)
 
 static void xscale_getbuf(jtag_callback_data_t arg)
 {
-  uint8_t *in=(uint8_t *)arg;
-       *((uint32_t *)in)=buf_get_u32(in, 0, 32);
+       uint8_t *in = (uint8_t *)arg;
+       *((uint32_t *)in) = buf_get_u32(in, 0, 32);
 }
 
-int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
+static int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
 {
-       if (num_words==0)
+       if (num_words == 0)
                return ERROR_INVALID_ARGUMENTS;
 
-       int retval=ERROR_OK;
+       int retval = ERROR_OK;
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
@@ -351,7 +313,7 @@ int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
        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 */
-       int attempts=0;
+       int attempts = 0;
        while (words_done < num_words)
        {
                /* schedule reads */
@@ -362,11 +324,11 @@ int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
 
                        jtag_add_pathmove(3, path);
 
-                       fields[1].in_value = (uint8_t *)(field1+i);
+                       fields[1].in_value = (uint8_t *)(field1 + i);
 
                        jtag_add_dr_scan_check(3, fields, jtag_set_end_state(TAP_IDLE));
 
-                       jtag_add_callback(xscale_getbuf, (jtag_callback_data_t)(field1+i));
+                       jtag_add_callback(xscale_getbuf, (jtag_callback_data_t)(field1 + i));
 
                        words_scheduled++;
                }
@@ -386,18 +348,18 @@ int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
                                int j;
                                for (j = i; j < num_words - 1; j++)
                                {
-                                       field0[j] = field0[j+1];
-                                       field1[j] = field1[j+1];
+                                       field0[j] = field0[j + 1];
+                                       field1[j] = field1[j + 1];
                                }
                                words_scheduled--;
                        }
                }
-               if (words_scheduled==0)
+               if (words_scheduled == 0)
                {
                        if (attempts++==1000)
                        {
                                LOG_ERROR("Failed to receiving data from debug handler after 1000 attempts");
-                               retval=ERROR_TARGET_TIMEOUT;
+                               retval = ERROR_TARGET_TIMEOUT;
                                break;
                        }
                }
@@ -413,7 +375,7 @@ int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
        return retval;
 }
 
-int xscale_read_tx(target_t *target, int consume)
+static 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;
@@ -455,7 +417,6 @@ int xscale_read_tx(target_t *target, int consume)
        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].num_bits = 1;
        fields[2].out_value = NULL;
@@ -480,8 +441,8 @@ int xscale_read_tx(target_t *target, int consume)
 
                jtag_add_dr_scan(3, fields, jtag_set_end_state(TAP_IDLE));
 
-               jtag_check_value_mask(fields+0, &field0_check_value, &field0_check_mask);
-               jtag_check_value_mask(fields+2, &field2_check_value, &field2_check_mask);
+               jtag_check_value_mask(fields + 0, &field0_check_value, &field0_check_mask);
+               jtag_check_value_mask(fields + 2, &field2_check_value, &field2_check_mask);
 
                if ((retval = jtag_execute_queue()) != ERROR_OK)
                {
@@ -499,7 +460,7 @@ int xscale_read_tx(target_t *target, int consume)
                {
                        goto done;
                }
-               if (debug_level>=3)
+               if (debug_level >= 3)
                {
                        LOG_DEBUG("waiting 100ms");
                        alive_sleep(100); /* avoid flooding the logs */
@@ -516,7 +477,7 @@ int xscale_read_tx(target_t *target, int consume)
        return ERROR_OK;
 }
 
-int xscale_write_rx(target_t *target)
+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;
@@ -547,7 +508,6 @@ int xscale_write_rx(target_t *target)
        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].num_bits = 1;
        fields[2].out_value = &field2;
@@ -563,8 +523,8 @@ int xscale_write_rx(target_t *target)
        {
                jtag_add_dr_scan(3, fields, jtag_set_end_state(TAP_IDLE));
 
-               jtag_check_value_mask(fields+0, &field0_check_value, &field0_check_mask);
-               jtag_check_value_mask(fields+2, &field2_check_value, &field2_check_mask);
+               jtag_check_value_mask(fields + 0, &field0_check_value, &field0_check_mask);
+               jtag_check_value_mask(fields + 2, &field2_check_value, &field2_check_mask);
 
                if ((retval = jtag_execute_queue()) != ERROR_OK)
                {
@@ -580,7 +540,7 @@ int xscale_write_rx(target_t *target)
                }
                if (!(field0_in & 1))
                        goto done;
-               if (debug_level>=3)
+               if (debug_level >= 3)
                {
                        LOG_DEBUG("waiting 100ms");
                        alive_sleep(100); /* avoid flooding the logs */
@@ -605,7 +565,7 @@ int xscale_write_rx(target_t *target)
 }
 
 /* send count elements of size byte to the debug handler */
-int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
+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;
@@ -672,7 +632,7 @@ int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
        return ERROR_OK;
 }
 
-int xscale_send_u32(target_t *target, uint32_t value)
+static int xscale_send_u32(target_t *target, uint32_t value)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -681,7 +641,7 @@ int xscale_send_u32(target_t *target, uint32_t value)
        return xscale_write_rx(target);
 }
 
-int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
+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;
@@ -719,7 +679,6 @@ int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
        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].num_bits = 1;
        fields[2].out_value = &field2;
@@ -728,8 +687,8 @@ int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
 
        jtag_add_dr_scan(3, fields, jtag_get_end_state());
 
-       jtag_check_value_mask(fields+0, &field0_check_value, &field0_check_mask);
-       jtag_check_value_mask(fields+2, &field2_check_value, &field2_check_mask);
+       jtag_check_value_mask(fields + 0, &field0_check_value, &field0_check_mask);
+       jtag_check_value_mask(fields + 2, &field2_check_value, &field2_check_mask);
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
        {
@@ -744,18 +703,18 @@ 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 */
-unsigned int parity (unsigned int v)
+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;
 }
 
-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;
@@ -765,18 +724,17 @@ int xscale_load_ic(target_t *target, int mini, uint32_t va, uint32_t buffer[8])
 
        scan_field_t fields[2];
 
-       LOG_DEBUG("loading miniIC at 0x%8.8x", va);
+       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(xscale->jtag_info.tap, xscale->jtag_info.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);
@@ -784,25 +742,16 @@ int xscale_load_ic(target_t *target, int mini, uint32_t va, uint32_t buffer[8])
        fields[0].tap = xscale->jtag_info.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].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;
 
@@ -820,12 +769,10 @@ int xscale_load_ic(target_t *target, int mini, uint32_t va, uint32_t buffer[8])
                jtag_add_dr_scan(2, fields, jtag_get_end_state());
        }
 
-       jtag_execute_queue();
-
-       return ERROR_OK;
+       return jtag_execute_queue();
 }
 
-int xscale_invalidate_ic_line(target_t *target, uint32_t va)
+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;
@@ -846,29 +793,19 @@ int xscale_invalidate_ic_line(target_t *target, uint32_t va)
        fields[0].tap = xscale->jtag_info.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].num_bits = 27;
        fields[1].out_value = packet;
-
        fields[1].in_value = NULL;
 
-
-
-
-
        jtag_add_dr_scan(2, fields, jtag_get_end_state());
 
        return ERROR_OK;
 }
 
-int xscale_update_vectors(target_t *target)
+static int xscale_update_vectors(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -886,10 +823,10 @@ int xscale_update_vectors(target_t *target)
                }
                else
                {
-                       retval=target_read_u32(target, 0xffff0000 + 4*i, &xscale->high_vectors[i]);
+                       retval = target_read_u32(target, 0xffff0000 + 4*i, &xscale->high_vectors[i]);
                        if (retval == ERROR_TARGET_TIMEOUT)
                                return retval;
-                       if (retval!=ERROR_OK)
+                       if (retval != ERROR_OK)
                        {
                                /* Some of these reads will fail as part of normal execution */
                                xscale->high_vectors[i] = ARMV4_5_B(0xfffffe, 0);
@@ -905,10 +842,10 @@ int xscale_update_vectors(target_t *target)
                }
                else
                {
-                       retval=target_read_u32(target, 0x0 + 4*i, &xscale->low_vectors[i]);
+                       retval = target_read_u32(target, 0x0 + 4*i, &xscale->low_vectors[i]);
                        if (retval == ERROR_TARGET_TIMEOUT)
                                return retval;
-                       if (retval!=ERROR_OK)
+                       if (retval != ERROR_OK)
                        {
                                /* Some of these reads will fail as part of normal execution */
                                xscale->low_vectors[i] = ARMV4_5_B(0xfffffe, 0);
@@ -927,23 +864,23 @@ 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;
 }
 
-int xscale_arch_state(struct target_s *target)
+static int xscale_arch_state(struct target_s *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
-       char *state[] =
+       static const char *state[] =
        {
                "disabled", "enabled"
        };
 
-       char *arch_dbg_reason[] =
+       static const char *arch_dbg_reason[] =
        {
                "", "\n(processor reset)", "\n(trace buffer full)"
        };
@@ -955,11 +892,11 @@ int xscale_arch_state(struct target_s *target)
        }
 
        LOG_USER("target halted in %s state due to %s, current mode: %s\n"
-                       "cpsr: 0x%8.8x pc: 0x%8.8x\n"
+                       "cpsr: 0x%8.8" PRIx32 " pc: 0x%8.8" PRIx32 "\n"
                        "MMU: %s, D-Cache: %s, I-Cache: %s"
                        "%s",
                         armv4_5_state_strings[armv4_5->core_state],
-                        Jim_Nvp_value2name_simple( nvp_target_debug_reason, target->debug_reason )->name ,
+                        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),
@@ -971,9 +908,9 @@ int xscale_arch_state(struct target_s *target)
        return ERROR_OK;
 }
 
-int xscale_poll(target_t *target)
+static int xscale_poll(target_t *target)
 {
-       int retval=ERROR_OK;
+       int retval = ERROR_OK;
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
@@ -1015,7 +952,7 @@ int xscale_poll(target_t *target)
        return retval;
 }
 
-int xscale_debug_entry(target_t *target)
+static int xscale_debug_entry(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -1028,24 +965,24 @@ int xscale_debug_entry(target_t *target)
 
        /* clear external dbg break (will be written on next DCSR read) */
        xscale->external_debug_break = 0;
-       if ((retval=xscale_read_dcsr(target))!=ERROR_OK)
+       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)
+       if ((retval = xscale_receive(target, buffer, 10)) != ERROR_OK)
                return retval;
 
        /* move r0 from buffer to register cache */
        buf_set_u32(armv4_5->core_cache->reg_list[0].value, 0, 32, buffer[0]);
-       armv4_5->core_cache->reg_list[15].dirty = 1;
-       armv4_5->core_cache->reg_list[15].valid = 1;
-       LOG_DEBUG("r0: 0x%8.8x", buffer[0]);
+       armv4_5->core_cache->reg_list[0].dirty = 1;
+       armv4_5->core_cache->reg_list[0].valid = 1;
+       LOG_DEBUG("r0: 0x%8.8" PRIx32 "", buffer[0]);
 
        /* move pc from buffer to register cache */
        buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, buffer[1]);
        armv4_5->core_cache->reg_list[15].dirty = 1;
        armv4_5->core_cache->reg_list[15].valid = 1;
-       LOG_DEBUG("pc: 0x%8.8x", buffer[1]);
+       LOG_DEBUG("pc: 0x%8.8" PRIx32 "", buffer[1]);
 
        /* move data from buffer to register cache */
        for (i = 1; i <= 7; i++)
@@ -1053,13 +990,13 @@ int xscale_debug_entry(target_t *target)
                buf_set_u32(armv4_5->core_cache->reg_list[i].value, 0, 32, buffer[1 + i]);
                armv4_5->core_cache->reg_list[i].dirty = 1;
                armv4_5->core_cache->reg_list[i].valid = 1;
-               LOG_DEBUG("r%i: 0x%8.8x", i, buffer[i + 1]);
+               LOG_DEBUG("r%i: 0x%8.8" PRIx32 "", i, buffer[i + 1]);
        }
 
        buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32, buffer[9]);
        armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 1;
        armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
-       LOG_DEBUG("cpsr: 0x%8.8x", buffer[9]);
+       LOG_DEBUG("cpsr: 0x%8.8" PRIx32 "", buffer[9]);
 
        armv4_5->core_mode = buffer[9] & 0x1f;
        if (armv4_5_mode_to_number(armv4_5->core_mode) == -1)
@@ -1145,7 +1082,7 @@ int xscale_debug_entry(target_t *target)
                        xscale->arch_debug_reason = XSCALE_DBG_REASON_TB_FULL;
                        pc -= 4;
                        break;
-               case 0x7: /* Reserved */
+               case 0x7: /* Reserved (may flag Hot-Debug support) */
                default:
                        LOG_ERROR("Method of Entry is 'Reserved'");
                        exit(-1);
@@ -1196,13 +1133,13 @@ int xscale_debug_entry(target_t *target)
        return ERROR_OK;
 }
 
-int xscale_halt(target_t *target)
+static 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",
-                 Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name);
+                 target_state_name(target));
 
        if (target->state == TARGET_HALTED)
        {
@@ -1231,7 +1168,7 @@ int xscale_halt(target_t *target)
        return ERROR_OK;
 }
 
-int xscale_enable_single_step(struct target_s *target, uint32_t next_pc)
+static int xscale_enable_single_step(struct target_s *target, uint32_t next_pc)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale= armv4_5->arch_info;
@@ -1253,26 +1190,52 @@ int xscale_enable_single_step(struct target_s *target, uint32_t next_pc)
                }
        }
 
-       if ((retval=xscale_set_reg_u32(ibcr0, next_pc | 0x1))!=ERROR_OK)
+       if ((retval = xscale_set_reg_u32(ibcr0, next_pc | 0x1)) != ERROR_OK)
                return retval;
 
        return ERROR_OK;
 }
 
-int xscale_disable_single_step(struct target_s *target)
+static 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;
 
-       if ((retval=xscale_set_reg_u32(ibcr0, 0x0))!=ERROR_OK)
+       if ((retval = xscale_set_reg_u32(ibcr0, 0x0)) != ERROR_OK)
                return retval;
 
        return ERROR_OK;
 }
 
-int xscale_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
+static void xscale_enable_watchpoints(struct target_s *target)
+{
+       watchpoint_t *watchpoint = target->watchpoints;
+
+       while (watchpoint)
+       {
+               if (watchpoint->set == 0)
+                       xscale_set_watchpoint(target, watchpoint);
+               watchpoint = watchpoint->next;
+       }
+}
+
+static void xscale_enable_breakpoints(struct target_s *target)
+{
+       breakpoint_t *breakpoint = target->breakpoints;
+
+       /* set any pending breakpoints */
+       while (breakpoint)
+       {
+               if (breakpoint->set == 0)
+                       xscale_set_breakpoint(target, breakpoint);
+               breakpoint = breakpoint->next;
+       }
+}
+
+static int xscale_resume(struct target_s *target, int current,
+               uint32_t address, int handle_breakpoints, int debug_execution)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale= armv4_5->arch_info;
@@ -1297,7 +1260,7 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
        }
 
        /* update vector tables */
-       if ((retval=xscale_update_vectors(target))!=ERROR_OK)
+       if ((retval = xscale_update_vectors(target)) != ERROR_OK)
                return retval;
 
        /* current = 1: continue on current pc, otherwise continue at <address> */
@@ -1321,7 +1284,7 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
                        uint32_t next_pc;
 
                        /* there's a breakpoint at the current PC, we have to step over it */
-                       LOG_DEBUG("unset breakpoint at 0x%8.8x", breakpoint->address);
+                       LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 "", breakpoint->address);
                        xscale_unset_breakpoint(target, breakpoint);
 
                        /* calculate PC of next instruction */
@@ -1329,7 +1292,7 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
                        {
                                uint32_t current_opcode;
                                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);
+                               LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8" PRIx32 "", current_opcode);
                        }
 
                        LOG_DEBUG("enable single-step");
@@ -1350,18 +1313,18 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
 
                        /* send CPSR */
                        xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
-                       LOG_DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+                       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", 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));
-                               LOG_DEBUG("writing r%i with value 0x%8.8x", i, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32));
+                               LOG_DEBUG("writing r%i with value 0x%8.8" PRIx32 "", 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));
-                       LOG_DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
+                       LOG_DEBUG("writing PC with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
 
                        /* wait for and process debug entry */
                        xscale_debug_entry(target);
@@ -1369,7 +1332,7 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
                        LOG_DEBUG("disable single-step");
                        xscale_disable_single_step(target);
 
-                       LOG_DEBUG("set breakpoint at 0x%8.8x", breakpoint->address);
+                       LOG_DEBUG("set breakpoint at 0x%8.8" PRIx32 "", breakpoint->address);
                        xscale_set_breakpoint(target, breakpoint);
                }
        }
@@ -1393,18 +1356,18 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
 
        /* send CPSR */
        xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
-       LOG_DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", 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));
-               LOG_DEBUG("writing r%i with value 0x%8.8x", i, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32));
+               LOG_DEBUG("writing r%i with value 0x%8.8" PRIx32 "", 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));
-       LOG_DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
+       LOG_DEBUG("writing PC with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
 
        target->debug_reason = DBG_REASON_NOTHALTED;
 
@@ -1428,7 +1391,8 @@ int xscale_resume(struct target_s *target, int current, uint32_t address, int ha
        return ERROR_OK;
 }
 
-static int xscale_step_inner(struct target_s *target, int current, uint32_t address, int handle_breakpoints)
+static int xscale_step_inner(struct target_s *target, int current,
+               uint32_t address, int handle_breakpoints)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -1446,61 +1410,61 @@ static int xscale_step_inner(struct target_s *target, int current, uint32_t addr
                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);
+               LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8" PRIx32 "", current_opcode);
                return retval;
        }
 
        LOG_DEBUG("enable single-step");
-       if ((retval=xscale_enable_single_step(target, next_pc))!=ERROR_OK)
+       if ((retval = xscale_enable_single_step(target, next_pc)) != ERROR_OK)
                return retval;
 
        /* restore banked registers */
-       if ((retval=xscale_restore_context(target))!=ERROR_OK)
+       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)
        {
-               if ((retval=xscale_send_u32(target, 0x62))!=ERROR_OK)
+               if ((retval = xscale_send_u32(target, 0x62)) != ERROR_OK)
                        return retval;
-               if ((retval=xscale_send_u32(target, 0x31))!=ERROR_OK)
+               if ((retval = xscale_send_u32(target, 0x31)) != ERROR_OK)
                        return retval;
        }
        else
-               if ((retval=xscale_send_u32(target, 0x30))!=ERROR_OK)
+               if ((retval = xscale_send_u32(target, 0x30)) != ERROR_OK)
                        return retval;
 
        /* send CPSR */
-       if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32)))!=ERROR_OK)
+       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));
+       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
 
        for (i = 7; i >= 0; i--)
        {
                /* send register */
-               if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32)))!=ERROR_OK)
+               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));
+               LOG_DEBUG("writing r%i with value 0x%8.8" PRIx32 "", i, buf_get_u32(armv4_5->core_cache->reg_list[i].value, 0, 32));
        }
 
        /* send PC */
-       if ((retval=xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32)))!=ERROR_OK)
+       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));
+       LOG_DEBUG("writing PC with value 0x%8.8" PRIx32, 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 */
-       if ((retval=armv4_5_invalidate_core_regs(target))!=ERROR_OK)
+       if ((retval = armv4_5_invalidate_core_regs(target)) != ERROR_OK)
                return retval;
 
        /* wait for and process debug entry */
-       if ((retval=xscale_debug_entry(target))!=ERROR_OK)
+       if ((retval = xscale_debug_entry(target)) != ERROR_OK)
                return retval;
 
        LOG_DEBUG("disable single-step");
-       if ((retval=xscale_disable_single_step(target))!=ERROR_OK)
+       if ((retval = xscale_disable_single_step(target)) != ERROR_OK)
                return retval;
 
        target_call_event_callbacks(target, TARGET_EVENT_HALTED);
@@ -1508,7 +1472,8 @@ static int xscale_step_inner(struct target_s *target, int current, uint32_t addr
        return ERROR_OK;
 }
 
-int xscale_step(struct target_s *target, int current, uint32_t address, int handle_breakpoints)
+static int xscale_step(struct target_s *target, int current,
+               uint32_t address, int handle_breakpoints)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        breakpoint_t *breakpoint = target->breakpoints;
@@ -1531,7 +1496,7 @@ int xscale_step(struct target_s *target, int current, uint32_t address, int hand
        /* 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)
+               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);
 
@@ -1545,7 +1510,7 @@ int xscale_step(struct target_s *target, int current, uint32_t address, int hand
        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)
+                       if ((retval = xscale_unset_breakpoint(target, breakpoint)) != ERROR_OK)
                                return retval;
                }
 
@@ -1562,13 +1527,13 @@ int xscale_step(struct target_s *target, int current, uint32_t address, int hand
 
 }
 
-int xscale_assert_reset(target_t *target)
+static 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",
-                 Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name);
+                 target_state_name(target));
 
        /* select DCSR instruction (set endstate to R-T-I to ensure we don't
         * end up in T-L-R, which would reset JTAG
@@ -1597,14 +1562,14 @@ int xscale_assert_reset(target_t *target)
     if (target->reset_halt)
     {
        int retval;
-               if ((retval = target_halt(target))!=ERROR_OK)
+               if ((retval = target_halt(target)) != ERROR_OK)
                        return retval;
     }
 
        return ERROR_OK;
 }
 
-int xscale_deassert_reset(target_t *target)
+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;
@@ -1692,23 +1657,23 @@ int xscale_deassert_reset(target_t *target)
                                cache_line[i / 4] = le_to_h_u32(&buffer[i]);
                        }
 
-                       for (; buf_cnt < 32; buf_cnt += 4)
+                       for (; i < 32; i += 4)
                        {
-                               cache_line[buf_cnt / 4] = 0xe1a08008;
+                               cache_line[i / 4] = 0xe1a08008;
                        }
 
                        /* only load addresses other than the reset vectors */
                        if ((address % 0x400) != 0x0)
                        {
-                               xscale_load_ic(target, 1, address, cache_line);
+                               xscale_load_ic(target, address, cache_line);
                        }
 
                        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);
+               xscale_load_ic(target, 0x0, xscale->low_vectors);
+               xscale_load_ic(target, 0xffff0000, xscale->high_vectors);
 
                jtag_add_runtest(30, jtag_set_end_state(TAP_IDLE));
 
@@ -1745,23 +1710,21 @@ int xscale_deassert_reset(target_t *target)
        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)
+static int xscale_read_core_reg(struct target_s *target, int num,
+               enum armv4_5_mode mode)
 {
+       LOG_ERROR("not implemented");
        return ERROR_OK;
 }
 
-int xscale_write_core_reg(struct target_s *target, int num, enum armv4_5_mode mode, uint32_t value)
+static int xscale_write_core_reg(struct target_s *target, int num,
+               enum armv4_5_mode mode, uint32_t value)
 {
-
+       LOG_ERROR("not implemented");
        return ERROR_OK;
 }
 
-int xscale_full_context(target_t *target)
+static int xscale_full_context(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
 
@@ -1783,7 +1746,7 @@ int xscale_full_context(target_t *target)
         * we can't enter User mode on an XScale (unpredictable),
         * but User shares registers with SYS
         */
-       for(i = 1; i < 7; i++)
+       for (i = 1; i < 7; i++)
        {
                int valid = 1;
 
@@ -1837,14 +1800,12 @@ int xscale_full_context(target_t *target)
        return ERROR_OK;
 }
 
-int xscale_restore_context(target_t *target)
+static int xscale_restore_context(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
 
        int i, j;
 
-       LOG_DEBUG("-");
-
        if (target->state != TARGET_HALTED)
        {
                LOG_WARNING("target not halted");
@@ -1855,7 +1816,7 @@ int xscale_restore_context(target_t *target)
        * we can't enter User mode on an XScale (unpredictable),
        * but User shares registers with SYS
        */
-       for(i = 1; i < 7; i++)
+       for (i = 1; i < 7; i++)
        {
                int dirty = 0;
 
@@ -1906,7 +1867,8 @@ int xscale_restore_context(target_t *target)
        return ERROR_OK;
 }
 
-int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+static int xscale_read_memory(struct target_s *target, uint32_t address,
+               uint32_t size, uint32_t count, uint8_t *buffer)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -1914,7 +1876,7 @@ int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size,
        uint32_t i;
        int retval;
 
-       LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
+       LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32, address, size, count);
 
        if (target->state != TARGET_HALTED)
        {
@@ -1930,20 +1892,20 @@ int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size,
                return ERROR_TARGET_UNALIGNED_ACCESS;
 
        /* send memory read request (command 0x1n, n: access size) */
-       if ((retval=xscale_send_u32(target, 0x10 | size))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, 0x10 | size)) != ERROR_OK)
                return retval;
 
        /* send base address for read request */
-       if ((retval=xscale_send_u32(target, address))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, address)) != ERROR_OK)
                return retval;
 
        /* send number of requested data words */
-       if ((retval=xscale_send_u32(target, count))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, count)) != ERROR_OK)
                return retval;
 
        /* receive data from target (count times 32-bit words in host endianness) */
        buf32 = malloc(4 * count);
-       if ((retval=xscale_receive(target, buf32, count))!=ERROR_OK)
+       if ((retval = xscale_receive(target, buf32, count)) != ERROR_OK)
                return retval;
 
        /* extract data from host-endian buffer into byte stream */
@@ -1971,12 +1933,12 @@ int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size,
        free(buf32);
 
        /* examine DCSR, to see if Sticky Abort (SA) got set */
-       if ((retval=xscale_read_dcsr(target))!=ERROR_OK)
+       if ((retval = xscale_read_dcsr(target)) != ERROR_OK)
                return retval;
        if (buf_get_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 5, 1) == 1)
        {
                /* clear SA bit */
-               if ((retval=xscale_send_u32(target, 0x60))!=ERROR_OK)
+               if ((retval = xscale_send_u32(target, 0x60)) != ERROR_OK)
                        return retval;
 
                return ERROR_TARGET_DATA_ABORT;
@@ -1985,13 +1947,14 @@ int xscale_read_memory(struct target_s *target, uint32_t address, uint32_t size,
        return ERROR_OK;
 }
 
-int xscale_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+static int xscale_write_memory(struct target_s *target, uint32_t address,
+               uint32_t size, uint32_t count, uint8_t *buffer)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
        int retval;
 
-       LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
+       LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32, address, size, count);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2007,15 +1970,15 @@ int xscale_write_memory(struct target_s *target, uint32_t address, uint32_t size
                return ERROR_TARGET_UNALIGNED_ACCESS;
 
        /* send memory write request (command 0x2n, n: access size) */
-       if ((retval=xscale_send_u32(target, 0x20 | size))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, 0x20 | size)) != ERROR_OK)
                return retval;
 
        /* send base address for read request */
-       if ((retval=xscale_send_u32(target, address))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, address)) != ERROR_OK)
                return retval;
 
        /* send number of requested data words to be written*/
-       if ((retval=xscale_send_u32(target, count))!=ERROR_OK)
+       if ((retval = xscale_send_u32(target, count)) != ERROR_OK)
                return retval;
 
        /* extract data from host-endian buffer into byte stream */
@@ -2045,16 +2008,16 @@ int xscale_write_memory(struct target_s *target, uint32_t address, uint32_t size
                }
        }
 #endif
-       if ((retval=xscale_send(target, buffer, count, size))!=ERROR_OK)
+       if ((retval = xscale_send(target, buffer, count, size)) != ERROR_OK)
                return retval;
 
        /* examine DCSR, to see if Sticky Abort (SA) got set */
-       if ((retval=xscale_read_dcsr(target))!=ERROR_OK)
+       if ((retval = xscale_read_dcsr(target)) != ERROR_OK)
                return retval;
        if (buf_get_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 5, 1) == 1)
        {
                /* clear SA bit */
-               if ((retval=xscale_send_u32(target, 0x60))!=ERROR_OK)
+               if ((retval = xscale_send_u32(target, 0x60)) != ERROR_OK)
                        return retval;
 
                return ERROR_TARGET_DATA_ABORT;
@@ -2063,12 +2026,13 @@ int xscale_write_memory(struct target_s *target, uint32_t address, uint32_t size
        return ERROR_OK;
 }
 
-int xscale_bulk_write_memory(target_t *target, uint32_t address, uint32_t count, uint8_t *buffer)
+static int xscale_bulk_write_memory(target_t *target, uint32_t address,
+               uint32_t count, uint8_t *buffer)
 {
        return xscale_write_memory(target, address, 4, count, buffer);
 }
 
-uint32_t xscale_get_ttb(target_t *target)
+static uint32_t xscale_get_ttb(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2080,7 +2044,8 @@ uint32_t xscale_get_ttb(target_t *target)
        return ttb;
 }
 
-void xscale_disable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_cache)
+static void xscale_disable_mmu_caches(target_t *target, int mmu,
+               int d_u_cache, int i_cache)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2119,7 +2084,8 @@ void xscale_disable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_c
        xscale_send_u32(target, 0x53);
 }
 
-void xscale_enable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_cache)
+static void xscale_enable_mmu_caches(target_t *target, int mmu,
+               int d_u_cache, int i_cache)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2145,7 +2111,8 @@ void xscale_enable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_ca
        xscale_send_u32(target, 0x53);
 }
 
-int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int xscale_set_breakpoint(struct target_s *target,
+               breakpoint_t *breakpoint)
 {
        int retval;
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2189,12 +2156,12 @@ int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                if (breakpoint->length == 4)
                {
                        /* keep the original instruction in target endianness */
-                       if((retval = target_read_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       if ((retval = target_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) */
-                       if((retval = target_write_u32(target, breakpoint->address, xscale->arm_bkpt)) != ERROR_OK)
+                       if ((retval = target_write_u32(target, breakpoint->address, xscale->arm_bkpt)) != ERROR_OK)
                        {
                                return retval;
                        }
@@ -2202,12 +2169,12 @@ int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                else
                {
                        /* keep the original instruction in target endianness */
-                       if((retval = target_read_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       if ((retval = target_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) */
-                       if((retval = target_write_u32(target, breakpoint->address, xscale->thumb_bkpt)) != ERROR_OK)
+                       if ((retval = target_write_u32(target, breakpoint->address, xscale->thumb_bkpt)) != ERROR_OK)
                        {
                                return retval;
                        }
@@ -2218,7 +2185,8 @@ int xscale_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int xscale_add_breakpoint(struct target_s *target,
+               breakpoint_t *breakpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2249,7 +2217,8 @@ int xscale_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int xscale_unset_breakpoint(struct target_s *target,
+               breakpoint_t *breakpoint)
 {
        int retval;
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2286,14 +2255,14 @@ int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                /* restore original instruction (kept in target endianness) */
                if (breakpoint->length == 4)
                {
-                       if((retval = target_write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       if ((retval = target_write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr)) != ERROR_OK)
                        {
                                return retval;
                        }
                }
                else
                {
-                       if((retval = target_write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr)) != ERROR_OK)
+                       if ((retval = target_write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr)) != ERROR_OK)
                        {
                                return retval;
                        }
@@ -2304,7 +2273,7 @@ int xscale_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2326,11 +2295,12 @@ int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int xscale_set_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
+static int xscale_set_watchpoint(struct target_s *target,
+               watchpoint_t *watchpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-       uint8_t enable=0;
+       uint8_t enable = 0;
        reg_t *dbcon = &xscale->reg_cache->reg_list[XSCALE_DBCON];
        uint32_t dbcon_value = buf_get_u32(dbcon->value, 0, 32);
 
@@ -2382,7 +2352,8 @@ int xscale_set_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
        return ERROR_OK;
 }
 
-int xscale_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
+static int xscale_add_watchpoint(struct target_s *target,
+               watchpoint_t *watchpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2408,7 +2379,8 @@ int xscale_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
        return ERROR_OK;
 }
 
-int xscale_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
+static int xscale_unset_watchpoint(struct target_s *target,
+               watchpoint_t *watchpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2444,7 +2416,7 @@ int xscale_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
        return ERROR_OK;
 }
 
-int xscale_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
+static int xscale_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
@@ -2465,32 +2437,7 @@ int xscale_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
        return ERROR_OK;
 }
 
-void xscale_enable_watchpoints(struct target_s *target)
-{
-       watchpoint_t *watchpoint = target->watchpoints;
-
-       while (watchpoint)
-       {
-               if (watchpoint->set == 0)
-                       xscale_set_watchpoint(target, watchpoint);
-               watchpoint = watchpoint->next;
-       }
-}
-
-void xscale_enable_breakpoints(struct target_s *target)
-{
-       breakpoint_t *breakpoint = target->breakpoints;
-
-       /* set any pending breakpoints */
-       while (breakpoint)
-       {
-               if (breakpoint->set == 0)
-                       xscale_set_breakpoint(target, breakpoint);
-               breakpoint = breakpoint->next;
-       }
-}
-
-int xscale_get_reg(reg_t *reg)
+static int xscale_get_reg(reg_t *reg)
 {
        xscale_reg_t *arch_info = reg->arch_info;
        target_t *target = arch_info->target;
@@ -2536,7 +2483,7 @@ int xscale_get_reg(reg_t *reg)
        return ERROR_OK;
 }
 
-int xscale_set_reg(reg_t *reg, uint8_t* buf)
+static int xscale_set_reg(reg_t *reg, uint8_t* buf)
 {
        xscale_reg_t *arch_info = reg->arch_info;
        target_t *target = arch_info->target;
@@ -2581,17 +2528,7 @@ int xscale_set_reg(reg_t *reg, uint8_t* buf)
        return ERROR_OK;
 }
 
-/* convenience wrapper to access XScale specific registers */
-int xscale_set_reg_u32(reg_t *reg, uint32_t value)
-{
-       uint8_t buf[4];
-
-       buf_set_u32(buf, 0, 32, value);
-
-       return xscale_set_reg(reg, buf);
-}
-
-int xscale_write_dcsr_sw(target_t *target, uint32_t value)
+static int xscale_write_dcsr_sw(target_t *target, uint32_t value)
 {
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2612,7 +2549,7 @@ int xscale_write_dcsr_sw(target_t *target, uint32_t value)
        return ERROR_OK;
 }
 
-int xscale_read_trace(target_t *target)
+static int xscale_read_trace(target_t *target)
 {
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2691,7 +2628,8 @@ int xscale_read_trace(target_t *target)
        return ERROR_OK;
 }
 
-int xscale_read_instruction(target_t *target, arm_instruction_t *instruction)
+static int xscale_read_instruction(target_t *target,
+               arm_instruction_t *instruction)
 {
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2757,7 +2695,8 @@ int xscale_read_instruction(target_t *target, arm_instruction_t *instruction)
        return ERROR_OK;
 }
 
-int xscale_branch_address(xscale_trace_data_t *trace_data, int i, uint32_t *target)
+static int xscale_branch_address(xscale_trace_data_t *trace_data,
+               int i, uint32_t *target)
 {
        /* if there are less than four entries prior to the indirect branch message
         * we can't extract the address */
@@ -2772,7 +2711,7 @@ int xscale_branch_address(xscale_trace_data_t *trace_data, int i, uint32_t *targ
        return 0;
 }
 
-int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
+static int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
 {
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -2961,7 +2900,7 @@ int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
        return ERROR_OK;
 }
 
-void xscale_build_reg_cache(target_t *target)
+static void xscale_build_reg_cache(target_t *target)
 {
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -3006,17 +2945,20 @@ void xscale_build_reg_cache(target_t *target)
        xscale->reg_cache = (*cache_p);
 }
 
-int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
+static int xscale_init_target(struct command_context_s *cmd_ctx,
+               struct target_s *target)
 {
        return ERROR_OK;
 }
 
-int xscale_quit(void)
+static int xscale_quit(void)
 {
+       jtag_add_runtest(100, TAP_RESET);
        return ERROR_OK;
 }
 
-int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, jtag_tap_t *tap, const char *variant)
+static 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;
        uint32_t high_reset_branch, low_reset_branch;
@@ -3125,7 +3067,7 @@ int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, jtag_tap_t
 }
 
 /* target xscale <endianess> <startup_mode> <chain_pos> <variant> */
-int xscale_target_create(struct target_s *target, Jim_Interp *interp)
+static int xscale_target_create(struct target_s *target, Jim_Interp *interp)
 {
        xscale_common_t *xscale = calloc(1,sizeof(xscale_common_t));
 
@@ -3135,7 +3077,9 @@ int xscale_target_create(struct target_s *target, Jim_Interp *interp)
        return ERROR_OK;
 }
 
-int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = NULL;
        armv4_5_common_t *armv4_5;
@@ -3176,7 +3120,9 @@ int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char
        return ERROR_OK;
 }
 
-int xscale_handle_cache_clean_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+xscale_handle_cache_clean_address_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = NULL;
        armv4_5_common_t *armv4_5;
@@ -3215,7 +3161,9 @@ int xscale_handle_cache_clean_address_command(struct command_context_s *cmd_ctx,
        return ERROR_OK;
 }
 
-int xscale_handle_cache_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+xscale_handle_cache_info_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;
@@ -3229,7 +3177,8 @@ int xscale_handle_cache_info_command(struct command_context_s *cmd_ctx, char *cm
        return armv4_5_handle_cache_info_command(cmd_ctx, &xscale->armv4_5_mmu.armv4_5_cache);
 }
 
-static int xscale_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical)
+static int xscale_virt2phys(struct target_s *target,
+               uint32_t virtual, uint32_t *physical)
 {
        armv4_5_common_t *armv4_5;
        xscale_common_t *xscale;
@@ -3266,7 +3215,8 @@ 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)
+static int xscale_handle_mmu_command(command_context_t *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
        armv4_5_common_t *armv4_5;
@@ -3302,7 +3252,8 @@ int xscale_handle_mmu_command(command_context_t *cmd_ctx, char *cmd, char **args
        return ERROR_OK;
 }
 
-int xscale_handle_idcache_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
+static int xscale_handle_idcache_command(command_context_t *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
        armv4_5_common_t *armv4_5;
@@ -3356,7 +3307,8 @@ int xscale_handle_idcache_command(command_context_t *cmd_ctx, char *cmd, char **
        return ERROR_OK;
 }
 
-int xscale_handle_vector_catch_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
+static int xscale_handle_vector_catch_command(command_context_t *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
        armv4_5_common_t *armv4_5;
@@ -3384,7 +3336,69 @@ int xscale_handle_vector_catch_command(command_context_t *cmd_ctx, char *cmd, ch
 }
 
 
-int xscale_handle_trace_buffer_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int xscale_handle_vector_table_command(command_context_t *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;
+       int err = 0;
+
+       if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK)
+       {
+               return ERROR_OK;
+       }
+
+       if (argc == 0) /* print current settings */
+       {
+               int idx;
+
+               command_print(cmd_ctx, "active user-set static vectors:");
+               for (idx = 1; idx < 8; idx++)
+                       if (xscale->static_low_vectors_set & (1 << idx))
+                               command_print(cmd_ctx, "low  %d: 0x%" PRIx32, idx, xscale->static_low_vectors[idx]);
+               for (idx = 1; idx < 8; idx++)
+                       if (xscale->static_high_vectors_set & (1 << idx))
+                               command_print(cmd_ctx, "high %d: 0x%" PRIx32, idx, xscale->static_high_vectors[idx]);
+               return ERROR_OK;
+       }
+
+       if (argc != 3)
+               err = 1;
+       else
+       {
+               int idx;
+               uint32_t vec;
+               idx = strtoul(args[1], NULL, 0);
+               vec = strtoul(args[2], NULL, 0);
+
+               if (idx < 1 || idx >= 8)
+                       err = 1;
+
+               if (!err && strcmp(args[0], "low") == 0)
+               {
+                       xscale->static_low_vectors_set |= (1<<idx);
+                       xscale->static_low_vectors[idx] = vec;
+               }
+               else if (!err && (strcmp(args[0], "high") == 0))
+               {
+                       xscale->static_high_vectors_set |= (1<<idx);
+                       xscale->static_high_vectors[idx] = vec;
+               }
+               else
+                       err = 1;
+       }
+
+       if (err)
+               command_print(cmd_ctx, "usage: xscale vector_table <high|low> <index> <code>");
+
+       return ERROR_OK;
+}
+
+
+static int
+xscale_handle_trace_buffer_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;
@@ -3463,7 +3477,9 @@ int xscale_handle_trace_buffer_command(struct command_context_s *cmd_ctx, char *
        return ERROR_OK;
 }
 
-int xscale_handle_trace_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+xscale_handle_trace_image_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target;
        armv4_5_common_t *armv4_5;
@@ -3514,7 +3530,8 @@ int xscale_handle_trace_image_command(struct command_context_s *cmd_ctx, char *c
        return ERROR_OK;
 }
 
-int xscale_handle_dump_trace_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int xscale_handle_dump_trace_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;
@@ -3572,7 +3589,9 @@ int xscale_handle_dump_trace_command(struct command_context_s *cmd_ctx, char *cm
        return ERROR_OK;
 }
 
-int xscale_handle_analyze_trace_buffer_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+xscale_handle_analyze_trace_buffer_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;
@@ -3588,7 +3607,8 @@ int xscale_handle_analyze_trace_buffer_command(struct command_context_s *cmd_ctx
        return ERROR_OK;
 }
 
-int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
+static int xscale_handle_cp15(command_context_t *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
        armv4_5_common_t *armv4_5;
@@ -3606,11 +3626,11 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
        }
        uint32_t reg_no = 0;
        reg_t *reg = NULL;
-       if(argc > 0)
+       if (argc > 0)
        {
                reg_no = strtoul(args[0], NULL, 0);
                /*translate from xscale cp15 register no to openocd register*/
-               switch(reg_no)
+               switch (reg_no)
                {
                case 0:
                        reg_no = XSCALE_MAINID;
@@ -3643,16 +3663,16 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
                reg = &xscale->reg_cache->reg_list[reg_no];
 
        }
-       if(argc == 1)
+       if (argc == 1)
        {
                uint32_t 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);
+               command_print(cmd_ctx, "%s (/%i): 0x%" PRIx32 "", reg->name, (int)(reg->size), value);
        }
-       else if(argc == 2)
+       else if (argc == 2)
        {
 
                uint32_t value = strtoul(args[1], NULL, 0);
@@ -3677,7 +3697,7 @@ int xscale_handle_cp15(command_context_t *cmd_ctx, char *cmd, char **args, int a
        return ERROR_OK;
 }
 
-int xscale_register_commands(struct command_context_s *cmd_ctx)
+static int xscale_register_commands(struct command_context_s *cmd_ctx)
 {
        command_t *xscale_cmd;
 
@@ -3692,8 +3712,9 @@ int xscale_register_commands(struct command_context_s *cmd_ctx)
        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_vector_catch_command, COMMAND_EXEC, "<mask> of vectors that should be catched");
+       register_command(cmd_ctx, xscale_cmd, "vector_table", xscale_handle_vector_table_command, COMMAND_EXEC, "<high|low> <index> <code> set static code for exception handler entry");
 
-       register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable|disable> ['fill' [n]|'wrap']");
+       register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable | disable> ['fill' [n]|'wrap']");
 
        register_command(cmd_ctx, xscale_cmd, "dump_trace", xscale_handle_dump_trace_command, COMMAND_EXEC, "dump content of trace buffer to <file>");
        register_command(cmd_ctx, xscale_cmd, "analyze_trace", xscale_handle_analyze_trace_buffer_command, COMMAND_EXEC, "analyze content of trace buffer");
@@ -3706,3 +3727,44 @@ int xscale_register_commands(struct command_context_s *cmd_ctx)
 
        return ERROR_OK;
 }
+
+target_type_t xscale_target =
+{
+       .name = "xscale",
+
+       .poll = xscale_poll,
+       .arch_state = xscale_arch_state,
+
+       .target_request_data = NULL,
+
+       .halt = xscale_halt,
+       .resume = xscale_resume,
+       .step = xscale_step,
+
+       .assert_reset = xscale_assert_reset,
+       .deassert_reset = xscale_deassert_reset,
+       .soft_reset_halt = NULL,
+
+       .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
+
+       .read_memory = xscale_read_memory,
+       .write_memory = xscale_write_memory,
+       .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,
+       .remove_breakpoint = xscale_remove_breakpoint,
+       .add_watchpoint = xscale_add_watchpoint,
+       .remove_watchpoint = xscale_remove_watchpoint,
+
+       .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)