xscale minor cleanup
[openocd.git] / src / target / xscale.c
index 7de1d84401955ccb836cad6974ef58250bee8ff9..b46b621e4ef4b363ba0a60fd2232feef7103a97c 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"
 
+
+/*
+ * 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.
+ */
+
 /* cli handling */
 int xscale_register_commands(struct command_context_s *cmd_ctx);
 
@@ -50,7 +73,6 @@ 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);
 
@@ -89,7 +111,7 @@ target_type_t xscale_target =
 
        .assert_reset = xscale_assert_reset,
        .deassert_reset = xscale_deassert_reset,
-       .soft_reset_halt = xscale_soft_reset_halt,
+       .soft_reset_halt = NULL,
 
        .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
 
@@ -115,7 +137,7 @@ target_type_t xscale_target =
        .mmu = xscale_mmu
 };
 
-char* xscale_reg_list[] =
+static char *const xscale_reg_list[] =
 {
        "XSCALE_MAINID",                /* 0 */
        "XSCALE_CACHETYPE",
@@ -141,7 +163,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,7 +189,7 @@ 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);
@@ -197,7 +219,7 @@ int xscale_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, xsc
 
 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)
@@ -255,7 +277,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 +285,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 +316,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)
 {
-       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 +372,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 +383,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 +407,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;
                        }
                }
@@ -455,7 +476,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 +500,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 +519,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 */
@@ -547,7 +567,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 +582,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 +599,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 */
@@ -719,7 +738,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 +746,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)
        {
@@ -784,23 +802,13 @@ 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());
 
        fields[0].num_bits = 32;
@@ -820,9 +828,7 @@ 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)
@@ -846,23 +852,13 @@ 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;
@@ -886,7 +882,7 @@ 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)
@@ -905,7 +901,7 @@ 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)
@@ -938,12 +934,12 @@ 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)"
        };
@@ -959,7 +955,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],
-                        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),
@@ -973,7 +969,7 @@ int xscale_arch_state(struct target_s *target)
 
 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;
 
@@ -1028,17 +1024,17 @@ 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;
+       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 */
@@ -1145,7 +1141,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);
@@ -1202,7 +1198,7 @@ int xscale_halt(target_t *target)
        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)
        {
@@ -1253,7 +1249,7 @@ 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;
@@ -1266,7 +1262,7 @@ int xscale_disable_single_step(struct target_s *target)
        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;
@@ -1297,7 +1293,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> */
@@ -1451,56 +1447,56 @@ static int xscale_step_inner(struct target_s *target, int current, uint32_t addr
        }
 
        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.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.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.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);
@@ -1531,7 +1527,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 +1541,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;
                }
 
@@ -1568,7 +1564,7 @@ int xscale_assert_reset(target_t *target)
        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
@@ -1745,11 +1741,6 @@ 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)
 {
        return ERROR_OK;
@@ -1930,20 +1921,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 +1962,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;
@@ -2007,15 +1998,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 +2036,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;
@@ -2330,7 +2321,7 @@ 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);
 
@@ -3384,6 +3375,65 @@ int xscale_handle_vector_catch_command(command_context_t *cmd_ctx, char *cmd, ch
 }
 
 
+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;
+}
+
+
 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);
@@ -3692,8 +3742,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");

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)